Redis implémente des verrous distribués: il a déclaré que ses verrous distribués étaient très lucratifs

Insérez la description de l'image ici

Qu'est-ce qu'un verrou distribué?

Afin d'éviter les interférences mutuelles entre plusieurs processus dans un système distribué, nous avons besoin d'une technologie de coordination distribuée pour planifier ces processus. Le cœur de cette technologie de coordination distribuée est de réaliser ce verrou distribué.

Comprendre les concepts de base grâce à la mise en œuvre des verrous distribués Redis

Trois éléments clés de la mise en œuvre du verrou distribué:

Fermé à clé:

Le moyen le plus simple est d'utiliser la commande setnx. La clé est l'identifiant unique de la serrure, et elle est nommée en fonction de l'entreprise. Par exemple, si vous souhaitez verrouiller l'activité de pointe d'un produit, vous pouvez nommer la clé "lock_sale_product ID". Et quelle est la valeur définie? Nous pouvons le définir temporairement sur 1. Le pseudo code de verrouillage est le suivant:

setnx(lock_sale_商品ID,1

Lorsqu'un thread exécute setnx et renvoie 1, cela signifie que la clé n'existe pas à l'origine et que le thread a réussi à obtenir le verrou; quand un thread exécute setnx et renvoie 0, cela signifie que la clé existe déjà et que le thread ne parvient pas à saisir le verrou.

Ouvrir

S'il y a un verrou, il doit y avoir un déverrouillage. Lorsque le thread qui obtient le verrou termine sa tâche, il doit libérer le verrou pour que d'autres threads puissent entrer. Le moyen le plus simple de libérer le verrou est d'exécuter l'instruction del, le pseudo code est le suivant:

del(lock_sale_商品ID)

Une fois le verrou libéré, les autres threads peuvent continuer à exécuter la commande setnx pour obtenir le verrou.

Délai de verrouillage

Que signifie le délai de verrouillage? Si un thread qui obtient un verrou se bloque pendant l'exécution d'une tâche et qu'il est trop tard pour libérer le verrou explicitement, cette ressource sera verrouillée pour toujours (blocage) et les autres threads ne voudront jamais entrer. Par conséquent, la clé de setnx doit être définie avec un délai d'expiration pour garantir que le verrou sera automatiquement libéré après un certain laps de temps, même s'il n'est pas explicitement libéré. setnx ne prend pas en charge les paramètres de délai d'expiration, des instructions supplémentaires sont donc nécessaires. Le pseudo-code est le suivant:

expire(lock_sale_商品ID, 30

Implémentation de la serrure distribuée Redis et analyse de divers problèmes

SETNX

Nous pouvons facilement implémenter un verrou distribué redis avec la commande SETNX.
Qu'est-ce que SETNX? Si vous ne comprenez toujours pas, commençons par nettoyer:

Définissez la clé sur valeur. Si la clé n'existe pas, elle équivaut à la commande SET dans ce cas. Lorsque la clé existe, ne faites rien. SETNX est l'abréviation de "SET if Not
eXists".

valeur de retour:

   1 如果key被设置了
    0 如果key没有被设置

Code d'origine

····
事务实现(比方说:扣除库存)
····

Première serrure


string key = "key";
string values = "values";

···

bool result = 调用SETNX(key,values);
if(!result)
	return;

事务操作

redis中销毁key

···

Le verrou de résultat est ajouté ici. Lorsqu'un thread obtient ce verrou, les résultats des autres threads sont tous 0 et bloqués.


Seconde serrure

Le verrou ci-dessus a quelques bugs. Venez voir un par un.

Que se passe-t-il si la carte reste bloquée pendant l'opération de transaction? Alors ce verrou ne sera pas bloqué pour toujours! ! !
Que faire alors?
Oui, essayez ··· enfin ···


string key = "key";
string values = "values";

try{
    
    
	bool result = 调用SETNX(key,values);
	if(!result)
		return;

	事务操作
}catch(){
    
    
	redis中销毁key
}
redis中销毁key

Troisième serrure

D'accord, le problème des exceptions est résolu. Que faire si je raccroche directement tout le thread maintenant?
Que faire alors?
Il n'y a aucun moyen pour cet essai.

Oui, définissez un délai pour ce verrou.
N'oubliez pas, en dernière analyse, cette serrure est une clé.


string key = "key";
string values = "values";

try{
    
    
	bool result = 配置一个有时限的SETNX锁;	//在redis下有个操作,将SETNX和生命期配置两个原子操作合二为一
	if(!result)
		return;

	事务操作
}catch(){
    
    
	redis中销毁key
}
redis中销毁key

Eh bien, pour résoudre le verrou distribué général, c'est déjà OK ici.

Cependant, l'homme a déclaré que son verrou distribué était très lucratif


La quatrième serrure

Avez-vous déjà pensé que le verrou au-dessus de vous est réglé sur 10 secondes, si une tâche survient soudainement, elle sera exécutée pendant 15 secondes. Ensuite, il y a un problème.

线程A:拿到锁,执行15秒,在第10秒的时候,锁被redis给释放掉了。

线程B:锁已经被释放,拿锁,执行8秒,但是在执行到第五秒的时候,,,,锁被线程A给释放了哈哈哈哈哈哈

线程C:不说了,运气不好又被别的线程把他的锁给放了。。。。

Dans un scénario de forte concurrence, la progression du thread d'arrière-plan est tout simplement incontrôlable! ! !

N'est-ce pas fini? ? ?

Que faire alors?

Pour chaque valeur du verrou, configurez l'ID unique de votre propre thread. Lors du déverrouillage, vérifiez s'il s'agit de votre propre verrou. Ne déverrouillez pas les autres.


string key = "key";
string values = 专属随机值;

try{
    
    
	bool result = 配置一个有时限的SETNX锁;	//在redis下有个操作,将SETNX和生命期配置两个原子操作合二为一
	if(!result)
		return;

	事务操作
}catch(){
    
    
	redis中销毁key
}
redis中,根据values,销毁key

Cinquième écluse

Le quatrième verrou est en fait très bon, mais il y a toujours un problème à gauche, à droite, que le verrouillage du délai d'attente est un problème après tout.

Que faire alors? Régler 60 secondes? Réglez 90 secondes?
Quel est le réglage approprié? Ce n'est pas approprié, c'est bloqué.

Renouveler.

Tant que le verrouillage est réussi, ouvrez un sous-thread, ajoutez une minuterie au sous-thread et vérifiez si le verrou est toujours là toutes les 10 secondes et si le thread n'est toujours pas là, s'il est toujours là, renouvelez-le à 30 secondes .

En fait, je n'aime pas beaucoup cette serrure. Si elle veut vraiment être renouvelée comme ça, est-ce que l'accumulation des serrures actuelles est affichée?

Vous pouvez penser par vous-même.


Je suis ici en premier aujourd'hui, et j'ai pris rendez-vous avec ma petite soeur pour dîner à midi

Remarques finales

Il est recommandé de le récupérer, car la rencontre est le destin, vous ne pouvez pas le trouver si vous le grattez.

Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/qq_43762191/article/details/108543510
conseillé
Classement