RLock类详细介绍、应用场景和示例代码
概述
org.redisson.api.RLock 是 Redisson 提供的 分布式可重入锁(类似 ReentrantLock),基于 Redis 实现,常用于 分布式环境 下的 并发控制。
1. RLock 详解
🔹 特点
- 基于 Redis 实现,支持 集群环境。
- 可重入,同一个线程可以多次获取同一把锁,不会被阻塞。
- 支持 WatchDog 机制,避免锁因宕机未手动释放而导致死锁。
- 支持超时自动释放,避免死锁问题。
- 支持公平锁、联锁、红锁等多种高级特性。
🔹 依赖
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.22.1</version>
</dependency>
🔹 获取 RLock
RedissonClient redissonClient = Redisson.create(); // 需要传入 Redis 配置
RLock lock = redissonClient.getLock("myLock");
2. RLock 常用方法
| 方法 | 说明 |
|---|---|
lock() | 阻塞式加锁(默认 WatchDog 续期) |
lock(long leaseTime, TimeUnit unit) | 加锁 + 设定过期时间,到期自动释放 |
tryLock() | 非阻塞式,如果获取不到锁立即返回 false |
tryLock(long waitTime, long leaseTime, TimeUnit unit) | 尝试获取锁,最长等待 waitTime,成功后 leaseTime 过期自动释放 |
unlock() | 释放锁 |
isLocked() | 判断锁是否被任意线程占用 |
isHeldByCurrentThread() | 判断当前线程是否持有锁 |
forceUnlock() | 强制释放锁,无论是谁持有锁 |
3. RLock 典型应用场景
✅ 1. 解决分布式环境下的并发问题
多个服务实例(如 A 和 B)同时访问共享资源时,防止并发冲突。
场景:多个线程同时对某个商品库存进行扣减操作,需要防止超卖。
public void reduceStock() {RLock lock = redissonClient.getLock("product_stock_lock");try {lock.lock(); // 加锁(默认30s自动续期)int stock = getStock();if (stock > 0) {updateStock(stock - 1);}} finally {lock.unlock(); // 释放锁}
}
⚠ 注意:如果 lock.lock() 后方法抛异常,未执行 unlock(),Redisson 默认使用 WatchDog 机制自动续期,不会发生死锁。
✅ 2. 限制用户重复提交
场景:用户短时间内重复提交订单,导致重复下单。
public String submitOrder(String userId) {RLock lock = redissonClient.getLock("order_lock:" + userId);boolean success = lock.tryLock();if (!success) {return "请勿重复提交";}try {processOrder();return "订单提交成功";} finally {lock.unlock();}
}
✅ 3. 分布式定时任务的幂等控制
场景:多个定时任务实例同时启动,保证同一时间只有一个任务执行。
public void executeTask() {RLock lock = redissonClient.getLock("task_lock");if (!lock.tryLock()) {return; // 其他实例已持有锁,当前实例不执行任务}try {performTask();} finally {lock.unlock();}
}
✅ 4. 秒杀场景:高并发库存扣减
场景:多用户高并发秒杀商品,避免超卖。
public boolean secKill(String productId) {RLock lock = redissonClient.getLock("sec_kill_lock:" + productId);try {if (lock.tryLock(100, 10, TimeUnit.MILLISECONDS)) {int stock = getStock(productId);if (stock > 0) {updateStock(productId, stock - 1);return true;}}} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}return false;
}
🔹 关键点
tryLock(100, 10, TimeUnit.MILLISECONDS)- 等待最长 100ms 获取锁
- 持有锁 10ms 后自动释放
- 适用于高并发业务,防止 Redis 长时间占用锁资源。
✅ 5. 订单支付超时取消
场景:订单创建 30 分钟未支付,自动取消订单。
public void setOrderExpire(String orderId) {RLock lock = redissonClient.getLock("order_expire_lock:" + orderId);lock.lock(30, TimeUnit.MINUTES); // 30 分钟后自动释放锁
}
4. RLock 可能存在的问题
| 问题 | 解决方案 |
|---|---|
| 锁未释放(死锁) | 1️⃣ lock.lock(leaseTime, TimeUnit.SECONDS) 设置超时2️⃣ 使用 WatchDog 机制 |
| Redis 宕机,锁丢失 | 采用 Redis 主从 + 哨兵,或者使用 Redisson RedLock |
| 线程异常退出,锁未释放 | 1️⃣ try-finally 释放锁2️⃣ lock.lock(leaseTime, TimeUnit.SECONDS) 设定过期时间 |
| 多个服务实例并发竞争锁 | 使用 tryLock(waitTime, leaseTime, TimeUnit.SECONDS) |
5. 进阶:Redisson 其他锁
| 锁类型 | 说明 |
|---|---|
RLock | 可重入锁 |
RReadWriteLock | 读写锁,读读共享,写独占 |
RFairLock | 公平锁,先请求的先获得锁 |
RMultiLock | 联锁,多个 RLock 绑定在一起 |
RedLock | 红锁,适用于 Redis 主从集群 |
RSemaphore | 信号量,类似 Java Semaphore |
RCountDownLatch | 分布式 CountDownLatch |
示例:读写锁
RReadWriteLock rwLock = redissonClient.getReadWriteLock("my_rw_lock");
rwLock.readLock().lock();
try {System.out.println("执行读操作...");
} finally {rwLock.readLock().unlock();
}
6. 总结
✅ RLock 是基于 Redis 实现的分布式锁,适用于高并发环境
✅ 支持可重入、超时释放、WatchDog 续期
✅ 适用于库存扣减、订单防重、定时任务、秒杀等场景
✅ 如果需要更高可靠性,可使用 RedLock
🔥 RLock 是分布式系统中控制并发的利器,但一定要合理设计超时机制,避免死锁和性能问题! 🚀
相关文章:
RLock类详细介绍、应用场景和示例代码
概述 org.redisson.api.RLock 是 Redisson 提供的 分布式可重入锁(类似 ReentrantLock),基于 Redis 实现,常用于 分布式环境 下的 并发控制。 1. RLock 详解 🔹 特点 基于 Redis 实现,支持 集群环境。可…...
bash: uwsgi: 未找到命令
针对你提出的“bash: uwsgi: command not found”问题,以下是一些可能的解决方案,请按照步骤逐一排查: 1、检查uwsgi命令是否正确: 确保你输入的命令是uwsgi,而不是uWSGI或其他变体。 2、确认uwsgi是否已安装&…...
基于数据挖掘的疾病数据可视化分析与预测系统
【大数据】基于数据挖掘的疾病数据可视化分析与预测系统(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 📌 技术核爆点:✔️ Python全栈开发Flask高能框架 ✔️ 爬虫技术…...
rv1106g2摄像头wlan0固定mac地址
wq9001无线网卡的mac地址是一个随机地址,在每次启动后,都会变更,使得dhcp分配的地址不同。要想有固定的mac地址,要做以下操作。 在文件uckfox-pico/sysdrv/drv_ko/wifi/insmod_wifi.sh添加函数wlan0_init wlan0_init() {wlan0add…...
企业日常工作中常用的 Linux 操作系统命令整理
Linux 操作系统命令整理 在企业级运维、开发和日常工作中,Linux 命令是绕不开的核心技能。不论是日志排查、进程管理,还是高效运维优化,掌握这些命令都能让你事半功倍!本篇文章整理了自己在日常工作中积累最常用的 Linux 命令&am…...
AutoGen学习笔记系列(六)Tutorial - Termination
这篇文章瞄准的是AutoGen框架官方教程中的 Tutorial 章节中的 Termination 小节,主要介绍了更细粒度上图如何终止Team组内轮询的过程。 官网链接:https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/tutorial/termination.ht…...
用IdleHandler来性能优化及原理源码分析
背景: 经常在做一些app冷启动速度优化等性能优化工作时候,经常可能会发现有时候需要引入一些第三方sdk,或者库,这些库一般会要求我们在onCreate中进行初始化等,但是onCreate属于生命周期的回调方法,如果on…...
git忽略特定文件或者文件夹
如果想让 Git 忽略指定目录,不进行更新或提交,可以使用 .gitignore 文件进行配置。 🛠 方法:使用 .gitignore 忽略目录 1️⃣ 在仓库根目录创建 .gitignore 文件 如果你的项目目录下还没有 .gitignore 文件,可以新建…...
STM32使用无源蜂鸣器
1.1 介绍: 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定 无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同…...
VMware 安装部署RHEL9
目录 目标一:创建名为RHEL9_node2的虚拟机 1.环境搭建:VMware 2.下载RHEL9的ISO镜像(官网可获取) 3.打开VMware,新建虚拟机 3.1 自定义安装 3.2 默认操纵至下一步操作到稍后安装系统 3.3选择操作系统为linux以及…...
智能机器人学习机WT3000A AI芯片方案-自然语音交互 打造沉浸式学习体验
一、概述 当AI浪潮席卷全球,教育领域也未能幸免。AI学习机,这个打着“个性化学习”、“精准提分”旗号的新兴产品,正以惊人的速度占领市场。从一线城市到偏远乡镇,从学龄前儿童到高考备考生,AI学习机的广告铺天盖地&am…...
阿里推出全新推理模型(因果语言模型),仅1/20参数媲美DeepSeek R1
阿里Qwen 团队正式发布了他们最新的研究成果——QwQ-32B大语言模型!这款模型不仅名字萌萌哒(QwQ),实力更是不容小觑!😎 QwQ-32B 已在 Hugging Face 和 ModelScope 开源,采用了 Apache 2.0 开源协议。大家可通过 Qwen C…...
20250307学习记录
大家早上好呀,今天早上七点四十就起床了 第一部分,修改一下任务 完成 第二部分,整理MODIS数据 2023-5-30-GEE-土地覆盖处理_mcd12q1.061-CSDN博客 看完这个博客,我有了大致的思路 编写代码转换为tiff,并且将不同…...
设计模式-创建型模式详解
这里写目录标题 一、基本概念二、单例模式1. 模式特点2. 适用场景3. 实现方法4. 经典示例 三、简单工厂模式1. 模式特点2. 经典示例 四、工厂方法模式五、抽象工厂模式1. 适用场景2. 经典示例 六、建造者模式1. 模式特点2. 一般流程3. 适用场景4. 经典示例 七、原型模式 一、基…...
【蓝桥杯】每天一题,理解逻辑(2/90)【LeetCode 复写零】
闲话系列:每日一题,秃头有我,Hello!!!!!,我是IF‘Maxue,欢迎大佬们来参观我写的蓝桥杯系列,我好久没有更新博客了,因为up猪我寒假用自己的劳动换了…...
米尔基于STM32MP25x核心板Debian系统发布,赋能工业设备
一、系统概述 MYD-LD25X搭载的Debian系统包含以太网、WIFI/BT、USB、RS485、RS232、CAN、AUDIO、HDMI显示和摄像头等功能,同时也集成了XFCE轻量化桌面、VNC远程操控、SWITCH网络交换和TSN时间敏感网络功能,为工业设备赋予“超强算力实时响应极简运维”的…...
ES02 - ES语句
ES语句 文章目录 ES语句一:连接和基本的使用1:显示详细信息2:输出可显示列3:查看分片 二:Http接口 - 索引(数据库)的增删改2.1:插入数据2.2:删除数据2.3:更新数据2.3.1:P…...
C++ 学生成绩管理系统
一、项目背景与核心需求 成绩管理系统是高校教学管理的重要工具,本系统采用C++面向对象编程实现,主要功能模块包括: 学生信息管理(学号/姓名/3门课程成绩) 成绩增删改查(CRUD)操作 数据持久化存储 统计分析与报表生成 用户友好交互界面 二、系统架构设计 1. 类结构设计 …...
项目管理工具 Maven
目录 1.Maven的概念 1.1什么是Maven 1.2什么是依赖管理 1.3什么是项目构建 1.4Maven的应用场景 1.5为什么使用Maven 1.6Maven模型 2.初识Maven 2.1Maven安装 2.1.1安装准备 2.1.2Maven安装目录分析 2.1.3Maven的环境变量 2.2Maven的第一个项目 2.2.1按照约…...
设计心得——分层和划分模块
一、分层 在实际的设计开发过程中,对于稍微大一些的项目,基本都涉及到分层。什么是分层呢?其实非常简单,就是利用某种逻辑或域的范围等把整个项目划分成多个层次。它们之间通过接口(可能是简单的函数接口也可以是服务…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
