springboot 集成redisson 实践

由于redis master 可以由多个的master单节点、master sentinel 、redis 集群组成,所以构建RedissonClient有三种方式。

  • 单节点模式
  Config config = new Config();
        // 哨兵模式
//        config.useSentinelServers().addSentinelAddress("127.0.0.1:6369", "127.0.0.1:6379", "127.0.0.1:6389")
//                .setMasterName("masterName")
//                .setPassword("password").setDatabase(0);
        config.useSingleServer().setAddress("127.0.0.1:6359").setPassword("123456").setDatabase(0);

        RedissonClient redissonClient1 = Redisson.create(config);
        config.useSingleServer().setAddress("127.0.0.1:6369").setPassword("123456").setDatabase(0);

        RedissonClient redissonClient2 = Redisson.create(config);
        config.useSingleServer().setAddress("127.0.0.1:6379").setPassword("123456").setDatabase(0);

        RedissonClient redissonClient3 = Redisson.create(config);

        // 设置锁的重要性是 锁value值的唯一性。 通过线程Id和UUID 保证唯一性。
//        RLock redLock = redissonClient.getLock("REDLOCK_KEY");

        RLock lock1 = redissonClient1.getLock("REDLOCK_KEY");
        RLock lock2 = redissonClient2.getLock("REDLOCK_KEY");
        RLock lock3 = redissonClient3.getLock("REDLOCK_KEY");

        RedissonRedLock redLock = new RedissonRedLock(lock1, lock2, lock3);

        boolean isBlock;
        try {
            // 使用默认租约时间  默认30s
//            isBlock=redlock.tryLock();

            // 500ms 获取不到锁就失败  10s 锁过期时间
            isBlock = redLock.tryLock(500, 10000,TimeUnit.MILLISECONDS);
            if(isBlock){
                //TODO if get lock success, do something;
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
//            释放锁 无论锁是否获取成功。
            redLock.unlock();
        }
  • 哨兵模式
 Config config = new Config();
        // 哨兵模式
        config.useSentinelServers().addSentinelAddress("127.0.0.1:6369", "127.0.0.1:6379", "127.0.0.1:6389")
                .setMasterName("masterName")
                .setPassword("password").setDatabase(0);

        RedissonClient redissonClient = Redisson.create(config);

        // 设置锁的重要性是 锁value值的唯一性。 通过线程Id和UUID 保证唯一性。
        RLock redLock = redissonClient.getLock("REDLOCK_KEY");


        boolean isBlock;
        try {
            // 使用默认租约时间  默认30s
//            isBlock=redlock.tryLock();

            // 500ms 获取不到锁就失败  10s 锁过期时间
            isBlock = redLock.tryLock(500, 10000,TimeUnit.MILLISECONDS);
            if(isBlock){
                //TODO if get lock success, do something;
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
//            释放锁 无论锁是否获取成功。
            redLock.unlock();
        }
  • 集群模式:
Config config = new Config();
//        // 哨兵模式
//        config.useSentinelServers().addSentinelAddress("127.0.0.1:6369", "127.0.0.1:6379", "127.0.0.1:6389")
//                .setMasterName("masterName")
//                .setPassword("password").setDatabase(0);
        // 集群模式
        config.useClusterServers().addNodeAddress("redis://127.0.0.1:6369", "redis://127.0.0.1:6379", "redis://127.0.0.1:6389")
                .setPassword("123456").setScanInterval(1000);
        RedissonClient redissonClient = Redisson.create(config);

        // 设置锁的重要性是 锁value值的唯一性。 通过线程Id和UUID 保证唯一性。
        RLock redLock = redissonClient.getLock("REDLOCK_KEY");


        boolean isBlock;
        try {
            // 使用默认租约时间  默认30s
//            isBlock=redlock.tryLock();

            // 500ms 获取不到锁就失败  10s 锁过期时间
            isBlock = redLock.tryLock(500, 10000,TimeUnit.MILLISECONDS);
            if(isBlock){
                //TODO if get lock success, do something;
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
//            释放锁 无论锁是否获取成功。
            redLock.unlock();
        }
  • 唯一value实现方式:
  protected String getLockName(long threadId) {
        return this.id + ":" + threadId;
    }
  • 过期时间设置:过期时间的设置确实不好估算,如果锁的过期时间过短会导致程序没有执行完,锁就被释放。最好的方法是单元测试下程序执行时间,最好不要在锁的内部程序里执行网络请求,I/O 耗时操作,以便更好的设置一个适当的有效时间。
  • 添加maven 依赖。
     
            
            
                org.redisson
                redisson
                3.9.0
            

     

你可能感兴趣的:(#,redis,#,分布式锁)