Maison  >  Article  >  base de données  >  Comment utiliser Redis pour implémenter des verrous distribués

Comment utiliser Redis pour implémenter des verrous distribués

(*-*)浩
(*-*)浩original
2019-11-29 10:25:534428parcourir

Comment utiliser Redis pour implémenter des verrous distribués

Les verrous distribués peuvent en fait être compris comme : contrôler le système distribué pour exploiter les ressources partagées de manière ordonnée et maintenir la cohérence grâce à l'exclusion mutuelle.

Pour donner un exemple inapproprié : supposons que la ressource partagée soit une maison contenant divers livres, le système distribué est constitué des personnes qui veulent entrer dans la maison pour lire, et le verrou distribué garantit que le la maison n'a qu'une porte et une seule personne peut entrer à la fois, et la porte n'a qu'une seule clé. (Apprentissage recommandé : Tutoriel vidéo Redis)

Utiliser Redis pour implémenter des verrous distribués                                                                                   -lock-time implémente le verrouillage

Utiliser la commande redis EVAL pour implémenter le déverrouillage

Verrouillage :

Jedis jedis = new Jedis("127.0.0.1", 6379);
 
 private static final String SUCCESS = "OK";
 
 /**
 
  * 加锁操作
 
  * @param key 锁标识
 
  * @param value 客户端标识
 
  * @param timeOut 过期时间
 
  */
 
 public Boolean lock(String key,String value,Long timeOut){
 
     String var1 = jedis.set(key,value,"NX","EX",timeOut);
 
     if(LOCK_SUCCESS.equals(var1)){
 
         return true;
 
     }
 
     return false;
 
 }

Interprétation :

Opération de verrouillage : jedis.set(key , value, "NX", "EX", timeOut) [Opération atomique pour assurer le verrouillage] La clé est la valeur clé de redis comme identification du verrou, et la valeur est utilisée comme identification de le client ici. Ce n'est que lorsque la clé-valeur correspond que vous pouvez avoir le droit de supprimer le verrou [Sécurité garantie]

Il est garanti que le réglage du délai d'expiration via timeOut ne se produira pas. Un blocage se produira [Éviter un blocage]

Que signifient NX, EX ?

NX : L'opération ne sera effectuée que lorsque la clé n'existe pas, si elle n'existe pas EX : Définissez le délai d'expiration de la clé en secondes, le temps spécifique est ; déterminé par la cinquième décision de paramètre

Déverrouiller

Jedis jedis = new Jedis("127.0.0.1", 6379);
 
 private static final Long UNLOCK_SUCCESS = 1L;
 
 /**
 
  * 解锁操作
 
  * @param key 锁标识
 
  * @param value 客户端标识
 
  * @return
 
  */
 
 public static Boolean unLock(String key,String value){
 
     String luaScript = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then return redis.call(\"del\",KEYS[1]) else  return 0 end";
 
     Object var2 = jedis.eval(luaScript,Collections.singletonList(key), Collections.singletonList(value));
 
     if (UNLOCK_SUCCESS == var2) {
 
         return true;
 
     }
    return false;
 }

Interprétation :

luaScript Cette chaîne est un script Lua, ce qui signifie si selon Si la valeur obtenue par key est la même que la valeur transmise, exécutez del, sinon il retournera 0 [Assurer la sécurité] jedis.eval(String, list, list); pour exécuter le script lua, KEYS L'ensemble d'ARGV est le deuxième paramètre, et l'ensemble d'ARGV est le troisième paramètre [Opération atomique pour assurer le déverrouillage]

Ce qui précède montre comment utiliser Redis pour implémenter correctement les verrous distribués , mais il y a un petit défaut dans le verrou. Le délai d'expiration approprié doit être défini sur une valeur appropriée. Cela doit en fait être pris en compte en fonction du scénario commercial.

Pour plus d'articles techniques liés à Redis, veuillez visiter la colonne

Tutoriel de démarrage de Redis

pour apprendre !

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