Heim > Datenbank > Redis > Verwendung von Redis zur Implementierung verteilter Sperren in Java

Verwendung von Redis zur Implementierung verteilter Sperren in Java

WBOY
Freigeben: 2023-05-11 10:52:41
Original
5364 Leute haben es durchsucht

Mit der Entwicklung der Internettechnologie sind verteilte Systeme zu einem wichtigen Thema geworden, und verteilte Sperren sind ebenfalls eine der wichtigen Technologien. In einem verteilten System kann die Reihenfolge und Sicherheit des Zugriffs mehrerer Prozesse oder Threads auf gemeinsam genutzte Ressourcen durch die Verwendung verteilter Sperren gewährleistet werden. In Java gibt es viele Lösungen zur Implementierung verteilter Sperren, unter denen die Redis-Lösung für verteilte Sperren eine der am häufigsten verwendeten Methoden ist.

Redis ist eine leistungsstarke, persistente In-Memory-Datenbank mit guter Datenstrukturunterstützung und verteilten Eigenschaften. Der Redis-Clustermodus kann die Leistung des Systems problemlos erweitern, und gleichzeitig kann die verteilte Sperrfunktion auch über den auf PUB/SUB basierenden Abonnementmechanismus realisiert werden. Im Folgenden stellen wir vor, wie Sie mit Redis verteilte Sperren implementieren.

1. Designidee der Redis-Sperre

Um eine Sperre in einem verteilten System zu implementieren, müssen die folgenden Bedingungen erfüllt sein:

1. Gegenseitiger Ausschluss: Nur ein Client kann gleichzeitig die Sperre halten.

2. Reentrant: Derselbe Client kann die Sperre mehrmals erwerben und muss die Sperre genauso oft aufheben.

3. Nicht blockierend: Wenn der Versuch, die Sperre zu erhalten, fehlschlägt, wird sie sofort zurückgegeben und der Client-Thread nicht blockiert.

4. Fehlertoleranz: Die Sperre sollte nach Ablauf oder Ablauf automatisch freigegeben werden, ohne dass es zu Deadlocks und anderen Problemen kommt.

Basierend auf den oben genannten Bedingungen können wir den folgenden Redis-Sperrenimplementierungsplan entwerfen:

1 Versuchen Sie, den Wert der Sperre festzulegen. Wenn 1 zurückgegeben wird, bedeutet dies, dass die Sperre erfolgreich erworben wurde Dies bedeutet, dass die Sperrenerfassung fehlgeschlagen ist.

2. Verwenden Sie den GET-Befehl, um den Sperrwert abzurufen und festzustellen, ob der aktuelle Client die Sperre hält. Erhöhen Sie den Sperrwert um 1, andernfalls wird ein Fehler beim Erwerb der Sperre zurückgegeben.

3. Verwenden Sie den DEL-Befehl, um die Sperre aufzuheben.

4. Verwenden Sie die Ablaufzeit, um einen Deadlock zu verhindern. Die Ablaufzeit der Sperre sollte länger sein als die Geschäftsverarbeitungszeit, normalerweise einige Sekunden bis einige Minuten.

2. Java-Code zur Implementierung einer verteilten Sperre

Das Folgende ist ein Java-Codebeispiel mit Redis zur Implementierung einer verteilten Sperre:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class RedisLock {

    private static JedisPool jedisPool = null;

    static {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPool = new JedisPool(jedisPoolConfig, "localhost", 6379);
    }

    /**
     * 获取锁
     * @param key 锁的key值
     * @param expireTime 锁的过期时间
     * @return 获取锁的结果
     */
    public static boolean tryLock(String key, int expireTime) {

        Jedis jedis = jedisPool.getResource();

        //尝试获取锁
        Long result = jedis.setnx(key, "1");

        if (result == 1) {
            //设置过期时间
            jedis.expire(key, expireTime);
            jedis.close();
            return true;
        } else {
            jedis.close();
            return false;
        }
    }

    /**
     * 释放锁
     * @param key 锁的key值
     */
    public static void releaseLock(String key) {
        Jedis jedis = jedisPool.getResource();
        jedis.del(key);
        jedis.close();
    }
}
Nach dem Login kopieren

3. Beispiel für die Verwendung einer verteilten Sperre

Das Folgende ist ein Java-Code mit einer verteilten Sperre Beispiel ist ein Programm, das eine hohe Parallelität simuliert. Das Programm öffnet mehrere Threads, um gemeinsam genutzte Ressourcen zu bearbeiten.

public class ConcurrentTest {

    private static int count = 0;

    public static void main(String[] args) throws InterruptedException {

        ExecutorService executorService = Executors.newFixedThreadPool(10);

        for(int i=0; i<100000; i++){

            executorService.execute(() -> {

                String key = "lock_key";

                boolean result = RedisLock.tryLock(key, 2);

                if(result){

                    try {
                        count ++; //操作共享资源

                        System.out.println(Thread.currentThread().getName() + "操作成功,count=" + count);

                        Thread.sleep(100);

                    } catch (Exception e) {
                        e.printStackTrace();
                    }finally{
                        RedisLock.releaseLock(key); //释放锁
                    }
                }

            });
        }

        executorService.shutdown();
    }
}
Nach dem Login kopieren

4. Zusammenfassung

In einem verteilten System ist die Rolle von Sperren sehr wichtig. Der sinnvolle und effektive Einsatz von Sperren kann die Sicherheit und Effizienz des Systems gewährleisten. Die verteilte Sperre von Redis ist eine relativ häufige Methode. Durch die hohe Leistung und die verteilten Eigenschaften von Redis kann die Funktion einer verteilten Sperre leicht realisiert werden. Entwickler können basierend auf Geschäftsanforderungen und Systemleistungsanforderungen entscheiden, ob sie verteilte Redis-Sperren verwenden möchten.

Das obige ist der detaillierte Inhalt vonVerwendung von Redis zur Implementierung verteilter Sperren in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage