基于Redisson的分布式锁

1、前言

基于Redis实现单节点的分布式锁详见:基于Redis实现单节点分布式锁

本文使用Redisson实现Redis的主从模式、sentinel模式和Cluster模式的分布式锁

2、实现过程

①、引入redisson的pom依赖;
②、配置SpringBootapplication.yml中的redis信息,注意不同集群模式下要切换端口;
③、配置RedissonUtils,如下:

public class RedissonUtils {
    private static Logger logger = LoggerFactory.getLogger(RedissonUtils.class);

    private static RedissonUtils redissonUtils;

    public RedissonUtils() {
    }

    /**
     * 提供单例模式
     * @return
     */
    public static RedissonUtils getInstance(){
        if(redissonUtils == null){
            synchronized (RedissonUtils.class){
                if (redissonUtils == null)
                    redissonUtils = new RedissonUtils();
            }
        }
        return redissonUtils;
    }

    /**
     * 获取 RedissonClient
     * @param config
     * @return
     */
    public RedissonClient getRedission(Config config){
        RedissonClient redissonClient = Redisson.create(config);
        logger.info("---------- 成功连接redis server ---------");
        return redissonClient;
    }

    public void closeRedisson(RedissonClient redissonClient){
        redissonClient.shutdown();
        logger.info("---------- redissonclient成功关闭 ----------");
    }
}

关于Redisson的其他获取比如Set、SortedSet、List等集合的配置参考:基于redission的分布式锁

④、三种集群方式测试

  • 主从模式:
	@Test
    public void testMasterSlaveDistributedLock(){
        Config config = new Config();
        config.useMasterSlaveServers().setMasterAddress("redis://127.0.0.1:6390")
                .addSlaveAddress("redis://127.0.0.1:6391","redis://127.0.0.1:6392");

        RedissonClient redissonClient = new RedissonUtils().getRedission(config);
        RLock rLock = redissonClient.getLock("master_slave_distributed_lock");
        try {
            boolean res = rLock.tryLock(0,1,TimeUnit.SECONDS);
            if (res){
                System.out.println("********** success **********");
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            rLock.unlock();
        }
    }
  • sentinel模式
  • 配置yml:
sentinel:
      master: mymaster
      nodes: 127.0.0.1:26579,127.0.0.1:26479,127.0.0.1:26379

测试:

	@Test
    public void testSentinelDistributedLock(){
        Config config = new Config();
        config.useSentinelServers().setMasterName("mymaster").addSentinelAddress("redis://127.0.0.1:26379","redis://127.0.0.1:26479","redis://127.0.0.1:26579");
        RedissonClient redissonClient = new RedissonUtils().getRedission(config);

        RLock rLock = redissonClient.getLock("sentinel_distributed_lock");
        try {
            boolean res = rLock.tryLock(100,10,TimeUnit.SECONDS);
            if (res){
                System.out.println("********** success **********");
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            rLock.unlock();
        }
    }
  • Cluster模式
    先在application.yml中配置集群:
cluster:
  nodes: 127.0.0.1:6381,127.0.0.1:6382,127.0.0.1:6383,127.0.0.1:6384,127.0.0.1:6385

测试如下:

@Test
    public void testCliusterDistributedLock(){
        Config config = new Config();
        config.useClusterServers().setScanInterval(2000).
                addNodeAddress("redis://127.0.0.1:6380","redis://127.0.0.1:6381","redis://127.0.0.1:6382","redis://127.0.0.1:6383","redis://127.0.0.1:6384","redis://127.0.0.1:6385");
        RedissonClient redissonClient = new RedissonUtils().getRedission(config);
        RLock rLock = redissonClient.getLock("cluster_distributed_lock");
        try {
            boolean res = rLock.tryLock(100,10,TimeUnit.SECONDS);
            if (res){
                System.out.println("********** success **********");
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            rLock.unlock();
        }
    }

基于Redisson实现分布式锁的原理推荐文章:Redisson

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值