Maison >base de données >Redis >Comment Redis implémente les verrous distribués

Comment Redis implémente les verrous distribués

(*-*)浩
(*-*)浩original
2019-11-27 10:33:044201parcourir

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!

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