Comment créer un verrou distribué avec Redis?

Sur le redis documentation, j'ai trouvé une primitive de verrouillage peuvent être mises en œuvre via SETNX:

http://redis.io/commands/setnx

  • C4 envoie SETNX de verrouillage.foo afin d'acquérir le verrou
  • S'est écrasé le client C3 tient toujours, alors Redis répondrons avec 0 à C4.
  • C4 envoie OBTENIR un verrou.foo pour vérifier si la serrure est expiré. Si elle ne l'est pas, il va dormir pendant un certain temps et recommencez depuis le début.
  • Au lieu de cela, si le verrou est expiré parce que le temps Unix à l'écluse.toto est plus vieux que le temps Unix courant, C4 tente d'effectuer:

    GETSET de verrouillage.foo

  • En raison de la GETSET sémantique, C4 pouvez vérifier si la vieille valeur stockée à clé est toujours une estampille expiré. Si elle l'est, la serrure a été acquis.
  • Si un autre client, par exemple C5, a été plus rapide que le C4 et les acquis de la serrure avec la GETSET opération, la C4 GETSET opération sera de retour non expiré timestamp. C4 simplement redémarrer à partir de la première étape. Notez que même si C4 mis la clé un peu quelques secondes dans l'avenir, ce n'est pas un problème.

Cependant, certains utilisateurs ont estimé, à l'aide d'un timestamp UNIX de l'expiration, le client et le serveur est temps d'être parfaitement synchronisés. Est-il une meilleure alternative à la création d'un mondial et de la distribution de verrouillage dans le Redis?

source d'informationauteur dyip1 | 2013-12-23