Maison> base de données> Redis> le corps du texte

Comment Redis implémente la fonction de verrouillage distribué

王林
Libérer: 2023-11-07 15:28:55
original
771 Les gens l'ont consulté

Comment Redis implémente la fonction de verrouillage distribué

Comment Redis implémente la fonction de verrouillage distribué

Le verrouillage distribué est un mécanisme de synchronisation couramment utilisé dans les systèmes distribués. Il peut nous aider à obtenir une exclusion mutuelle des ressources partagées entre plusieurs processus ou plusieurs accès à des serveurs. En tant que middleware de cache et de file d'attente de messages hautes performances, Redis fournit également la fonction d'implémentation de verrous distribués. Cet article présentera comment Redis implémente les verrous distribués et fournira des exemples de code spécifiques.

  1. Verrouillage distribué implémenté sur la base de la commande SETNX

Redis fournit la commande SETNX, qui peut définir la valeur de la clé lorsque la clé n'existe pas. Si la clé existe déjà, l'exécution de la commande échoue. Nous pouvons utiliser la commande SETNX pour implémenter la fonction de verrouillage distribué.

Ce qui suit est un exemple de code pour un verrou distribué basé sur la commande SETNX :

import redis class RedisLock: def __init__(self, key, value, expire_time): self.redis = redis.Redis(host='localhost', port=6379, db=0) self.key = key self.value = value self.expire_time = expire_time def acquire(self): while True: result = self.redis.setnx(self.key, self.value) if result: self.redis.expire(self.key, self.expire_time) return True def release(self): self.redis.delete(self.key)
Copier après la connexion

Dans le code ci-dessus, nous définissons une classe RedisLock, qui a deux méthodes : acquérir et libérer. La méthode d'acquisition tente d'acquérir le verrou distribué et renvoie True si l'acquisition réussit ; la méthode release libère le verrou distribué.

Vous pouvez l'appeler ainsi lorsque vous utilisez :

lock = RedisLock('my_lock', '1', 10) if lock.acquire(): try: # 执行需要加锁的业务逻辑 ... finally: lock.release()
Copier après la connexion
  1. Verrou distribué basé sur la commande SET et le script Lua

L'implémentation ci-dessus basée sur la commande SETNX peut avoir des problèmes dans certains cas, par exemple lorsque le temps d'exécution de la logique métier est très longtemps, cela peut provoquer une défaillance du verrouillage. Afin de résoudre ce problème, nous pouvons utiliser le script Lua combiné à la commande SET pour implémenter le verrouillage distribué.

Ce qui suit est un exemple de code pour un verrou distribué basé sur la commande SET et le script Lua :

import redis class RedisLock: def __init__(self, key, value, expire_time): self.redis = redis.Redis(host='localhost', port=6379, db=0) self.key = key self.value = value self.expire_time = expire_time def acquire(self): script = ''' if redis.call("exists", KEYS[1]) == 0 then redis.call("set", KEYS[1], ARGV[1]) redis.call("expire", KEYS[1], tonumber(ARGV[2])) return 1 else return 0 end ''' result = self.redis.eval(script, 1, self.key, self.value, self.expire_time) return result == 1 def release(self): self.redis.delete(self.key)
Copier après la connexion

Dans le code ci-dessus, nous utilisons la méthode eval pour appeler le script Lua. Le script détermine s'il faut définir la valeur du. clé en jugeant si la clé existe et le délai d'expiration. De cette façon, même si l'exécution de la logique métier prend beaucoup de temps, le problème d'échec du verrouillage ne se produira pas.

La méthode d'utilisation est la même que l'implémentation ci-dessus basée sur la commande SETNX.

Résumé :

Cet article présente comment Redis implémente la fonction de verrouillage distribué et fournit des exemples de code basés sur les commandes SETNX et les commandes SET et les scripts Lua. Dans les applications pratiques, nous pouvons choisir une méthode de mise en œuvre appropriée pour implémenter des verrous distribués en fonction des besoins afin de garantir un accès mutuellement exclusif aux ressources partagées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!