Maison > Article > base de données > 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.
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)
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()
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)
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!