当前位置:网站首页>Redis Distributed Lock
Redis Distributed Lock
2022-07-01 16:46:00 【Bugmaker Shen】
Catalogue des articles
Un.、Concept de serrure distribuée
Au fur et à mesure que l'entreprise évolue,Une fois que le système original déployé sur une seule machine a été transformé en un système de Clusters de distribution de composants,En raison du Multithreading du système distribué、Processus multiples et distribués sur différentes machines,Cela invalidera la politique de verrouillage du contrôle de la concurrence dans le cas d'un déploiement autonome original,Simple Java API La capacité de verrouillage distribué n'est pas disponible.Pour résoudre ce problème, il faut une approche transversale JVM Pour contrôler l'accès aux ressources partagées,C'est le problème avec les serrures distribuées!
C'est un peu vulgaire,Après avoir verrouillé le cluster,Quelle que soit la machine actuellement utilisée,Toutes les machines reconnaîtront et attendront,Aucune autre opération ne peut être effectuée tant que la serrure n'est pas relâchée,C'est la serrure distribuée,Valable pour tous les Clusters
Mise en œuvre de la serrure distribuée Mainstream:
- Verrouillage distribué basé sur la base de données
- Basé sur le cache(Redis Attendez.)
- Basé sur Zookeeper
Chaque solution de verrouillage distribuée a ses avantages et ses inconvénients,Parmi euxredisPerformance maximalezookeeperFiabilité maximale
2.、UtilisersetnxRéaliser la serrure
set stu:1:info “OK” nx px 10000
EX second :Définir l'expiration de la clé à second Secondes,,SET key value EX second L'effet est équivalent à SETEX key second value
PX millisecond :Définir l'expiration de la clé à millisecond MS,SET key value PX millisecond L'effet est équivalent à PSETEX key millisecond value
NX :Seulement si la clé n'existe pas,Pour définir la clé,SET key value NX L'effet est équivalent à SETNX key value
XX :Seulement si la clé existe déjà,Pour définir la clé

- Plusieurs clients obtiennent des serrures en même temps(setnx)
- Obtenir le succès,Exécuter la logique opérationnelle(De db Obtenir des données,Mise en cache),Exécuter la serrure de libération complète(del)
- Le client qui n'a pas réussi à obtenir attend de réessayer

AvecsetnxEtdel Ajouter et libérer des serrures

En général, Nous devons fixer un délai d'expiration pour les serrures afin qu'elles ne soient pas utilisées à long terme

Il y a un problème.: Le verrouillage et le réglage du délai d'expiration sont deux opérations , Au lieu de fonctionner simultanément , Si une condition anormale survient après le verrouillage , Impossible de définir le délai d'expiration .On peut.Régler le délai d'expiration pendant le verrouillage

Trois、Écrire un code pour tester les serrures distribuées
1. UtiliserJavaCode Test Distributed Lock
Tout d'abord,redisParamètres intermédiairesnumLa valeur de0,CompilationJavaCode à tester
Le code ci - dessous fait : Obtenir la serrure num++,Et relâchez la serrure; Si vous n'obtenez pas 0.1Récupérez dans quelques secondes
Redémarrer,Grappes de services, Réussir le test de résistance de la passerelle :ab -n 5000 -c 100 http://192.168.140.1:8080/test/testLock

Voir redis Moyenne num Valeur de

Questions: setnx J'ai juste eu la serrure,Exception à la logique opérationnelle,La serrure ne se libère pas
Résolution: Définir le délai d'expiration,Verrouillage automatique
2. Réglage optimisé du temps d'expiration de la serrure
Il y a deux façons de définir le temps d'expiration:
- Pensez d'abord à passer expire Définir le délai d'expiration(Manque d'atomicité:Si dans setnx Et expire De Anomalie interstitielle ,La serrure ne se libère pas non plus.)
- In set Indique également le délai d'expiration (Recommandations)

Définir le temps d'expiration dans le Code :

Questions: Les serrures d'autres serveurs peuvent être libérées
Si le temps d'exécution de la logique d'entreprise est 7s,Le processus d'exécution est le suivant::
- index1 La logique d'entreprise n'est pas terminée,3 La serrure est libérée automatiquement après quelques secondes
- index2 Obtenir la serrure,Exécuter la logique opérationnelle,3 La serrure est libérée automatiquement après quelques secondes
- index3 Obtenir la serrure,Exécuter la logique opérationnelle
- index1 Exécution de la logique opérationnelle terminée,Commencez à appeler del Relâchez la serrure.,C'est là que index3 Verrouillage, Cause index3 Les affaires de 1s Il a été libéré par quelqu'un d'autre.
Ce qui équivaut finalement à une situation sans serrure

a Au moment de l'opération , Libération automatique après un délai de verrouillage ;Après libération,b Saisir la serrure pour l'opération ;En ce momentaOpération terminée,Verrouillage manuel,Ça vabLa serrure de,b Si vous relâchez encore la serrure, une erreur se produira
Résolution: setnx Lors de l'acquisition de la serrure,Définir une valeur unique spécifiée(Par exemple:uuid); Obtenez ceci avant de libérer Valeurs,Déterminer si votre propre serrure
Quatre、OptimisationlockParamètresUUIDPrévention des erreurs et des suppressions


Cinq、UtiliserLUALe script garantit l'atomicité de la suppression
UtiliserlockDeuuid Il est possible de libérer d'autres serrures dans une certaine mesure , Mais cela ne résout pas entièrement la situation .Parce que la comparaisonuuidEt supprimerlockCe n'est pas atomique

Questions: aComparaisonuuidAprès passage, Verrouillage expiré libération automatique ,bRe - lock,a Ceci se libère manuellement bVerrouillage, C'est toujours un problème
Résolution: UtiliserLUA Le script garantit l'atomicité de la suppression
LUAScript:
Sera complexe ou en plusieurs étapes redis Fonctionnement,Écris comme un script,Soumis une fois redis Mise en œuvre,Réduire les connexions répétées redis Nombre de fois,Améliorer les performances
LUA Le script est similaire redis Services,Avec une certaine atomicité,Ne pas être mis en file d'attente par d'autres ordres,Ça pourrait être faitredis Transactionnel
@GetMapping("testLockLua")
public void testLockLua() {
//1 Déclarez un uuid ,Ce sera un value Dans notre key Parmi les valeurs correspondantes
String uuid = UUID.randomUUID().toString();
//2 Définir une serrure:lua Le script peut utiliser la même serrure,Pour supprimer!
String skuId = "25"; // Accès à skuId Pour 25 Article No. 100008348542
String locKey = "lock:" + skuId; // Les données de chaque article sont verrouillées
// 3 Obtenir la serrure
Boolean lock = redisTemplate.opsForValue().setIfAbsent(locKey, uuid, 3, TimeUnit.SECONDS);
// Première catégorie: lock Aucun Code n'est écrit entre la date d'expiration.
// redisTemplate.expire("lock",10, TimeUnit.SECONDS);//Définir le délai d'expiration
// Si true
if (lock) {
// Début de la logique opérationnelle mise en œuvre
// Obtenir dans le cache num Données
Object value = redisTemplate.opsForValue().get("num");
// S'il est vide, retournez directement
if (StringUtils.isEmpty(value)) {
return;
}
// Pas vide. S'il y a une anomalie ici! Alors delete La suppression a échoué! Ce qui veut dire que la serrure existe toujours!
int num = Integer.parseInt(value + "");
// Faire num Chaque fois+1 Mise en cache
redisTemplate.opsForValue().set("num", String.valueOf(++num));
/*Utiliser lua Script pour verrouiller*/
// Définition lua Script: Les opérations de jugement et de suppression seront effectuées simultanément
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
// Utiliser redis Mise en œuvre lua Mise en œuvre
DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
redisScript.setScriptText(script);
// Définissez le type de valeur de retour Pour Long
// Parce qu'en supprimant le jugement,Retour à 0,Encapsuler comme type de données.Si elle n'est pas encapsulée, la valeur par défaut est retournée String Type,
// Renvoie la chaîne avec 0 Il y aura des erreurs.
redisScript.setResultType(Long.class);
// Le premier est exécuté script Script ,La deuxième chose à juger key,Le troisième est key La valeur correspondante.
redisTemplate.execute(redisScript, Arrays.asList(locKey), uuid);
} else {
// D'autres fils attendent
try {
// Sommeil
Thread.sleep(1000);
// Après s'être réveillée,Méthode d'appel.
testLockLua();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}


Pour s'assurer que les serrures distribuées sont disponibles,Nous devons au moins nous assurer que la mise en œuvre de la serrure satisfait simultanément aux quatre conditions suivantes:
- Exclusivité mutuelle;À tout moment,Un seul client peut tenir la serrure
- Il n'y aura pas d'impasse;Même si un client s'est écrasé pendant qu'il tenait la serrure sans déverrouiller activement,Il peut également s'assurer que d'autres clients peuvent verrouiller(ParamètreslockDate d'expiration)
- La sonnerie doit être éteinte.;Le verrouillage et le déverrouillage doivent être du même client,Le client lui - même ne peut pas déverrouiller les serrures des autres(UtiliserLUAScripts etuuid)
- Le verrouillage et le déverrouillage doivent être atomiques(UtiliserLUAScript)
边栏推荐
- UML旅游管理系统「建议收藏」
- 全面看待企业数字化转型的价值
- VMware 虛擬機啟動時出現故障:VMware Workstation 與 Hyper-v 不兼容...
- Alibaba cloud, Zhuoyi technology beach grabbing dialogue AI
- 模板引擎Velocity 基础
- P2893 [USACO08FEB] Making the Grade G(dp&优先队列)
- P2893 [usaco08feb] making the grade g (DP & priority queue)
- Motion capture system for apple picking robot
- [observation] where is the consulting going in the digital age? Thoughts and actions of softcom consulting
- 制造业数字化转型究竟是什么
猜你喜欢

苹果自研基带芯片再次失败,说明了华为海思的技术领先性

今天14:00 | 港大、北航、耶鲁、清华、加大等15位ICLR一作讲者精彩继续!

數據庫系統原理與應用教程(006)—— 編譯安裝 MySQL5.7(Linux 環境)

Rhcsa Road

How to repair the laptop that cannot connect to the wireless network

软件工程导论——第六章——详细设计

Basic use of MySQL

毕业季 | 华为专家亲授面试秘诀:如何拿到大厂高薪offer?

Apple's self-developed baseband chip failed again, which shows Huawei Hisilicon's technological leadership

全面看待企业数字化转型的价值
随机推荐
Red team Chapter 8: blind guess the difficult utilization process of the package to upload vulnerabilities
Graduation season | Huawei experts teach the interview secret: how to get a high paying offer from a large factory?
C語言輸入/輸出流和文件操作
[observation] where is the consulting going in the digital age? Thoughts and actions of softcom consulting
Dataframe gets the number of words in the string
[daily question] 1175 Prime permutation
虚拟串口模拟器和串口调试助手使用教程「建议收藏」
数据库系统原理与应用教程(004)—— MySQL 安装与配置:重置 MySQL 登录密码(windows 环境)
模板引擎Velocity 基础
Why is the pkg/errors tripartite library more recommended for go language error handling?
Origin2018 installation and use (sorting)
sql刷题584. 寻找用户推荐人
瑞典公布决定排除华为5G设备,但是华为已成功找到新出路
Installation and use of sqoop
The sharp drop in electricity consumption in Guangdong shows that the substitution of high-tech industries for high-energy consumption industries has achieved preliminary results
Korean AI team plagiarizes shock academia! One tutor with 51 students, or plagiarism recidivist
Principle of SSM framework
Ring iron pronunciation, dynamic and noiseless, strong and brilliant, magic wave hifiair Bluetooth headset evaluation
Rhcsa Road
独家消息:阿里云悄然推出RPA云电脑,已与多家RPA厂商开放合作