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

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. 解决分布式环境下的并发问题

多个服务实例(如 AB)同时访问共享资源时,防止并发冲突。

场景:多个线程同时对某个商品库存进行扣减操作,需要防止超卖。

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 提供的 分布式可重入锁&#xff08;类似 ReentrantLock&#xff09;&#xff0c;基于 Redis 实现&#xff0c;常用于 分布式环境 下的 并发控制。 1. RLock 详解 &#x1f539; 特点 基于 Redis 实现&#xff0c;支持 集群环境。可…...

bash: uwsgi: 未找到命令

针对你提出的“bash: uwsgi: command not found”问题&#xff0c;以下是一些可能的解决方案&#xff0c;请按照步骤逐一排查&#xff1a; ‌1、检查uwsgi命令是否正确‌&#xff1a; 确保你输入的命令是uwsgi&#xff0c;而不是uWSGI或其他变体。 ‌2、确认uwsgi是否已安装‌&…...

基于数据挖掘的疾病数据可视化分析与预测系统

【大数据】基于数据挖掘的疾病数据可视化分析与预测系统&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 &#x1f4cc; 技术核爆点&#xff1a;✔️ Python全栈开发Flask高能框架 ✔️ 爬虫技术…...

rv1106g2摄像头wlan0固定mac地址

wq9001无线网卡的mac地址是一个随机地址&#xff0c;在每次启动后&#xff0c;都会变更&#xff0c;使得dhcp分配的地址不同。要想有固定的mac地址&#xff0c;要做以下操作。 在文件uckfox-pico/sysdrv/drv_ko/wifi/insmod_wifi.sh添加函数wlan0_init wlan0_init() {wlan0add…...

企业日常工作中常用的 Linux 操作系统命令整理

Linux 操作系统命令整理 在企业级运维、开发和日常工作中&#xff0c;Linux 命令是绕不开的核心技能。不论是日志排查、进程管理&#xff0c;还是高效运维优化&#xff0c;掌握这些命令都能让你事半功倍&#xff01;本篇文章整理了自己在日常工作中积累最常用的 Linux 命令&am…...

AutoGen学习笔记系列(六)Tutorial - Termination

这篇文章瞄准的是AutoGen框架官方教程中的 Tutorial 章节中的 Termination 小节&#xff0c;主要介绍了更细粒度上图如何终止Team组内轮询的过程。 官网链接&#xff1a;https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/tutorial/termination.ht…...

用IdleHandler来性能优化及原理源码分析

背景&#xff1a; 经常在做一些app冷启动速度优化等性能优化工作时候&#xff0c;经常可能会发现有时候需要引入一些第三方sdk&#xff0c;或者库&#xff0c;这些库一般会要求我们在onCreate中进行初始化等&#xff0c;但是onCreate属于生命周期的回调方法&#xff0c;如果on…...

git忽略特定文件或者文件夹

如果想让 Git 忽略指定目录&#xff0c;不进行更新或提交&#xff0c;可以使用 .gitignore 文件进行配置。 &#x1f6e0; 方法&#xff1a;使用 .gitignore 忽略目录 1️⃣ 在仓库根目录创建 .gitignore 文件 如果你的项目目录下还没有 .gitignore 文件&#xff0c;可以新建…...

STM32使用无源蜂鸣器

1.1 介绍&#xff1a; 有源蜂鸣器&#xff1a;内部自带振荡源&#xff0c;将正负极接上直流电压即可持续发声&#xff0c;频率固定 无源蜂鸣器&#xff1a;内部不带振荡源&#xff0c;需要控制器提供振荡脉冲才可发声&#xff0c;调整提供振荡脉冲的频率&#xff0c;可发出不同…...

VMware 安装部署RHEL9

目录 目标一&#xff1a;创建名为RHEL9_node2的虚拟机 1.环境搭建&#xff1a;VMware 2.下载RHEL9的ISO镜像&#xff08;官网可获取&#xff09; 3.打开VMware&#xff0c;新建虚拟机 3.1 自定义安装 3.2 默认操纵至下一步操作到稍后安装系统 3.3选择操作系统为linux以及…...

智能机器人学习机WT3000A AI芯片方案-自然语音交互 打造沉浸式学习体验

一、概述 当AI浪潮席卷全球&#xff0c;教育领域也未能幸免。AI学习机&#xff0c;这个打着“个性化学习”、“精准提分”旗号的新兴产品&#xff0c;正以惊人的速度占领市场。从一线城市到偏远乡镇&#xff0c;从学龄前儿童到高考备考生&#xff0c;AI学习机的广告铺天盖地&am…...

阿里推出全新推理模型(因果语言模型),仅1/20参数媲美DeepSeek R1

阿里Qwen 团队正式发布了他们最新的研究成果——QwQ-32B大语言模型&#xff01;这款模型不仅名字萌萌哒(QwQ)&#xff0c;实力更是不容小觑&#xff01;&#x1f60e; QwQ-32B 已在 Hugging Face 和 ModelScope 开源&#xff0c;采用了 Apache 2.0 开源协议。大家可通过 Qwen C…...

20250307学习记录

大家早上好呀&#xff0c;今天早上七点四十就起床了 第一部分&#xff0c;修改一下任务 完成 第二部分&#xff0c;整理MODIS数据 2023-5-30-GEE-土地覆盖处理_mcd12q1.061-CSDN博客 看完这个博客&#xff0c;我有了大致的思路 编写代码转换为tiff&#xff0c;并且将不同…...

设计模式-创建型模式详解

这里写目录标题 一、基本概念二、单例模式1. 模式特点2. 适用场景3. 实现方法4. 经典示例 三、简单工厂模式1. 模式特点2. 经典示例 四、工厂方法模式五、抽象工厂模式1. 适用场景2. 经典示例 六、建造者模式1. 模式特点2. 一般流程3. 适用场景4. 经典示例 七、原型模式 一、基…...

【蓝桥杯】每天一题,理解逻辑(2/90)【LeetCode 复写零】

闲话系列&#xff1a;每日一题&#xff0c;秃头有我&#xff0c;Hello&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;,我是IF‘Maxue&#xff0c;欢迎大佬们来参观我写的蓝桥杯系列&#xff0c;我好久没有更新博客了&#xff0c;因为up猪我寒假用自己的劳动换了…...

米尔基于STM32MP25x核心板Debian系统发布,赋能工业设备

一、系统概述 MYD-LD25X搭载的Debian系统包含以太网、WIFI/BT、USB、RS485、RS232、CAN、AUDIO、HDMI显示和摄像头等功能&#xff0c;同时也集成了XFCE轻量化桌面、VNC远程操控、SWITCH网络交换和TSN时间敏感网络功能&#xff0c;为工业设备赋予“超强算力实时响应极简运维”的…...

ES02 - ES语句

ES语句 文章目录 ES语句一&#xff1a;连接和基本的使用1&#xff1a;显示详细信息2&#xff1a;输出可显示列3&#xff1a;查看分片 二&#xff1a;Http接口 - 索引(数据库)的增删改2.1&#xff1a;插入数据2.2&#xff1a;删除数据2.3&#xff1a;更新数据2.3.1&#xff1a;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按照约…...

设计心得——分层和划分模块

一、分层 在实际的设计开发过程中&#xff0c;对于稍微大一些的项目&#xff0c;基本都涉及到分层。什么是分层呢&#xff1f;其实非常简单&#xff0c;就是利用某种逻辑或域的范围等把整个项目划分成多个层次。它们之间通过接口&#xff08;可能是简单的函数接口也可以是服务…...

Unsloth Docker部署详解:从零开始搭建训练环境

Unsloth Docker部署详解&#xff1a;从零开始搭建训练环境 1. 环境准备与Docker安装 1.1 系统要求检查 在开始之前&#xff0c;请确保你的系统满足以下基本要求&#xff1a; 64位Linux系统&#xff08;推荐Ubuntu 22.04&#xff09;NVIDIA显卡驱动已安装&#xff08;建议版…...

vLLM-v0.17.1实战案例:为AI编程助手提供毫秒级代码补全服务

vLLM-v0.17.1实战案例&#xff1a;为AI编程助手提供毫秒级代码补全服务 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库&#xff0c;其核心目标是提供极致的推理速度和易用性。这个项目最初由加州大学伯克利分校的天空计算实验室开发&#xff0c;…...

STM32F103 Bootloader跳转失败?别急着怀疑Boot,先检查你的裸机APP中断向量表

STM32F103 Bootloader跳转失败&#xff1f;别急着怀疑Boot&#xff0c;先检查你的裸机APP中断向量表 当你的STM32F103项目采用HAL库Bootloader搭配裸机应用程序&#xff08;APP&#xff09;时&#xff0c;如果遇到Bootloader能正常启动HAL版本的APP却无法跳转裸机APP的情况&…...

为什么你的Flask农业API总在灌溉高峰期崩?Python高并发部署的4层熔断架构设计(实测QPS提升6.8倍)

第一章&#xff1a;为什么你的Flask农业API总在灌溉高峰期崩&#xff1f;Python高并发部署的4层熔断架构设计&#xff08;实测QPS提升6.8倍&#xff09; 当全省智能灌溉系统在每日清晨5:00–7:00集中调度水阀、上传土壤墒情数据时&#xff0c;基于默认配置的Flask API常出现进程…...

vLLM实战:手把手教你用LLMEngine构建高效推理服务(附代码解析)

vLLM实战&#xff1a;从零构建高性能大模型推理服务的工程指南 当大语言模型从实验室走向生产环境时&#xff0c;如何实现高吞吐、低延迟的推理服务成为工程化落地的关键挑战。vLLM作为当前最受关注的开源推理框架之一&#xff0c;其核心组件LLMEngine的设计理念值得每一位AI工…...

Gorgonia性能优化终极指南:10个技巧让你的深度学习模型运行速度翻倍

Gorgonia性能优化终极指南&#xff1a;10个技巧让你的深度学习模型运行速度翻倍 【免费下载链接】gorgonia 项目地址: https://gitcode.com/gh_mirrors/gor/gorgonia Gorgonia是一个功能强大的深度学习框架&#xff0c;能够帮助开发者构建和训练复杂的神经网络模型。然…...

基于LSTM的短期电力负荷预测研究

【负荷预测】基于LSTM短期负荷预测&#xff0c;可考虑需求响应 短期电力负荷预测在电力系统的调度、生产和规划中起着重要的作用&#xff0c;精准的负荷预测有利于决策者做出正确决策计划以及有利于电力系统的稳定运行。 多个售电主体的市场竞争带来了电价的波动&#xff0c;以…...

浙政钉应用监控埋点参数(bid, sapp_id)到底去哪找?一份给开发者的沟通指南

浙政钉应用监控埋点参数获取实战指南&#xff1a;从沟通到落地的全流程解析 在政务数字化进程中&#xff0c;浙政钉作为重要的政务协同平台&#xff0c;其应用监控埋点数据的准确采集直接影响着后续的数据分析和决策支持。然而&#xff0c;许多开发团队在实际项目中常常陷入参数…...

Open Props:重新定义CSS自定义属性的高效设计系统

Open Props&#xff1a;重新定义CSS自定义属性的高效设计系统 【免费下载链接】open-props CSS custom properties to help accelerate adaptive and consistent design. 项目地址: https://gitcode.com/gh_mirrors/op/open-props 在前端开发领域&#xff0c;样式一致性…...

三步修复Windows安全防护:零基础系统工具恢复指南

三步修复Windows安全防护&#xff1a;零基础系统工具恢复指南 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mirrors/wi/wind…...