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.
Un exemple inapproprié : (apprentissage recommandé : Tutoriel vidéo Redis)
Hypothèse La ressource partagée est une maison avec divers livres. Le système distribué regroupe les personnes qui souhaitent entrer dans la maison pour lire. La serrure distribuée garantit que la maison n'a qu'une seule porte et qu'une seule personne peut entrer à la fois, et la porte n'en a qu'une. clé. Ensuite, beaucoup de gens veulent lire un livre, d'accord, faites la queue, la première personne prend la clé, ouvre la porte, entre pour lire et verrouille la porte. Ensuite, la deuxième personne n'a pas la clé, alors attendez, attendez que le premier sorte, et ensuite vous l'obtenez Entrez avec la clé, et ainsi de suite
Principe de mise en œuvre
Exclusivité mutuelle
Assurer qu'il n'y a qu'un seul client à la fois. Le client peut obtenir le verrou, c'est-à-dire qu'il peut opérer sur les ressources partagées
Sécurité
Seul le service verrouillé peut avoir une autorisation de déverrouillage, c'est-à-dire que a ne peut pas être ajouté. Le verrou et le bcd peuvent être déverrouillés. Si les deux peuvent être déverrouillés, alors le verrou distribué n'a aucun sens
La situation possible. est-ce que a demande et découvre que le verrou est maintenu et se prépare à le déverrouiller. À ce moment-là, a détient soudainement Certains verrous ont expiré, puis B obtient le verrou, car le verrou de A a expiré, et B obtient le verrou At. cette fois, A continue d'exécuter la deuxième étape pour déverrouiller. Si aucune vérification n'est effectuée, le verrou détenu par B sera supprimé
Éviter une impasse
En cas d'impasse. se produit, les services suivants ne pourront pas obtenir le verrou et aucune autre opération ne pourra être effectuée sur les ressources partagées
Assurez-vous que les opérations de verrouillage et de déverrouillage sont des opérations atomiques
Il s'agit en fait d'un problème d'implémentation de verrous distribués. Supposons qu'un utilise Redis pour implémenter des verrous distribués
Supposons qu'en ajoutant l'opération Lock, les étapes de l'opération sont divisées en deux étapes :
1, définir. jeu de clés (clé, valeur) 2, définir le délai d'expiration pour la clé
Supposons que maintenant que a vient d'implémenter set, le programme plante. Cela a entraîné un blocage sans définir de délai d'expiration pour la clé
.Comment implémenter des verrous distribués
Il existe de nombreuses façons d'implémenter des verrous distribués, tant que les conditions ci-dessus sont remplies, des verrous distribués peuvent être implémentés, comme une base de données, Redis, zookeeper. Ici, je vais d'abord parler de la façon d'utiliser Redis pour implémenter des verrous distribués
La clé pour implémenter des verrous distribués est En plus du serveur d'applications distribué, créez un serveur de stockage pour stocker les informations de verrouillage. cette fois, on peut facilement penser à Redis. Nous devons d'abord créer un serveur Redis et utiliser le serveur Redis pour stocker les informations de verrouillage.
Utilisez Redis pour implémenter des verrous distribués
Utilisez la commande redis set key value NX EX max-lock-time pour implémenter le verrouillage
Utiliser la commande Redis EVAL implémente le déverrouillage
Plusieurs points clés à noter lors de l'implémentation :
1 Les informations de verrouillage doivent expirer et expirer, et un thread ne peut pas être autorisé à le faire. Maintenir un verrou pendant une longue période peut entraîner un blocage
2. Un seul thread peut acquérir le verrou en même temps.
Plusieurs commandes redis à utiliser :
setnx(key, value): "set if not exits", si la clé-valeur n'existe pas, alors avec succès ajouté au cache et renvoie 1, sinon renvoie 0.
get(key) : Récupère la valeur correspondant à la clé, si elle n'existe pas, renvoie nil.
getset(key, value) : récupérez d'abord la valeur correspondant à la clé, renvoyez nil si elle n'existe pas, puis mettez à jour l'ancienne valeur avec la nouvelle valeur.
expire(key, seconds) : définissez la période de validité de la valeur-clé sur quelques secondes.
Pour plus d'articles techniques liés à Redis, veuillez visiter la colonne Introduction au didacticiel d'utilisation de la base de données 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!