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.pswp.cn/bicheng/89067.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端docx库实现将html页面导出word

前言:最近遇到一个需求,需要将页面的html导出为word文档,并且包含横向和竖向页面,并且可以进行混合方向导出。经过一段时间的实验,发现只有docx这个库满足这个要求。在这里记录一下实现思路以及代码。 docx官网 一、…

虚拟主机CPU占用100导致打不开的一次处理

背景 突然有一天,有个客户网站打不开了,发来这样一张图片问题排查 打开阿里云虚拟主机控制面板,CPU 使用率已经达到了100%,这说明网站已经在高负荷运转。分析访问日志发现,网站出现了大量循环路径,其 UserA…

设计模式之工厂模式:对象创建的智慧之道

工厂模式:对象创建的智慧之道 引言:为什么我们需要工厂模式? 在软件开发中,对象创建是最常见的操作之一。当代码中充满new关键字时,系统会面临三大痛点: 紧耦合:客户端代码直接依赖具体实现类扩…

Docker镜像制作案例

1、使用Docker commit制作镜像为ubuntu镜像提供ssh服务①:拉取镜像[rootopenEuler-1 ~]# docker pull ubuntu:18.04②:启动镜像[rootopenEuler-1 ~]# docker run --name c1 -it --rm ubuntu:18.04 bash③:替换aliyun源mv /etc/apt/sources.li…

KeilMDK5如何生成.bin文件

1:主要是要找到fromelf.exe的路径2:接下来要做的要视情况而定:选完fromelf.exe后在输入框中加个空格然后加一串字 : --bin -o ./Obj/L.bin ./Obj/L.axf,如下我设置的L最终会替换成项目名 3:去构建生成编译一下&#…

Ajax接收java后端传递的json对象包含长整型被截断导致丢失精度的解决方案

问题描述 在使用java编写代码的时候,后端返回前端的JSON对象中包含了Long长整型,前端接受的时候丢失了精度问题。 比如: 后端传递的json {"code": "200","msg": "操作成功","data":

MybatisPlus由浅入深

MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;旨在简化开发过程。基本使用步骤1.依赖引入<!-- mysql依赖 --> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>…

蓝牙信号强度(RSSI)与链路质量(LQI)的测量与应用:面试高频考点与真题解析

在蓝牙通信领域&#xff0c;信号强度&#xff08;RSSI&#xff09;和链路质量&#xff08;LQI&#xff09;是评估无线链路性能的核心指标。无论是智能家居设备的连接优化&#xff0c;还是工业物联网中的抗干扰设计&#xff0c;这两个指标都扮演着关键角色。本文将结合面试高频考…

PyTorch的计算图是什么?为什么绘图前要detach?

在PyTorch中&#xff0c;计算图&#xff08;Computational Graph&#xff09; 是自动求导&#xff08;Autograd&#xff09;的核心机制。理解计算图有助于解释为什么在绘图前需要使用 .detach() 方法分离张量。一、什么是计算图&#xff1f; 计算图是一种有向无环图&#xff08…

深度学习入门代码详细注释-ResNet18分类蚂蚁蜜蜂

本项目将基于PyTorch平台迁移ResNet18模型。该模型原采用ImageNet数据集&#xff08;含1000个图像类别&#xff09;进行训练。我们将尝试运用该模型对蚂蚁和蜜蜂进行分类&#xff08;这两个类别未包含在原训练数据集中&#xff09;。 本文的原始代码参考于博客深度学习入门项目…

北京饮马河科技公司 Java 实习面经

北京饮马河科技公司 Java 实习面经 本文作者&#xff1a;程序员小白条 本站地址&#xff1a;https://xbt.xiaobaitiao.top 1&#xff09; 面试官&#xff1a;我看你这块是有一个开源的项目&#xff0c;这个项目主要是做什么的&#xff1f; 我&#xff1a;主要两点是亮点&…

java基础(day07)

目录 OOP编程 方法 方法的调用&#xff1a; 在main入口函数中调用&#xff1a; 动态参数&#xff1a; 方法重载 OOP编程 方法 概念&#xff1a;指为获得某种东西或达到某种目的而采取的手段与行为方式。有时候被称作“方法”&#xff0c;有时候被称作“函数”。例如UUID.…

使用EasyExcel动态合并单元格(模板方法)

1、导入EasyExcel依赖<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.3</version> </dependency>2、编写实体类Data publci class Student{ ExcelProperty("姓名")pri…

jenkins 流水线比较简单直观的

//全篇没用自定义变量pipeline {agent any// 使用工具自动配置Node.js环境tools {nodejs nodejs22 // 需在Jenkins全局工具中预配置该名称的Node.js安装}//下面拉取代码通过的是流水线片段生成的stages {stage(Checkout Code) {steps {git branch: release-v1.2.6,credentials…

CV目标检测中的LetterBox操作

LetterBox类比理解&#xff1a;想象你要把一张任意形状的照片放进一个正方形的相框里&#xff0c;照片不能变形拉伸&#xff0c;所以你先等比例缩小照片&#xff0c;然后在空余的地方填上灰色背景。第1章 数学原理当我们有一个原始图像的尺寸为 19201080&#xff08;宽高&#…

Leetcode 3614. Process String with Special Operations II

Leetcode 3614. Process String with Special Operations II 1. 解题思路2. 代码实现 题目链接&#xff1a;3614. Process String with Special Operations II 1. 解题思路 这一题思路上是一个逆推的思路。 首先&#xff0c;我们顺序走一轮不难得到最终我们能够获得的字符串…

.NET ExpandoObject 技术原理解析

&#x1f31f; .NET ExpandoObject 技术原理解析 引用&#xff1a; .NET 剖析4.0上ExpandoObject动态扩展对象原理风潇潇人渺渺快意刀山中草 #mermaid-svg-RtpHctpdchPPN1Xo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mer…

放苹果(信息学奥赛一本通-T1192)

【题目描述】把M个同样的苹果放在N个同样的盘子里&#xff0c;允许有的盘子空着不放&#xff0c;问共有多少种不同的分法&#xff1f;&#xff08;用K表示&#xff09;5&#xff0c;1&#xff0c;1和1&#xff0c;5&#xff0c;1 是同一种分法。【输入】第一行是测试数据的数目…

(懒人救星版)CNN_Kriging_NSGA2_Topsis(多模型融合典范)深度学习+SCI热点模型+多目标+熵权法 全网首例,完全原创,早用早发SCI

全网首例&#xff0c;完全原创&#xff0c;早用早发SCI&#xff08;多模型融合典范&#xff09;机器学习SCI热点模型多目标熵权法(懒人救星版)BP_Kriging_NSGA2_Topsis 改进克里金工作量大&#xff1a;多模型融合创新性&#xff1a;首次结合BP神经网络和克里金多目标利用 BP神…

LeetCode热题100【第一天】

第一题 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返回…