Avec le développement des applications Internet, les systèmes distribués sont devenus une tendance incontournable. Dans un système distribué, une interaction de données est requise entre plusieurs services, et ces interactions de données peuvent être considérées comme une série de transactions. Lorsque plusieurs services opèrent sur des transactions en même temps, un contrôle de concurrence est requis.
Redis est une base de données clé-valeur hautes performances largement utilisée dans les systèmes distribués. Il prend en charge une variété de structures de données et de commandes, notamment les transactions et la surveillance, ce qui en fait un bon choix pour le contrôle de concurrence dans les systèmes distribués. Cet article présentera en détail comment Redis implémente le contrôle de concurrence des transactions distribuées.
1. Transaction Redis
La transaction Redis est une séquence d'opérations atomiques. Ces opérations peuvent être regroupées dans une seule commande et transmises au serveur Redis pour exécution dans une étape distincte, ce qui garantit l'atomicité de la transaction. Dans une transaction Redis, vous pouvez utiliser la commande MULTI pour démarrer la transaction, la commande EXEC pour soumettre la transaction et la commande DISCARD pour annuler la transaction.
Les commandes d'une transaction Redis peuvent être exécutées en continu après le démarrage de la transaction sans envoyer de requête pour chaque commande. Une fois que le client a exécuté toutes les commandes, il peut utiliser la commande EXEC pour soumettre des commandes au serveur Redis par lots. Si des erreurs surviennent lors de l'exécution d'une transaction, Redis annulera la transaction et interdira toutes les modifications. Cela garantit que toutes les opérations d’une transaction sont exécutées ou qu’aucune n’est exécutée.
2. Surveillance Redis
La surveillance Redis est la clé pour que Redis réalise des transactions distribuées. Il utilise la commande WATCH pour surveiller une ou plusieurs clés dans la base de données. Dans les types de données tels que LIST, SET, ZSET, HASH et STRING, la clé surveillée doit exister. Si des modifications de ces clés se produisent pendant la surveillance, la transaction ne sera pas validée avec succès. Pendant la surveillance, le client peut utiliser la commande MULTI pour démarrer une autre transaction.
Par exemple, le code suivant utilise la surveillance Redis :
WATCH balance balance = GET balance balance = balance - 10 MULTI SET balance $balance EXEC
Ce code surveillera la clé nommée "balance", utilisera la commande GET pour obtenir les données de cette clé, puis soustraira 10 des données. Utilisez ensuite la commande MULTI pour démarrer la transaction et réécrire les données dans le « solde ».
Si d'autres clients dans cette transaction surveillent également la clé "balance" et modifient cette clé avant que le client n'exécute la commande MULTI, alors la transaction échouera. Si la transaction est soumise avec succès, les autres clients ne peuvent pas modifier la clé surveillée avant que toutes les opérations incluses dans la transaction ne soient effectuées sur le serveur Redis.
3. Verrou distribué Redis
Afin d'éviter les problèmes de concurrence et de blocage causés par l'appel de commandes de surveillance Redis sur plusieurs clients en même temps, des verrous distribués peuvent être utilisés. Redis propose deux types de verrous distribués : les verrous autonomes et les verrous de cluster.
1. Verrouillage à machine unique
Le verrouillage à machine unique est la mise en œuvre de verrouillage distribué la plus simple. Dans un verrou autonome, vous pouvez utiliser la commande SETNX pour définir une valeur de clé pour le verrouillage. Par exemple, le code suivant utilise un verrou autonome :
SETNX lock_key $current_time
Ce code définit une valeur sur "lock_key". Si cette clé n'existe pas auparavant, le paramétrage est réussi et 1 est renvoyé. Sinon, 0 est renvoyé, indiquant que le verrouillage a échoué. Pendant la période de verrouillage, les autres clients ne peuvent pas modifier cette clé. A ce moment, le client peut effectuer ses propres opérations. Lorsque le client termine l'opération, il doit utiliser la commande DEL pour libérer le verrou. Cela supprimera "lock_key" et le déverrouillera.
2. Verrouillage de cluster
Le verrouillage de cluster est une implémentation de verrouillage distribué plus puissante. Dans les verrous de cluster, l'algorithme Redlock peut être utilisé pour le verrouillage multi-nœuds. L'algorithme Redlock est un algorithme de verrouillage distribué basé sur la synchronisation d'horloge. Dans l'algorithme Redlock, le client acquiert d'abord un verrou et utilise l'heure actuelle comme heure d'expiration du verrou. Le client doit également obtenir des verrous auprès d'autres serveurs Redis pour garantir que ce verrou est cohérent sur plusieurs nœuds. Pendant la période de verrouillage, les clients peuvent effectuer leurs propres opérations. Lorsque le client termine l'opération, le verrou doit être libéré. Cela supprimera le verrou et supprimera le verrou sur tous les serveurs Redis en même temps.
4. Résumé
Dans le développement d'applications Internet, les transactions distribuées et le contrôle de la concurrence sont très importants. Redis fournit des mécanismes tels que les transactions, la surveillance et les verrous distribués, ce qui en fait un bon choix pour le contrôle de concurrence dans les systèmes distribués. La maîtrise de ces mécanismes peut aider les développeurs à mieux concevoir et développer des systèmes distribués, et à résoudre les problèmes de transactions distribuées et de contrôle de concurrence.
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!