Heim  >  Artikel  >  Datenbank  >  Was ist das Implementierungsprinzip der verteilten Redis-Sperre?

Was ist das Implementierungsprinzip der verteilten Redis-Sperre?

醉折花枝作酒筹
醉折花枝作酒筹Original
2021-06-23 11:57:193386Durchsuche

Mit Hilfe des Befehls setnx(key, value) in Redis wird der Schlüssel hinzugefügt, wenn er nicht existiert, und wenn er existiert, wird nichts unternommen. Wenn mehrere Clients gleichzeitig den Befehl setnx senden, kann nur ein Client erfolgreich sein und 1 (wahr) zurückgeben; andere Clients geben 0 (falsch) zurück.

Was ist das Implementierungsprinzip der verteilten Redis-Sperre?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, Redis Version 5.0.10, DELL G3-Computer.

Implementierung verteilter Sperren

Mit den Anforderungen der Geschäftsentwicklung hat sich das ursprünglich auf einer Maschine bereitgestellte System zu einem verteilten Clustersystem entwickelt, da das verteilte System mehrere Threads und mehrere Prozesse aufweist und auf verschiedene Maschinen verteilt ist make Die Parallelitätskontroll-Sperrstrategie in der ursprünglichen Standalone-Bereitstellungssituation ist ungültig und die einfache Java-API kann keine verteilten Sperrfunktionen bereitstellen. Um dieses Problem zu lösen, ist ein JVM-übergreifender gegenseitiger Ausschlussmechanismus erforderlich, um den Zugriff auf gemeinsam genutzte Ressourcen zu steuern. Dies ist das Problem, das verteilte Sperren lösen müssen!

Mainstream-Implementierungslösungen für verteilte Sperren:

  • Implementieren verteilter Sperren basierend auf der Datenbank

  • Basierend auf Cache (Redis usw.)

  • Basierend auf Zookeeper

Hier implementieren wir verteilte Sperren basierend auf Redis.

Grundlegende Implementierung

Mit Hilfe des Befehls setnx(key, value) in Redis wird der Schlüssel hinzugefügt, wenn er nicht existiert, und wenn er existiert, wird nichts unternommen. Wenn mehrere Clients gleichzeitig den Befehl setnx senden, kann nur ein Client erfolgreich sein und 1 (wahr) zurückgeben; andere Clients geben 0 (falsch) zurück.

Was ist das Implementierungsprinzip der verteilten Redis-Sperre?

Verwenden Sie hauptsächlich den Redis Setnx-Befehl.

Wenn der angegebene Schlüssel nicht vorhanden ist, legen Sie den angegebenen Wert für den Schlüssel fest.

Wenn die Einstellung erfolgreich ist, wird 1 zurückgegeben. Das Setup schlägt fehl und gibt 0 zurück.

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"

Java-Code

	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();

		}

	}

Um sicherzustellen, dass die verteilte Sperre verfügbar ist, müssen wir mindestens sicherstellen, dass die Sperrimplementierung gleichzeitig die folgenden vier Bedingungen erfüllt:

Gegenseitige Exklusivität. Es kann immer nur ein Client die Sperre halten.

Es wird kein Deadlock auftreten. Selbst wenn ein Client abstürzt, während er die Sperre hält, ohne sie aktiv zu entsperren, ist gewährleistet, dass andere Clients ihn anschließend sperren können.

Um die Glocke zu lösen, müssen Sie die Glocke binden. Das Sperren und Entsperren muss vom selben Client durchgeführt werden. Der Client selbst kann die von anderen hinzugefügte Sperre nicht entsperren.

Verwandte Tutorial-Empfehlungen: Redis-Tutorial

Das obige ist der detaillierte Inhalt vonWas ist das Implementierungsprinzip der verteilten Redis-Sperre?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn