Maison >base de données >Redis >Comment Redis implémente les verrous distribués
Problèmes qui doivent être résolus avec les serrures distribuées
Exclusivité mutuelle : un seul client peut posséder la serrure à tout moment, pas plus de un en même temps Acquisition de clients
Sécurité : Le verrou ne peut être supprimé que par l'utilisateur détenant le verrou, mais pas par les autres utilisateurs (Apprentissage recommandé : Tutoriel vidéo Redis)
Deadlock : le client qui a acquis le verrou est tombé en panne pour une raison quelconque et n'a pas réussi à libérer le verrou. Les autres clients ne peuvent pas acquérir le verrou. Un mécanisme est nécessaire pour éviter de tels problèmes.
Tolérance aux pannes : lorsqu'elle fait partie de. Même si le nœud est en panne, le client peut toujours acquérir ou libérer le verrou
Comment implémenter des verrous distribués via Redis : (méthode imparfaite)
SETNX valeur de la clé :Si la clé n'existe pas, créez et attribuez la valeur
Complexité temporelle : 0(1)
Valeur de retour : Si le réglage est réussi, 1 est renvoyé ; si le paramètre échoue, 0 est renvoyé.
Mais la clé que nous obtenons à ce moment est valable pendant une longue période, alors comment devrions-nous résoudre le problème de la validité à long terme ?
EXPIRE les secondes de la clé
Définissez le temps de survie de la clé Lorsque la clé expire (le temps de survie est de 0), elle sera automatiquement supprimée
.Inconvénients : l'atomicité n'est pas satisfaite
Ce qui suit est le pseudo-code
//该程序存在危险,如果执行到第二行就崩溃了,则此时key会被一直占用而无法被释放 RedisService redisService = SpringUtils.getBean(Redi sService.class); long status = redisService.setnx(key, "1"); if(status == 1) { redisService.expire(key, expire); //执行独占资源逻辑 doOcuppiedWork(); }
Comment implémenter des verrous distribués via Redis : (manière correcte)
SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX seconde : Réglez le délai d'expiration de la clé sur secondes secondes
PX milliseconde : Réglez le délai d'expiration de la clé sur millisecondes millisecondes
NX : Uniquement lorsque la clé n'existe pas, définissez la clé uniquement lorsque la clé existe déjà
XX : définissez la clé uniquement lorsque la clé existe déjà
Lorsque l'opération SET est terminée avec succès, retournez OK, sinon renvoie nul
Ce qui suit est un pseudo code
RedisService redisService = SpringUtils.getBean(RedisService.class); . String result = redisService.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime); if ("OK".equals(result)) { //执行独占资源逻辑 doOcuppiedWork(); }
Notes sur l'expiration d'un grand nombre de clés en même temps
Expiration concentrée, car effacer un grand nombre de clés prend du temps. Il y aura un phénomène de décalage à court terme
Solution de libération : lors du réglage du délai d'expiration de la clé, ajoutez une valeur aléatoire à chacune. clé
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!