当前位置: 首页 > news >正文

redisson tryLock

应用场景
RLock rLock = redissonClient.getLock(Constant_LOCK + request.getId());
try {boolean isLocked = rLock.tryLock();if (!isLocked) {throw new ServiceException(ErrConstant.OPERATION_FAILED, "请勿重复提交");}
源码
public interface RLock extends Lock, RLockAsync {String getName();void lockInterruptibly(long var1, TimeUnit var3) throws InterruptedException;boolean tryLock(long var1, long var3, TimeUnit var5) throws InterruptedException;void lock(long var1, TimeUnit var3);boolean forceUnlock();boolean isLocked();boolean isHeldByThread(long var1);boolean isHeldByCurrentThread();int getHoldCount();long remainTimeToLive();
}

实际上 

tryLock 是lock接口方法,redisson重写了

Redisson tryLock(long time, TimeUnit unit) 方法深度解析

Redisson 的 tryLock(long time, TimeUnit unit) 方法是分布式锁的核心 API 之一,下面我将从多个维度详细解析其工作原理和使用场景。

方法签名

java

boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException;

核心特性解析

1. 参数含义

  • waitTime:获取锁的最大等待时间

  • leaseTime:锁的持有时间(自动释放时间)

  • unit:时间单位

2. 返回值

  • true:成功获取锁

  • false:在等待时间内未获取到锁

底层实现机制

1. Redis 数据结构

使用 Hash 结构存储锁信息:

text

key: "lock_name"
field: "客户端ID:线程ID"
value: 重入次数

2. Lua 脚本原子操作

Redisson 通过 Lua 脚本保证原子性:

lua

-- 尝试获取锁的Lua脚本
if (redis.call('exists', KEYS[1]) == 0) thenredis.call('hincrby', KEYS[1], ARGV[2], 1)redis.call('pexpire', KEYS[1], ARGV[1])return nil
end
-- 已存在锁时的处理...

3. 看门狗机制(leaseTime = -1 时)

  • 默认情况下启动看门狗

  • 每 10 秒(默认)检查并续期锁

  • 保持锁直到显式释放

典型使用场景

1. 基本用法

java

RLock lock = redisson.getLock("myLock");
boolean isLocked = lock.tryLock(10, 30, TimeUnit.SECONDS);
try {if (isLocked) {// 业务逻辑}
} finally {if (isLocked) {lock.unlock();}
}

2. 不同参数组合效果

waitTimeleaseTime行为特点
0>0立即尝试,获取失败直接返回
>0>0在指定时间内循环尝试
>0-1获取成功后启动看门狗自动续期
0-1立即尝试+自动续期

异常处理要点

  1. InterruptedException

    • 等待期间线程被中断会抛出

    • 需要正确处理中断状态

  2. 锁续期失败

    • 看门狗续期失败会自动释放锁

    • 业务代码应实现幂等性

性能优化建议

  1. 合理设置等待时间

    • 避免设置过长的 waitTime

    • 根据业务平均处理时间设置 leaseTime

  2. 避免锁竞争

    java

    // 使用随机退避
    while (!lock.tryLock(50, 100, TimeUnit.MILLISECONDS)) {Thread.sleep(random.nextInt(100));
    }
  3. 监控建议

    • 监控锁等待时间

    • 设置锁等待超时告警

与其他方法的对比

方法特点适用场景
lock()阻塞直到获取锁必须获取锁的场景
tryLock()尝试获取,可设置超时有限等待的场景
tryLock(0, ...)立即尝试一次非阻塞快速失败场景

实现原理示意图

text

[客户端A] --(tryLock)--> [Redis服务器]|___ 1. 检查锁是否存在|___ 2. 不存在则获取锁|___ 3. 存在则等待重试|___ 4. 获取成功启动看门狗(leaseTime=-1)

使用注意事项

  1. 必须释放锁

    java

    try {if (lock.tryLock(...)) {// ...}
    } finally {lock.unlock();
    }
  2. 避免死锁

    • 确保 leaseTime > 业务执行时间

    • 或使用默认的看门狗机制

  3. 集群模式特殊处理

    • RedLock 算法需要多数节点确认

    • 网络分区时可能有脑裂问题


文章转载自:
http://centremost.wkuuf.cn
http://byzantinism.wkuuf.cn
http://baghdad.wkuuf.cn
http://arithmetical.wkuuf.cn
http://canarian.wkuuf.cn
http://cassandra.wkuuf.cn
http://ahf.wkuuf.cn
http://accessory.wkuuf.cn
http://brilliant.wkuuf.cn
http://aerostat.wkuuf.cn
http://basidiospore.wkuuf.cn
http://anthropography.wkuuf.cn
http://buildable.wkuuf.cn
http://brewage.wkuuf.cn
http://biocybernetics.wkuuf.cn
http://bullwork.wkuuf.cn
http://anilin.wkuuf.cn
http://awshucks.wkuuf.cn
http://cesarevitch.wkuuf.cn
http://bulginess.wkuuf.cn
http://cantor.wkuuf.cn
http://camstone.wkuuf.cn
http://bottom.wkuuf.cn
http://apsidal.wkuuf.cn
http://altiplano.wkuuf.cn
http://bazoo.wkuuf.cn
http://amphibian.wkuuf.cn
http://amok.wkuuf.cn
http://allosteric.wkuuf.cn
http://bissau.wkuuf.cn
http://www.dtcms.com/a/281575.html

相关文章:

  • React源码5 三大核心模块之一:render,renderRoot
  • MMYSQL刷题
  • 北京-4年功能测试2年空窗-报培训班学测开-第五十一天
  • Typecho插件开发:优化文章摘要处理短代码问题
  • 【跟我学YOLO】(2)YOLO12 环境配置与基本应用
  • PID(进程标识符,Process Identifier)是什么?
  • Markdown编辑器--editor.md的用法
  • GTSuite许可管理
  • 学习日志10 python
  • 【鲲苍提效】全面洞察用户体验,助力打造高性能前端应用
  • JAVA青企码协会模式系统源码支持微信公众号+微信小程序+H5+APP
  • vlan作业
  • CommunityToolkit.Mvvm IOC 示例
  • 【Java】JUC并发(线程的方法、多线程的同步并发)
  • 定时器更新中断与串口中断
  • ArrayList列表解析
  • GCC属性修饰符__attribute__((unused))用途
  • 2025国自然青基、面上资助率,或创新低!
  • IPSec和HTTPS对比(一)
  • Java使用itextpdf7生成pdf文档
  • GAMES101 lec1-计算机图形学概述
  • 前端-CSS-day4
  • 边缘计算中模型精度与推理速度的平衡策略及硬件选型
  • 实战长尾关键词SEO优化指南提升排名
  • Go语言调度器深度解析:sysmon的核心作用与实现原理
  • Web3.0 学习方案
  • ROS第十五梯:launch进阶用法——conda自启动和多终端多节点运行
  • Axios 和Express 区别对比
  • 前端打包自动压缩为zip--archiver
  • Bp神经网络公式导出方法