当前位置: 首页 > 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://www.xdnf.cn/news/1127899.html

相关文章:

  • Spring MVC2
  • 尚庭公寓-----day1----@MapperScan爆红问题
  • 三十二、【核心功能改造】数据驱动:重构仪表盘与关键指标可视化
  • 【转】Rust: PhantomData,#may_dangle和Drop Check 真真假假
  • 【字节跳动】数据挖掘面试题0019:带货直播间推荐:现在有一个带货的直播间,怎么把它精准地推送给有需要的用户
  • 【C++】神奇的AVL树
  • WebView JSBridge 无响应问题排查实录 全流程定位桥接调用失效
  • 无人机故障响应模块运行与技术难点
  • Ubuntu24 辅助系统-屏幕键盘的back按键在网页文本框删除不正常的问题解决方法
  • RTL编程中常用的几种语言对比
  • 【C#地图显示教程:实现鼠标绘制图形操作】
  • 厂区车辆导航系统:基于 GPS+AI 动态路径规划的技术实现与实践
  • 春秋云镜 initial
  • 2025开放原子开源生态大会 | openKylin的技术跃迁和全球协作
  • 2025开放原子开源生态大会 | 开源欧拉的AI原生实践与全球协作
  • GaussDB 数据库架构师修炼(三) 集群管理概览
  • 李宏毅《生成式人工智能导论》 | 第11讲-第14讲:大型语言模型的可解释性、能力评估、安全性
  • React源码5 三大核心模块之一:render,renderRoot
  • docker-compose 配置启动2个MongoDB
  • 【Docker基础】Dockerfile构建与运行流程完全指南:从原理到实践优化
  • PostgreSQL 超详细安装与使用教程:从入门到实战
  • Axios 和Express 区别对比
  • 使用LNMP一键安装包安装PHP、Nginx、Redis、Swoole、OPcache
  • Linux系统调优和工具
  • 理解 HTTP POST 请求中的 json 和 data 参数
  • 【目标追踪】MUTR3D: A Multi-camera Tracking Framework via 3D-to-2D Queries
  • 快速了解 HTTPS
  • 【BUG处理】构建APK时遇到错误:‘flutter‘ 命令未被识别。这通常表示您的系统中未安装Flutter SDK或环境变量配置不正确。
  • 【亲测有效】ubuntu20.04服务器新建用户+vnc配置教程
  • 基于按键开源MultiButton框架深入理解代码框架(二)(指针的深入理解与应用)