1. Einführung in verteilte Sperren
Einzelne Maschinen-Multithreading: In Java verwenden wir normalerweise lokale Sperren wie die ReetrantLock-Klasse und das synchronisierte Schlüsselwort, um den Zugriff mehrerer Threads in einem JVM-Prozess auf lokale gemeinsam genutzte Ressourcen zu steuern
Verteiltes System: Verschiedene Dienste/Clients laufen in der Regel auf unabhängigen JVM-Prozessen. Wenn mehrere JVM-Prozesse dieselbe Ressource gemeinsam nutzen, gibt es keine Möglichkeit, mithilfe lokaler Sperren einen sich gegenseitig ausschließenden Zugriff auf die Ressource zu erreichen. So wurden verteilte Schlösser geboren.
Zum Beispiel: Es werden insgesamt 3 Kopien des Bestelldienstes des Systems eingesetzt, die alle Dienste für die Außenwelt bereitstellen. Benutzer müssen den Lagerbestand überprüfen, bevor sie eine Bestellung aufgeben. Um einen Überverkauf zu verhindern, ist eine Sperre erforderlich, um einen synchronen Zugriff auf den Lagerbestandsprüfvorgang zu erreichen. Da sich der Bestellservice in einem anderen JVM-Prozess befindet, funktionieren lokale Sperren in diesem Fall nicht ordnungsgemäß. Wir müssen verteilte Sperren verwenden, damit mehrere Threads, auch wenn sie sich nicht im selben JVM-Prozess befinden, dieselbe Sperre erhalten und so einen sich gegenseitig ausschließenden Zugriff auf gemeinsam genutzte Ressourcen erreichen können.
Eine grundlegendste verteilte Sperre muss Folgendes erfüllen:
Gegenseitiger Ausschluss: Die Sperre kann jederzeit nur von einem Thread gehalten werden;
Hohe Verfügbarkeit: Der Sperrdienst ist hochverfügbar. Selbst wenn es ein Problem mit der Codelogik des Clients zum Aufheben der Sperre gibt, wird die Sperre schließlich aufgehoben und hat keinen Einfluss auf den Zugriff anderer Threads auf gemeinsam genutzte Ressourcen.
Reentrant: Nachdem ein Knoten die Sperre erworben hat, kann er die Sperre erneut erwerben.
2. Implementieren verteilter Sperren basierend auf Redis
1 So implementieren Sie die einfachste verteilte Sperre basierend auf Redis
Ob es sich um eine lokale Sperre oder eine verteilte Sperre handelt, der Kern liegt im „gegenseitigen Ausschluss“ ==.
In Redis, SETNX
命令是可以帮助我们实现互斥。SETNX
Das heißt, SET if Not eXists (entsprechend der setIfAbsent-Methode in Java, wenn der Schlüssel nicht vorhanden ist, wird der Wert des Schlüssels festgelegt). Wenn der Schlüssel bereits vorhanden ist, führt SETNX keine Aktion aus.
Um die Sperre aufzuheben, löschen Sie den entsprechenden Schlüssel direkt über den DEL-Befehl> SETNX lockKey uniqueValue
(integer) 1
> SETNX lockKey uniqueValue
> DEL lockKeyUm ein versehentliches Löschen anderer Sperren zu verhindern, empfehlen wir hier die Verwendung eines Lua-Skripts, um anhand des dem Schlüssel entsprechenden Werts (eindeutiger Wert) zu beurteilen. Das Lua-Skript wurde ausgewählt, um die Atomizität des Entsperrvorgangs sicherzustellen. Denn Redis kann Lua-Skripte atomar ausführen und so die Atomizität des Sperrfreigabevorgangs sicherstellen.( Ganzzahl) 1
// 释放锁时,先比较锁对应的 value 值是否相等,避免锁的误释放 if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end
NX: SET kann nur erfolgreich sein, wenn der dem lockKey entsprechende Schlüsselwert nicht vorhanden ist;
EX: Ablaufzeiteinstellung ( in Sekunden) ) EX 3 gibt an, dass diese Sperre eine automatische Ablaufzeit von 3 Sekunden hat. EX entspricht PX (in Millisekunden), beides sind Ablaufzeiteinstellungen.
Stellen Sie sicher, dass das Festlegen des Werts und der Ablaufzeit des angegebenen Schlüssels eine atomare Operation ist! ! ! Andernfalls besteht möglicherweise immer noch das Problem, dass die Sperre nicht aufgehoben werden kann.
Diese Lösung weist auch Lücken auf: - Wenn die Zeit zum Betreiben der gemeinsam genutzten Ressource länger als die Ablaufzeit ist, läuft die Sperre vorzeitig ab, was zum direkten Ausfall der verteilten Sperre führt.
- Wenn die Sperrzeitlimit ist festgelegt. Wenn es zu lang ist, wirkt sich dies auf die Leistung aus. Einschließlich nicht nur mehrerer Distributionen. Implementierung der Sperre. Darüber hinaus unterstützt Redisson auch mehrere Bereitstellungsarchitekturen wie Redis Standalone, Redis Sentinel und Redis Cluster.
Die verteilte Sperre in Redisson verfügt über einen automatischen Erneuerungsmechanismus. Er ist sehr einfach zu verwenden und das Prinzip ist relativ einfach. Er bietet einen Watch Dog, der speziell zum Überwachen und Erneuern der Sperre verwendet wird, wenn der Thread vorhanden ist Wenn die Ausführung nicht abgeschlossen ist, verlängert Watch Dog kontinuierlich die Ablaufzeit der Sperre, um sicherzustellen, dass die Sperre aufgrund einer Zeitüberschreitung nicht aufgehoben wird.
使用方式举例:
// 1.获取指定的分布式锁对象
RLock lock = redisson.getLock("lock");
// 2.拿锁且不设置锁超时时间,具备 Watch Dog 自动续期机制
lock.lock();
// 3.执行业务
...
// 4.释放锁
lock.unlock();
只有未指定锁超时时间,才会使用到 Watch Dog 自动续期机制。
// 手动给锁设置过期时间,不具备 Watch Dog 自动续期机制 lock.lock(10, TimeUnit.SECONDS);
总的来说就是使用Redisson,它带有自动的续期机制
4. 如何实现可重入锁
所谓可重入锁指的是在一个线程中可以多次获取同一把锁,比如一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法即可重入 ,而无需重新获得锁。像 Java 中的 synchronized 和 ReentrantLock 都属于可重入锁。
可重入分布式锁的实现核心思路是线程在获取锁的时候判断是否为自己的锁,如果是的话,就不用再重新获取了。为此,我们可以为每个锁关联一个可重入计数器和一个占有它的线程。当可重入计数器大于 0 时,则锁被占有,需要判断占有该锁的线程和请求获取锁的线程是否为同一个。
Das obige ist der detaillierte Inhalt vonSo implementieren Sie eine verteilte Java-Sperre. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Beginnen Sie den Frühling mit der Intellijideaultimate -Version ...

Bei Verwendung von MyBatis-Plus oder anderen ORM-Frameworks für Datenbankvorgänge müssen häufig Abfragebedingungen basierend auf dem Attributnamen der Entitätsklasse erstellt werden. Wenn Sie jedes Mal manuell ...

Java...

Wie erkennt die Redis -Caching -Lösung die Anforderungen der Produktranking -Liste? Während des Entwicklungsprozesses müssen wir uns häufig mit den Anforderungen der Ranglisten befassen, z. B. das Anzeigen eines ...

Konvertierung von Java-Objekten und -Arrays: Eingehende Diskussion der Risiken und korrekten Methoden zur Konvertierung des Guss-Typs Viele Java-Anfänger werden auf die Umwandlung eines Objekts in ein Array stoßen ...

Lösungen zum Umwandeln von Namen in Zahlen zur Implementierung der Sortierung in vielen Anwendungsszenarien müssen Benutzer möglicherweise in Gruppen sortieren, insbesondere in einem ...

Detaillierte Erläuterung des Designs von SKU- und SPU-Tabellen auf E-Commerce-Plattformen In diesem Artikel werden die Datenbankdesignprobleme von SKU und SPU in E-Commerce-Plattformen erörtert, insbesondere wie man mit benutzerdefinierten Verkäufen umgeht ...

So setzen Sie die Liste des Springboot -Projekts Standardkonfiguration in der Idee mit Intellij ...


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

MantisBT
Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.

PHPStorm Mac-Version
Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool

MinGW – Minimalistisches GNU für Windows
Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

mPDF
mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),

ZendStudio 13.5.1 Mac
Leistungsstarke integrierte PHP-Entwicklungsumgebung