Maison  >  Article  >  base de données  >  Quel est le principe de mise en œuvre du verrouillage distribué Redis

Quel est le principe de mise en œuvre du verrouillage distribué Redis

醉折花枝作酒筹
醉折花枝作酒筹original
2021-06-23 11:57:193322parcourir

A l'aide de la commande setnx(key, value) dans redis, si la clé n'existe pas, elle sera ajoutée, et si elle existe, rien ne sera fait. Si plusieurs clients envoient la commande setnx en même temps, un seul client peut réussir et renvoyer 1 (vrai), les autres clients renvoient 0 (faux) ;

Quel est le principe de mise en œuvre du verrouillage distribué Redis

L'environnement d'exploitation de ce tutoriel : système Windows 7, Redis version 5.0.10, ordinateur DELL G3.

Mise en œuvre de verrous distribués

Avec les besoins du développement commercial, le système déployé sur une seule machine d'origine a évolué vers un système de cluster distribué puisque le système distribué est multi-thread et multi-processus. et distribué, sur différentes machines, cela invalidera la stratégie de verrouillage du contrôle de concurrence dans la situation de déploiement originale sur une seule machine. L'API Java simple ne peut pas fournir de capacités de verrouillage distribué. Afin de résoudre ce problème, un mécanisme d'exclusion mutuelle entre JVM est nécessaire pour contrôler l'accès aux ressources partagées. C'est le problème que les verrous distribués doivent résoudre !

Solutions d'implémentation grand public pour les verrous distribués :

  • Implémentation de verrous distribués basés sur une base de données

  • Basé sur le cache (Redis, etc. .)

  • Basé sur Zookeeper

Ici, nous implémentons des verrous distribués basés sur Redis.

Implémentation de base

A l'aide de la commande setnx(key, value) dans redis, si la clé n'existe pas, elle sera ajoutée, et si elle existe, rien ne sera fait . Si plusieurs clients envoient la commande setnx en même temps, un seul client peut réussir et renvoyer 1 (vrai), les autres clients renvoient 0 (faux) ;

Quel est le principe de mise en œuvre du verrouillage distribué Redis

Utilisez principalement la commande Redis Setnx

Lorsque la clé spécifiée n'existe pas, définissez la valeur spécifiée pour la clé

Définissez avec succès et renvoie 1. Le paramètre échoue et renvoie 0

redis> EXISTS job                # job 不存在

(integer) 0

 

redis> SETNX job "programmer"    # job 设置成功

(integer) 1

 

redis> SETNX job "code-farmer"   # 尝试覆盖 job ,失败

(integer) 0

 

redis> GET job                   # 没有被覆盖

"programmer"

code java

	public void testLock() {

		// 执行redis的setnx命令

		String uuid = UUID.randomUUID().toString();

		Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid, 5, TimeUnit.SECONDS);

 

		// 判断是否拿到锁

		if (lock) {

			// 执行业务逻辑代码

			// ...

 

			// 释放锁资源 (保证获取值和删除操作的原子性) LUA脚本保证删除的原子性

			String script = "if redis.call('get', KEYS[1]) == ARGV[1] then
 return redis.call('del', KEYS[1]) else return 0 end";

			this.redisTemplate.execute(new DefaultRedisScript<>(script), 
Arrays.asList("lock"), Arrays.asList(uuid));

//			if (StrUtil.equals(uuid,redisTemplate.opsForValue().get("lock"))){

//				redisTemplate.delete("lock");

//			}

		} else {

			// 其他请求尝试获取锁

			testLock();

		}

	}

Afin de garantir que le verrou distribué est disponible, nous devons au moins nous assurer que la mise en œuvre du verrou remplit simultanément les quatre conditions suivantes temps :

Sexe d'exclusion mutuelle. A tout moment, un seul client peut détenir le verrou.

Aucune impasse ne se produira. Même si un client plante alors qu'il maintient le verrou sans le déverrouiller activement, il est garanti que d'autres clients pourront ensuite le verrouiller.

Pour dénouer la cloche, vous devez attacher la cloche. Le verrouillage et le déverrouillage doivent être effectués par le même client. Le client lui-même ne peut pas déverrouiller le verrou ajouté par d'autres.

Tutoriels associés recommandés : Tutoriel Redis

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn