Maison  >  Article  >  base de données  >  Comment Redis implémente la fonction de verrouillage distribué

Comment Redis implémente la fonction de verrouillage distribué

王林
王林original
2023-11-07 15:28:55826parcourir

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)

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()
  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)

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!

Déclaration:
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