redisson常用加锁方式详解

 更新时间:2026年01月16日 08:38:18   作者:清梦压星河_Ciao  
文章介绍了两种Redisson加锁方式的区别:基本的RLock方式和使用RedissonDistributedLocker的tryLock方式,RLock需要手动处理锁的等待和持有时间,而tryLock则提供了更高层次的封装,简化了锁的操作,并且在超时后会自动返回或释放锁
RLock lock = redissonClient.getLock("lock:order:" + order);

redissonDistributedLocker.tryLock("lock:order:" + order, TimeUnit.SECONDS, RedisLockKey.DEFAULT_WAIT_TIME, RedisLockKey.DEFAULT_HOLD_TIME);

这两种加锁方式的区别如下:

1、基本的加锁方式 (RLock)

RLock lock = redissonClient.getLock("lock:order:" + order);
  • 获取锁: 通过 redissonClient.getLock() 获取一个 RLock 对象,并且传入一个键(key),这个键可以是任何字符串。这里的键是 "lock:order:" + order,它通常是基于某个业务标识(比如订单号)来唯一标识锁的。这样,每个订单的锁就是唯一的,其他订单不会被影响。
  • 锁的操作: 可以使用 lock.lock() 来请求锁,lock.unlock() 来释放锁。它还支持带超时的锁,例如 lock.tryLock(long waitTime, long leaseTime, TimeUnit unit),这可以控制等待的时间和锁的持有时间。
  • 锁的特点: 这种方式是直接通过 Redisson API 操作锁的基础方式,较为简单和直接。

2、使用 RedissonDistributedLocker.tryLock()

redissonDistributedLocker.tryLock("lock:order:" + order,
                 TimeUnit.SECONDS,
                 RedisLockKey.DEFAULT_WAIT_TIME,
                 RedisLockKey.DEFAULT_HOLD_TIME);

获取锁:

  • redissonDistributedLocker 是一个封装了 Redisson 锁操作的工具类,它通常用于对锁的获取和释放进行更高层次的封装和抽象。
  • tryLock 是尝试获取锁的方法,可以指定等待时间和锁持有时间。"lock:order:" + order作为锁的 key

tryLock 方法通常有以下几个参数:

  • 锁的名称: 即锁的 key,这里传入了一个包含业务标识的值。
  • 等待时间: 即如果锁被占用,最多等待的时间,单位通常是秒或毫秒。
  • 持有时间: 获取到锁后,锁自动过期的时间,也就是锁的最大持有时间。即使操作没有结束,锁也会在这个时间后自动释放。
  • 单位: 时间单位,可以是秒、毫秒等。

锁的操作:

  • tryLock 会尝试获取锁,如果锁被占用,且没有在 DEFAULT_WAIT_TIME 规定的时间内成功获取锁,则会放弃,返回 false。
  • 如果获取成功,则锁会在 DEFAULT_HOLD_TIME 时间后自动释放。这个机制有助于避免死锁和长时间占用锁。

3、主要区别

封装和简化:

  • redissonDistributedLocker.tryLock() 是对 Redisson 锁操作的封装,提供了更高层次的 API,使得锁的操作更加简便且灵活,减少了需要手动处理的锁等待和持有时间等逻辑。
  • 相比之下,直接使用 RLock 的方法可能需要你手动处理更多的逻辑(如等待、超时等)。

锁的超时管理:

  • RLock 本身提供了 lock() 和 tryLock() 方法,可以通过 tryLock(long waitTime, long leaseTime, TimeUnit unit)来设置等待时间和锁持有时间。
  • redissonDistributedLocker.tryLock() 通过封装的方式,简化了这种超时管理,它会在超时后自动返回失败或自动释放锁,减少了代码的复杂度。

使用场景:

  • RLock 适用于你需要更多控制或者自定义逻辑的场景,比如需要自己处理锁等待时间、持有时间等。
  • redissonDistributedLocker 更适合在业务中封装常见的分布式锁操作,它提供了简单的 API 以便快速实现分布式锁,特别是当你有一套统一的锁处理逻辑时。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java方法重写的超详细讲解

    Java方法重写的超详细讲解

    在 Java 编程的精彩世界里,方法重写是一项极为重要且实用的特性,它犹如一把神奇的钥匙,为我们开启了面向对象编程中多态性的大门,今天,就让我们一同深入探索 Java 方法重写的奥秘,感兴趣的小伙伴跟着小编一起来看看吧
    2025-03-03
  • java的jps命令使用详解

    java的jps命令使用详解

    这篇文章介绍了java的jps命令使用详解,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 防止SpringBoot程序崩溃的几种方式汇总

    防止SpringBoot程序崩溃的几种方式汇总

    本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配置,这些方法有助于提高应用程序的稳定性和可靠性,需要的朋友可以参考下
    2025-05-05
  • Spring注解之@validated使用详解

    Spring注解之@validated使用详解

    spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理,这篇文章主要介绍了Spring注解之@validated使用,需要的朋友可以参考下
    2023-01-01
  • Java中的静态内部类详解及代码示例

    Java中的静态内部类详解及代码示例

    这篇文章主要介绍了Java中的静态内部类详解及代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • springboot单元测试依赖踩坑记录

    springboot单元测试依赖踩坑记录

    这篇文章主要介绍了springboot单元测试依赖踩坑记录及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 教你使用IDEA搭建spring源码阅读环境的详细步骤

    教你使用IDEA搭建spring源码阅读环境的详细步骤

    这篇文章主要介绍了使用IDEA搭建spring源码阅读环境的详细步骤,本文分两步通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-08-08
  • 微信js-sdk+JAVA实现“分享到朋友圈”和“发送给朋友”功能详解

    微信js-sdk+JAVA实现“分享到朋友圈”和“发送给朋友”功能详解

    本文分享了微信js-sdk+JAVA实现“分享到朋友圈”和“发送给朋友”功能介绍,大家可以参考一下
    2018-03-03
  • SpringMVC的五大核心组件用法及说明

    SpringMVC的五大核心组件用法及说明

    这篇文章主要介绍了SpringMVC的五大核心组件用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • MyBatis批量插入的几种方式效率比较

    MyBatis批量插入的几种方式效率比较

    最近工作中遇到了解析excel,然后批量插入,发现这个插入时间比较长,所以想要进行一些优化,下面这篇文章主要给大家介绍了关于MyBatis批量插入的几种方式效率比较的相关资料,需要的朋友可以参考下
    2021-09-09

最新评论