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();
        }
    }
相关推荐
向夏威夷 梦断明暄19 小时前
从架构特点到功能缺陷,重新认识分析型分布式数据库
数据库·分布式·架构
AAA@峥21 小时前
Ceph 集群配置管理完整指南
运维·数据库·分布式·ceph
心如鉄补1 天前
分布式链路追踪系统之docker-compose安装skywalking
分布式·docker·skywalking
努力努力再努力wz1 天前
【分布式系统与 RPC 框架系列】从单机瓶颈到远程调用:一文理解分布式架构与 RPC 原理
linux·网络·c++·分布式·网络协议·rpc·架构
ACP广源盛139246256731 天前
此芯 P1 AI BOX / AI NAS@ACP#IX8008、IX8024 应用场景与市场机会
大数据·人工智能·分布式·单片机·嵌入式硬件
网络工程小王2 天前
【HCIE-AI】12.deepspeed分布式并行训练进阶版
人工智能·pytorch·分布式·学习·昇腾·deepspeed
ACP广源盛139246256732 天前
国产算力互联IX8024@ACP#Kimi K3 开源后的端侧部署硬件架构分析
大数据·人工智能·分布式·单片机·嵌入式硬件
花生了什么事o2 天前
分布式 ID 生成方案:从数据库自增到雪花算法
数据库·分布式·算法
爱吃提升3 天前
python 分布式爬虫、爬虫合规与综合实战项目
分布式·爬虫·python
ZENERGY-众壹3 天前
跨品牌逆变器升级:华为锦浪德业 API 对接的 7 个坑
分布式·华为·数据归一化·光伏运维·逆变器api