【超详细】使用RedissonClient实现Redis分布式锁

使用RedissonClient实现Redis分布式锁是一个非常简洁和高效的方式。Redisson是一个基于Redis的Java客户端,它提供了许多高级功能,包括分布式锁、分布式集合、分布式映射等,简化了分布式系统中的并发控制。

添加依赖

首先,你需要在你的项目中添加Redisson的依赖。以下是Maven配置:

xml 复制代码
<dependency>
  <groupId>org.redisson</groupId>
  <artifactId>redisson</artifactId>
  <version>3.16.2</version> <!-- 请根据需要选择最新版本 -->
</dependency>

配置RedissonClient

然后,你需要配置RedissonClient来连接Redis服务器:

java 复制代码
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

public class RedissonConfig {
    public RedissonClient getRedissonClient() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379"); // 配置Redis服务器地址

        return Redisson.create(config);
    }
}

也可以在配置文件中配置你的redis连接,具体可以自行百度

创建RedissonTool工具类

java 复制代码
@Component
public class RedissonTool {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());


    @Autowired
    private RedissonClient redissonClient;

    /**
     * 获得锁的对象
     *
     * @param lockKey 锁的key值
     * @return 锁对象
     */
    public RLock getLockByKey(String lockKey) {
        RLock lock = null;
        try {
            lock = redissonClient.getLock(lockKey);
        } catch (Exception e) {
            logger.error("[RedissonTool.getLockByKey] getLock is exception}", e);
        }

        return lock;
    }

    /**
     * 获取锁是否成功
     *
     * @param lock 锁对象
     * @return true=成功,false=失败
     */
    public Boolean isTryLock(RLock lock) {
        //默认是通过
        boolean result = true;
        //获得锁的对象
        if (lock != null) {
            try {
                result = lock.tryLock();
            } catch (Exception e) {
                this.logger.error("[RedissonTool.getLockByKey] lock.tryLock is excepiton}", e);
            }
        }

        return result;
    }

}

使用分布式锁

  1. 使用tryLock()
java 复制代码
RLock lock = redissonClient.getLock("myLock");
boolean isLocked = false;
try {
    isLocked = lock.tryLock(lock); 
    if (isLocked) {
        // 执行临界区代码
    } else {
        // 未获取到锁的处理逻辑
    }
} catch (InterruptedException e) {
    e.printStackTrace();
} finally {
    if (isLocked) {
        lock.unlock(); // 解锁
    }
}
  1. 直接使用 lock.lock()
java 复制代码
RLock lock = redissonTool.getLockByKey(CacheConstants.ORDER_RESULT_DEAL + outTradeNo);
lock.lock(); // 直接获取锁,阻塞式
// 执行业务逻辑
lock.unlock(); // 解锁
相关推荐
笃行3501 小时前
国产化落地避坑 · 干货向|Oracle 迁金仓 KES,我把外连接消除排在隐性陷阱第一位
数据库
老纪的技术唠嗑局1 小时前
花一年时间整理出的:AI 数据库混合搜索入门实践
数据库
用户095367515832 小时前
在系统的学习 redis 前的疑惑
redis·go
川石课堂软件测试2 小时前
安全测试|常见SQL注入攻击方式、实例及预防
服务器·数据库·sql·功能测试·测试工具·安全·单元测试
笃行3502 小时前
国产化落地避坑 · 干货向|迁移后那条「测试能过、一上生产就查空」的 SQL,多半栽在 WHERE 函数顺序上
数据库
蓝田~3 小时前
MySQL慢查询怎么优化?B+Tree索引原理+MVCC读不阻塞写+EXPLAIN执行计划,从5秒到0.05秒
数据库·mysql
sunxunyong3 小时前
doris用户资源组配置
数据库
Cloud云卷云舒3 小时前
云卷云舒:HaishanDB的AI原生能力主要应用场景
数据库·人工智能·ai-native·haishandb·移动云长期记忆
时间的拾荒人3 小时前
MySQL 视图详解
android·数据库·mysql
qq_366086224 小时前
sql 查询中关于 null 值判断的问题
数据库·sql