Maison >base de données >Redis >Utiliser Redis pour implémenter des verrous distribués en Java

Utiliser Redis pour implémenter des verrous distribués en Java

WBOY
WBOYoriginal
2023-05-11 10:52:415368parcourir

Avec le développement de la technologie Internet, les systèmes distribués sont devenus un sujet important, et les verrous distribués sont également l'une des technologies importantes. Dans un système distribué, l'ordre et la sécurité de l'accès aux ressources partagées par plusieurs processus ou threads peuvent être garantis à l'aide de verrous distribués. En Java, il existe de nombreuses solutions pour implémenter des verrous distribués, parmi lesquelles la solution de verrouillage distribué Redis est l'une des méthodes les plus couramment utilisées.

Redis est une base de données en mémoire hautes performances et persistante avec une bonne prise en charge de la structure de données et des fonctionnalités distribuées. Le mode cluster Redis peut facilement étendre les performances du système, et en même temps, la fonction de verrouillage distribué peut également être réalisée via le mécanisme d'abonnement basé sur PUB/SUB. Ci-dessous, nous expliquerons comment utiliser Redis pour implémenter des verrous distribués.

1. Idées de conception de verrous Redis

Pour implémenter un verrou dans un système distribué, les conditions suivantes doivent être remplies :

1. Exclusion mutuelle : Un seul client peut détenir le verrou à la fois.

2. Réentrée : Le même client peut acquérir le verrou plusieurs fois et doit libérer le verrou le même nombre de fois.

3. Non bloquant : si la tentative d'acquisition du verrou échoue, il reviendra immédiatement et ne bloquera pas le thread client.

4. Tolérance aux pannes : le verrou doit être automatiquement libéré après son expiration ou son expiration, sans provoquer de blocage ni d'autres problèmes.

Sur la base des conditions ci-dessus, nous pouvons concevoir le plan de mise en œuvre du verrou Redis suivant :

1 Utilisez la commande SETNX pour essayer de définir la valeur du verrou If 1. est renvoyé, cela indique une acquisition réussie, sinon cela signifie un échec d'obtention du verrou.

2. Utilisez la commande GET pour obtenir la valeur du verrou et déterminer si le client actuel détient le verrou, ajoutez 1 à la valeur du verrou. pour obtenir le cadenas sera restitué.

3. Utilisez la commande DEL pour déverrouiller.

4. Utilisez le délai d'expiration pour éviter les blocages. Le délai d'expiration du verrou doit être supérieur au temps de traitement de l'entreprise, généralement de quelques secondes à quelques minutes.

2. Code Java pour implémenter des verrous distribués

Ce qui suit est un exemple de code Java utilisant Redis pour implémenter des verrous distribués :

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

3. Exemple d'utilisation du verrouillage distribué

Ce qui suit est un exemple de code Java utilisant le verrouillage distribué. Cet exemple est un programme qui simule une concurrence élevée. Le programme ouvrira plusieurs threads pour exploiter des ressources partagées en même temps.

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

4. Résumé

Dans un système distribué, le rôle des verrous est très important. Une utilisation raisonnable et efficace des verrous peut garantir la sécurité et l'efficacité du système. Le verrouillage distribué Redis est une méthode relativement courante. Grâce aux hautes performances et aux caractéristiques distribuées de Redis, la fonction de verrouillage distribué peut être facilement réalisée. Les développeurs peuvent décider d'utiliser ou non les verrous distribués Redis en fonction des besoins de l'entreprise et des exigences de performances du système.

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