Redisson分布式锁解决方案

官方地址


官网: https://redisson.org

github: https://github.com/redisson/redisson

基于setnx实现的分布式锁存在的问题


redisson分布式锁原理

  • 不可重入: 利用hash结构记录线程id和重入次数
  • 不可重试: 利用信号量和PubSub功能实现等待、唤醒, 获取锁失败的重试机制
  • 超时释放: 利用WatchDog, 每隔一段时间(releaseTime/3), 重置超时时间

依赖和配置


  • 引入依赖
xml 复制代码
		<dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.13.6</version>
        </dependency>
  • 配置
java 复制代码
	@Bean
    public RedissonClient redissonClient(){
        Config config = new Config();
        // 添加redis地址, 这里添加了单点的地址, 也可以用config.useClusterServers()添加集群地址
        config.useSingleServer().setAddress("redis://localhost:6379").setPassword("123456");
        return Redisson.create(config);
    }
  • 三台单点redis服务
java 复制代码
	@Bean
    public RedissonClient redissonClient(){
        Config config = new Config();
        // 添加redis地址, 这里添加了单点的地址, 也可以用config.useClusterServers()添加集群地址
        config.useSingleServer().setAddress("redis://localhost:6379").setPassword("123456");
        return Redisson.create(config);
    }

    @Bean
    public RedissonClient redissonClient2(){
        Config config = new Config();
        // 添加redis地址, 这里添加了单点的地址, 也可以用config.useClusterServers()添加集群地址
        config.useSingleServer().setAddress("redis://localhost:6380").setPassword("123456");
        return Redisson.create(config);
    }

    @Bean
    public RedissonClient redissonClient3(){
        Config config = new Config();
        // 添加redis地址, 这里添加了单点的地址, 也可以用config.useClusterServers()添加集群地址
        config.useSingleServer().setAddress("redis://localhost:6381").setPassword("123456");
        return Redisson.create(config);
    }
java 复制代码
	RLock multiLock;

    @BeforeEach
    void setUp() {
        RLock lock = redissonClient.getLock("xiaoyuxia");
        RLock lock2 = redissonClient2.getLock("xiaoyuxia");
        RLock lock3 = redissonClient3.getLock("xiaoyuxia");
        multiLock = redissonClient.getMultiLock(lock, lock2, lock3);
    }

    @Test
    void test() throws Exception {
        boolean b = multiLock.tryLock();
        try {
            if (b) {
                // TODO
            }
        } finally {
            multiLock.unlock();
        }
    }
相关推荐
代码改善世界6 小时前
【前瞻创想】Kurator:驾驭分布式云原生世界的“统一舰队”
分布式·云原生
行走正道6 小时前
【前瞻创想】标准之争:论Kurator在分布式云原生API标准化中的潜在角色
分布式·api·kurator·标准化·策略驱动
代码改善世界6 小时前
【探索实战】从零到一:Kurator 构建分布式云原生平台的探索与实践
分布式·云原生
9***Y487 小时前
后端在分布式中的Apache Kafka
分布式·kafka
初学者,亦行者8 小时前
【前瞻创想】集成与创新并举,引领分布式云原生新范式
分布式·云原生
i***58678 小时前
【RabbitMQ】超详细Windows系统下RabbitMQ的安装配置
windows·分布式·rabbitmq
小马过河R8 小时前
tRPC-GO 框架Helloworld实践初体验
开发语言·分布式·后端·架构·golang·gin·beego
小程故事多_808 小时前
Kthena 引爆云原生推理革命:K8s 分布式架构破解 LLM 编排困局,吞吐狂飙 273%
人工智能·分布式·云原生·kubernetes·aigc
西岭千秋雪_8 小时前
Kafka服务端日志梳理
java·分布式·zookeeper·kafka
初学者,亦行者8 小时前
【探索实战】从 30 分钟搭建到生产落地,分布式云原生管理新范式
分布式·云原生