Redis implémente le verrouillage distribué
1 Effectuez setnx en fonction de la zone lockKey (l'ensemble n'existe pas, si la valeur de la clé est vide, définissez-la normalement et renvoyez 1, sinon elle le sera. ne pas être défini et renvoyer l'opération 0), si le réglage est réussi, cela signifie que le verrou a été obtenu, sinon le verrou n'a pas été obtenu.
2. Si le verrou n'est pas obtenu, allez sur Redis pour obtenir la valeur correspondant à la clé, on stocke un horodatage (exprimé en millisecondes, t1. ), Afin d'éviter un blocage et que d'autres clients occupent le verrou pendant plus d'un certain temps (5 secondes), l'horodatage actuel du client est utilisé et comparé à l'horodatage stocké. (Apprentissage recommandé : Tutoriel vidéo Redis)
3 Si la limite de temps d'utilisation de la clé n'a pas été dépassée, renvoyez false, indiquant que d'autres personnes occupent la clé et ne peuvent pas être forcées. pour l'utiliser ; si le délai est dépassé, nous pouvons alors le déverrouiller et utiliser notre horodatage pour remplacer la valeur de ce champ.
4. Mais si après setnx échoue, obtenez la valeur mais ne pouvez pas obtenir le champ, cela signifie que le verrou a été libéré avant l'opération. À ce stade, le meilleur moyen est de réexécuter la méthode setnx. pour obtenir Sa valeur est utilisée pour obtenir le verrou.
Libérer le verrouillage : supprimer la clé dans Redis
Zookeeper implémente le verrouillage distribué
Basé sur des nœuds séquentiels temporaires :
1. La fin appelle la méthode create() pour créer un nœud nommé "locknode/guid-lock-". Il convient de noter que le type de création du nœud ici doit être défini sur EPHEMERAL_SEQUENTIAL.
2. Le client appelle la méthode getChildren("locknode") pour obtenir tous les nœuds enfants créés.
3. Une fois que le client a obtenu les chemins de tous les nœuds enfants, s'il constate que le nœud qu'il a créé à l'étape 1 a le plus petit numéro de séquence parmi tous les nœuds, alors le client est considéré comme ayant obtenu le verrou.
4. Si le nœud créé n'a pas le plus petit numéro de séquence parmi tous les nœuds, alors le plus grand nœud avec un numéro de séquence plus petit que le nœud que vous avez créé sera surveillé et attendra. Jusqu'à la prochaine modification du nœud enfant surveillé, le nœud enfant sera à nouveau acquis pour déterminer s'il faut acquérir le verrou.
Le processus de libération du verrou est relativement simple, supprimez simplement le nœud enfant que vous avez créé.
Différence :
Verrou distribué Redis, en fait, vous devez constamment essayer d'obtenir le verrou vous-même, ce qui consomme plus de performances
Verrou distribué zk, si vous ne parvenez pas à obtenir le verrou, enregistrez simplement un auditeur. Vous n'avez pas besoin d'essayer constamment et activement d'obtenir le verrou, et la surcharge de performances est faible
Un autre point est que s'il s'agit de redis. Si le client qui acquiert le verrou est buggé ou raccroche, le verrou ne peut être libéré qu'après avoir attendu le délai d'attente comme pour zk, car il crée un znode temporaire, comme ; tant que le client raccroche, le znode disparaîtra et il sera automatiquement libéré à ce moment-là. Lock
Pour plus d'articles techniques liés à Redis, veuillez visiter laIntroduction à la base de données Redis. Tutoriel d'utilisationcolonne 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!