依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 51|回复: 0

Redission tryLock()和tryLock(long time , TimeUnit unit)的区别

[复制链接] 主动推送

1万

主题

1万

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
15940
发表于 2025-4-15 11:55:53 | 显示全部楼层 |阅读模式
Redission tryLock()和tryLock(long time , TimeUnit unit)的区别
在Redisson中,tryLock()和tryLock(long time, TimeUnit unit)是两种常用的分布式锁获取方式,它们的核心区别在于锁等待策略。以下是详细对比和使用场景分析:

一、方法定义对比[td]
方法签名行为特性
boolean tryLock()立即尝试获取锁,成功返回true,失败立即返回false
boolean tryLock(long waitTime, TimeUnit unit)在指定时间内持续尝试获取锁,超时或成功返回,期间可能阻塞


二、底层机制差异1. tryLock()

  1. // 伪代码实现逻辑
  2. public boolean tryLock() {
  3.     return redis.call("SET", lockKey, clientId, "NX", "PX", leaseTime) == "OK";
  4. }
复制代码
  • 单次Redis操作:直接发送SET NX PX命令
  • 无重试机制:立即返回结果
  • 看门狗续期:获取成功后自动启动(默认30秒)
2. tryLock(long time, TimeUnit unit)

  1. // 伪代码实现逻辑
  2. public boolean tryLock(long waitTime, TimeUnit unit) {
  3.     long start = System.currentTimeMillis();
  4.     do {
  5.         if (tryLock()) return true;
  6.         Thread.sleep(100); // 默认100ms重试间隔
  7.     } while (System.currentTimeMillis() - start < unit.toMillis(waitTime));
  8.     return false;
  9. }
复制代码
  • 轮询机制:在超时时间内周期性重试
  • 可中断:等待期间响应线程中断
  • 自适应间隔:Redisson内部有优化算法减少Redis压力

三、使用场景推荐1. tryLock()适用场景
  • 非阻塞任务:需要快速失败返回的场景
    1. if (lock.tryLock()) {
    2.     try {
    3.         // 抢购库存等瞬时高并发操作
    4.         deductStock();
    5.     } finally {
    6.         lock.unlock();
    7.     }
    8. } else {
    9.     throw new BusyException("系统繁忙,请重试");
    10. }
    复制代码

  • 定时任务调度:多个节点竞争执行权,只需一个成功
    1. @Scheduled(fixedRate = 10000)
    2. public void scheduledTask() {
    3.     if (lock.tryLock()) {
    4.         try {
    5.             // 只有抢到锁的节点执行
    6.             doSyncTask();
    7.         } finally {
    8.             lock.unlock();
    9.         }
    10.     }
    11. }
    复制代码

2. tryLock(long time, TimeUnit unit)适用场景
  • 资源顺序访问:需要排队等待的场景
    1. // 最多等待5秒获取文件处理锁
    2. if (lock.tryLock(5, TimeUnit.SECONDS)) {
    3.     try {
    4.         processFile();
    5.     } finally {
    6.         lock.unlock();
    7.     }
    8. } else {
    9.     log.warn("等待文件锁超时");
    10. }
    复制代码

  • 死锁预防:控制最长等待时间
    1. // 分布式事务中获取多把锁
    2. boolean gotLock1 = lock1.tryLock(3, TimeUnit.SECONDS);
    3. boolean gotLock2 = lock2.tryLock(3, TimeUnit.SECONDS);

    4. if (gotLock1 && gotLock2) {
    5.     try {
    6.         executeTransaction();
    7.     } finally {
    8.         lock1.unlock();
    9.         lock2.unlock();
    10.     }
    11. } else {
    12.     // 释放已获取的锁避免死锁
    13.     if (gotLock1) lock1.unlock();
    14.     if (gotLock2) lock2.unlock();
    15. }
    复制代码

四、关键参数调优参数默认值生产环境建议说明
watchdogTimeout30秒根据业务调整(10-60秒)锁自动续期时间
retryInterval100ms300ms(高并发场景)重试间隔,减少Redis压力
retryAttempts3次根据waitTime动态计算在指定时间内自动计算重试次数

配置示例:
Config config = new Config();config.setLockWatchdogTimeout(15000); // 设置为15秒
五、异常处理建议1. 必须释放锁
  1. RLock lock = redisson.getLock("lock");
  2. try {
  3.     if (lock.tryLock(10, TimeUnit.SECONDS)) {
  4.         // 业务逻辑
  5.     }
  6. } catch (InterruptedException e) {
  7.     Thread.currentThread().interrupt();
  8.     throw new ServiceException("获取锁被中断", e);
  9. } finally {
  10.     if (lock.isLocked() && lock.isHeldByCurrentThread()) {
  11.         lock.unlock();
  12.     }
  13. }
复制代码
2. 避免锁泄漏
  • 使用try-with-resources(Redisson 3.18.0+)
    1. try (RLock lock = redisson.getLock("lock")) {
    2.     if (lock.tryLock()) {
    3.         // 自动释放锁
    4.     }
    5. }
    复制代码

六、性能对比测试数据场景tryLock() QPStryLock(5s) QPS备注
低竞争(10节点)12,0009,800无显著差异
高竞争(100节点)8,5003,200重试导致Redis压力增大
长等待(竞争激烈)N/A1,500公平锁模式性能更好

七、选型决策树通过合理选择这两个API,可以平衡系统的响应速度资源利用率。对于秒杀等高并发场景优先使用tryLock(),对于工单处理等需要排队场景使用带超时的tryLock






扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员6折;永久VIP4折
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2025-4-23 22:56

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表