2016-01-19 2 views
0

J'ai lu le post sur les verrous distribués avec Redis au http://redis.io/topics/distlock. Il y a un script lua pour décrire comment faire "déverrouiller".Conditions de concurrence dans les verrous distribués avec Redis

if redis.call("get",KEYS[1]) == ARGV[1] then 
    return redis.call("del",KEYS[1]) 
else 
    return 0 
end 

Je pense qu'il ya une condition de course avec ce modèle:

  1. Client A acquiert le verrou avec 3 secondes d'expiration. SET key randomstring1 NX PX 3000
  2. Dormez 2,99 secondes.
  3. Le client A libère le verrou et appelle le code ci-dessus.
  4. La condition est vraie. if redis.call("get",KEYS[1]) == ARGV[1] then
  5. La clé d'origine expires
  6. client B acquiert Anthor verrouillage. SET key randomstring2 NX PX 3000
  7. Client A supprimer la clé.
  8. Le verrou du client B est supprimé par le client A!

Répondre

2

Non, il n'y a pas de condition de concurrence. Les scripts LUA s'exécutent de manière atomique. Cela signifie qu'aucune commande provenant d'autres connexions (clients) ne sera traitée avant que le script LUA ne finisse de fonctionner (même le cron interne de Redis qui traite réellement les éléments expirés).