Redisson 分布式锁的使用详解
一、分布式锁的概述
1.1 分布式锁的背景
在单机系统中,Java 提供了 synchronized 和 Lock 等锁机制来确保并发情况下的线程安全。然而,在分布式系统中,多个服务实例运行在不同的物理或虚拟机上,无法直接使用这些本地的锁机制来控制对共享资源的访问。
为了在分布式环境中控制对共享资源的访问,就需要引入一种能够跨多台服务器实例的锁机制,这就是分布式锁。Redis 作为一种高性能的内存数据库,提供了基于 Redis 的分布式锁实现。Redisson 基于 Redis 对分布式锁进行了封装,提供了简洁易用的 API 来管理分布式锁。
1.2 分布式锁的特性
一个完整的分布式锁需要具备以下几个特性:
- 互斥性:同一时刻只能有一个客户端能获得锁,其他客户端必须等待锁被释放后才能继续操作。
- 容错性:如果持有锁的客户端因为网络或系统故障而没有主动释放锁,锁应当能够被安全地释放。
- 高可用性:锁的请求和释放过程应该是高效的,且在 Redis 节点出现故障时,系统依然能够正常工作。
二、Redisson 分布式锁的原理
Redisson 分布式锁基于 Redis 的 SETNX (set if not exists) 命令实现。基本的原理如下:
- 加锁:客户端请求加锁时,会向 Redis 发送一个
SETNX命令,如果返回值为 1,表示加锁成功。如果返回 0,则说明锁已经被其他客户端持有,当前客户端需要等待。 - 自动过期:为了防止客户端因故障而无法释放锁,锁的持有是有过期时间的。通过 Redis 的
EXPIRE命令,锁在加锁时同时设置过期时间,到期后锁将自动释放。 - 解锁:锁持有者执行完任务后,主动向 Redis 发送命令删除锁的 key,从而释放锁,其他等待的客户端才能继续加锁。
Redisson 通过封装 Redis 的这些基础命令,提供了 RLock 接口来方便地实现分布式锁。
三、Redisson 分布式锁的使用
3.1 引入 Redisson 依赖
在项目中使用 Redisson,首先需要在 pom.xml 文件中引入 Redisson 的依赖:
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.16.3</version>
</dependency>
3.2 Redisson 配置
为了使用 Redisson 分布式锁,首先需要配置 Redisson 客户端。Redisson 支持单节点模式、主从模式、集群模式和哨兵模式等多种 Redis 部署模式。这里我们以单节点模式为例:
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class RedissonConfig {public RedissonClient redissonClient() {Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");return Redisson.create(config);}
}
3.3 使用分布式锁
在配置好 Redisson 客户端后,可以通过 RedissonClient 来获取 RLock 对象,进行分布式加锁和解锁操作。下面是一个简单的使用示例:
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;public class DistributedLockExample {private final RedissonClient redissonClient;public DistributedLockExample(RedissonClient redissonClient) {this.redissonClient = redissonClient;}public void executeWithLock() {// 获取锁对象RLock lock = redissonClient.getLock("myLock");try {// 加锁lock.lock();System.out.println("获得锁,执行临界区代码");// 模拟业务逻辑Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} finally {// 解锁lock.unlock();System.out.println("释放锁");}}
}
在上面的示例中,我们通过 redissonClient.getLock("myLock") 获取一个名为 myLock 的锁对象,并在执行完任务后通过 lock.unlock() 主动释放锁。
3.4 设置锁的超时时间
为了防止因异常情况导致锁无法释放,Redisson 提供了设置锁超时时间的功能。在获取锁时,可以通过 lock.lock(long leaseTime, TimeUnit unit) 方法指定锁的持有时间。例如,下面的代码将设置锁的持有时间为 10 秒:
public void executeWithTimeoutLock() {RLock lock = redissonClient.getLock("myLock");try {// 加锁并设置超时时间为10秒lock.lock(10, TimeUnit.SECONDS);System.out.println("获得锁,执行临界区代码");// 模拟业务逻辑Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();} finally {// 无需主动解锁,锁会在10秒后自动释放if (lock.isHeldByCurrentThread()) {lock.unlock();}System.out.println("释放锁");}
}
四、Redisson 分布式锁的应用场景
4.1 控制并发访问
在电商、抢购等高并发场景中,多个用户同时发起对同一商品的抢购请求,此时需要使用分布式锁来控制对库存资源的并发访问,防止超卖或重复购买。
public void purchase(String productId) {RLock lock = redissonClient.getLock("product:" + productId);try {// 尝试获取锁if (lock.tryLock(5, 10, TimeUnit.SECONDS)) {// 执行购买逻辑System.out.println("购买成功");} else {System.out.println("获取锁失败,购买失败");}} catch (InterruptedException e) {e.printStackTrace();} finally {if (lock.isHeldByCurrentThread()) {lock.unlock();}}
}
4.2 分布式任务调度
在分布式系统中,任务调度器往往有多个实例在同时运行。如果多个实例同时执行相同的任务,可能会导致数据重复处理或任务冲突。此时可以通过 Redisson 分布式锁确保同一时刻只有一个实例能够执行任务。
public void scheduleTask() {RLock lock = redissonClient.getLock("taskLock");try {if (lock.tryLock(1, TimeUnit.MINUTES)) {System.out.println("获得锁,执行调度任务");// 执行定时任务}} catch (InterruptedException e) {e.printStackTrace();} finally {if (lock.isHeldByCurrentThread()) {lock.unlock();}}
}
4.3 分布式事务
在分布式系统中,为了确保多个数据库或服务之间的数据一致性,可以使用 Redisson 分布式锁来控制对共享资源的访问,从而实现分布式事务的控制。
五、Redisson 分布式锁的优缺点
5.1 优点
- 实现简单:Redisson 提供了简洁的 API,开发者可以轻松地实现分布式锁功能。
- 丰富的分布式工具:除了分布式锁,Redisson 还提供了其他分布式工具,如分布式集合、队列、布隆过滤器等,适用于多种场景。
- 自动续期:Redisson 提供了自动续期功能,防止因任务执行时间过长导致锁意外释放。
5.2 缺点
- 依赖 Redis:Redisson 是基于 Redis 实现的分布式锁,依赖于 Redis 的可用性和性能。
- **锁的粒度
问题**:在使用分布式锁时,需要合理设计锁的粒度。锁粒度过大会导致性能瓶颈,锁粒度过小则可能导致竞争加剧。
六、总结
Redisson 作为 Redis 的高级客户端,提供了简单易用的分布式锁实现,能够很好地解决分布式系统中的并发控制问题。通过 Redisson,开发者可以快速实现分布式锁,并应用到电商、任务调度、分布式事务等场景中。
在使用 Redisson 分布式锁时,除了基本的加锁和解锁操作外,还需要合理设计锁的粒度,确保锁的可用性和系统性能的平衡。
相关文章:
Redisson 分布式锁的使用详解
一、分布式锁的概述 1.1 分布式锁的背景 在单机系统中,Java 提供了 synchronized 和 Lock 等锁机制来确保并发情况下的线程安全。然而,在分布式系统中,多个服务实例运行在不同的物理或虚拟机上,无法直接使用这些本地的锁机制来控…...
计算机网络:物理层 --- 基本概念、编码与调制
目录 一. 物理层的基本概念 二. 数据通信系统的模型 三. 编码 3.1 基本概念 3.2 不归零制编码 3.3 归零制编码 3.4 曼切斯特编码 3.5 差分曼切斯特编码 编辑 四. 调制 4.1 调幅 4.2 调频 4.3 调相 4.4 混合调制 今天我们讲的是物理…...
使用Maven创建一个Java项目并在repository中使用
JDK环境:1.8.0_371 Maven环境 :Apache Maven 3.6.3 配置完成jdk和mvn后,进入到指定文件夹下执行如下语句: mvn archetype:generate -DgroupIdtop.chengrongyu -DartifactIdCyberSpace -DarchetypeArtifactIdmaven-archetype-quic…...
如何使用IIC外设(硬件IIC)
本文重点叙述如何使用芯片自带的 IIC 外设,即硬件 IIC,实现 IIC 通信。文章《IIC通信基础_cpu的iic通信-CSDN博客》 中,叙述了软件 IIC 通信和硬件 IIC 通信的区别, 并且重点叙述了 IIC 的通信协议。在使用软件进行 IIC 通信时&am…...
使用 Vue 3、Vite 和 TypeScript 的环境变量配置
使用 Vue 3、Vite 和 TypeScript 的环境变量配置 在开发现代前端应用时,环境变量是一个非常重要的概念。它可以帮助我们根据不同的环境(开发、测试、生产)配置不同的行为,比如 API 请求地址、调试选项等。在 Vue 3、Vite 和 Type…...
F28335 的串行外设接口(以下简称 SPI)
1 SPI 介绍 1.1 SPI 简介 1.2 F28335 的 SPI模块介绍 (1)F28335 的 SPI 特点...
科技引领未来生活——“光影漫游者”展览馆应用—轻空间
随着科技的快速发展,展览馆作为展示文化、科技和艺术的场所,正逐渐从传统的静态展示向高科技互动体验转变。由轻空间打造的“光影漫游者”展览馆,凭借其前沿的气承式结构和智能化系统,将参观者带入了一个未来感十足、充满科技魅力…...
ego-planner开源代码之启动参数介绍分析
ego-planner开源代码之启动参数介绍&分析 1. 源由2. 逻辑分析3. 启动参数section 1 三维地图尺寸section 2 里程计话题映射section 3 advanced_param.xml配置section 3.1section 3.2section 3.3section 3.4section 3.5section 3.6section 3.7section 3.8 section 4 轨迹服务…...
828 华为云征文|华为 Flexus 云服务器打造 Laverna 在线笔记应用
一、引言 在当今数字化时代,高效的笔记管理工具对于学习、工作和生活都至关重要。Laverna 作为一款功能强大的开源在线笔记应用,提供了 Markdown 编辑、加密支持等特性,是替代 Evernote 的绝佳选择。在 2024 年 9 月 14 日这个充满创新的日子…...
数据结构与算法-Trie树添加与搜索
trie树的使用场景 我们若需要制作一个通讯录的软件,使用常规树结构查询的复杂度为O(logn),但trie树的复杂度确与数据多少无关,与单词长度有关,这就大大缩减的查询的时间复杂度。 trie树的基本实现 基础结构 package com.study.trieDemo;i…...
AIGC专栏15——CogVideoX-Fun详解 支持图文生视频 拓展CogVideoX到256~1024任意分辨率生成
AIGC专栏15——CogVideoX-Fun详解 支持图&文生视频 拓展CogVideoX到256~1024任意分辨率生成 学习前言项目特点生成效果相关地址汇总源码下载地址 CogVideoX-Fun详解技术储备Diffusion Transformer (DiT)Stable Diffusion 3EasyAnimate-I2V 算法细节算法组成InPa…...
BFS 解决多源最短路问题
文章目录 多源BFS542. 01 矩阵题目解析算法原理代码实现 1020. 飞地的数量题目解析算法原理 1765. 地图中的最高点题目解析算法原理代码实现 1162. 地图分析题目解析算法原理代码实现 多源BFS 单源最短路: 一个起点、一个终点 多源最短路: 可以多个起点…...
论文笔记:交替单模态适应的多模态表征学习
整理了CVPR2024 Multimodal Representation Learning by Alternating Unimodal Adaptation)论文的阅读笔记 背景MLA框架实验Q1 与之前的方法相比,MLA能否克服模态懒惰并提高多模态学习性能?Q2 MLA在面临模式缺失的挑战时表现如何?Q3 所有模块是否可以有…...
鸿蒙OS 线程间通信
鸿蒙OS 线程间通信概述 在开发过程中,开发者经常需要在当前线程中处理下载任务等较为耗时的操作,但是又不希望当前的线程受到阻塞。此时,就可以使用 EventHandler 机制。EventHandler 是 HarmonyOS 用于处理线程间通信的一种机制,…...
执行 npm报错 Cannot find module ‘../lib/cli.js‘
报错 /usr/local/node/node-v18.20.4-linux-x64/bin/npm node:internal/modules/cjs/loader:1143 throw err; ^ Error: Cannot find module ../lib/cli.js Require stack: - /usr/local/node/node-v18.20.4-linux-x64/bin/npm at Module._resolveFilename (node:inter…...
基于SpringBoot+Vue+MySQL的国产动漫网站
系统展示 用户前台界面 管理员后台界面 系统背景 随着国内动漫产业的蓬勃发展和互联网技术的快速进步,动漫爱好者们对高质量、个性化的国产动漫内容需求日益增长。然而,市场上现有的动漫平台大多以国外动漫为主,对国产动漫的推广和展示存在不…...
AUTOSAR汽车电子嵌入式编程精讲300篇-基于CAN总线的气动控制
目录 前言 知识储备 什么是气动控制: 气动控制基础知识 一、气动元件 二、气路设计 三、气动控制系统 气动控制系统构成图 气动控制系统基本组成功能图 几种常见的气动执行元件实物图 常用气动压力控制阀实物图 常用气动流动控制阀实物图 电磁控制换向发实物图 部…...
Ubuntu 20.04 内核升级后网络丢失问题的解决过程
在 Ubuntu 系统中,内核升级是一个常见的操作,旨在提升系统性能、安全性和兼容性。然而,有时这一操作可能会带来一些意外的副作用,比如导致网络功能的丧失。 本人本来是想更新 Nvidia 显卡的驱动,使用 ubuntu-drivers …...
论文解读《LaMP: When Large Language Models Meet Personalization》
引言:因为导师喊我围绕 “大语言模型的个性化、风格化生成” 展开研究,所以我就找相关论文,最后通过 ACL 官网找到这篇,感觉还不错,就开始解读吧! “说是解读,其实大部分都是翻译哈哈哈&#x…...
Excel VLOOKUP函数怎么用?vlookup函数的使用方法及案例
大家好,这里是效率办公指南! 🔎 在Excel的世界里,VLOOKUP函数无疑是查询和数据分析中的明星。无论是从庞大的数据表中提取特定信息,还是进行数据的快速匹配,VLOOKUP都能大显身手。今天,我们将深…...
zh3100组合式选粉机的设计【说明书+27张CAD图纸】
zh3100组合式选粉机作为粉体分级领域的核心设备,其设计融合了流体力学、机械传动与颗粒分离理论,通过优化结构参数与气固两相流场分布,实现高精度、低能耗的粉体分级作业。该设备采用模块化组合设计理念,将选粉室、导流装置、分级…...
ngx_http_join_exact_locations
1 定义 ngx_http_join_exact_locations 函数 定义在 ./nginx-1.24.0/src/http/ngx_http.cstatic ngx_int_t ngx_http_join_exact_locations(ngx_conf_t *cf, ngx_queue_t *locations) {ngx_queue_t *q, *x;ngx_http_location_queue_t *lq, *lx;q ngx_queue_he…...
布隆过滤器与哈希索引:两级验证模型
在高并发、大数据量的系统中,快速判断一个元素是否“已经存在”是一项基础而关键的能力。无论是防止重复提交、抵御缓存穿透,还是实现分布式去重,都需要一种高效的存在性检查机制。实践中,布隆过滤器(Bloom Filter&…...
引线框架市场前瞻:预计至2032年将增长至338.8亿元
据恒州诚思调研统计,2025年全球引线框架市场规模达273.7亿元,预计至2032年将增长至338.8亿元,2026-2032年复合增长率(CAGR)为2.3%。作为半导体封装的核心组件,引线框架(由芯片安装板与引线指构成…...
ESP32-CAM远程控制实战:SunFounder AI Camera库深度解析
1. SunFounder AI Camera 库深度解析:面向嵌入式工程师的 ESP32-CAM 远程控制实践指南SunFounder AI Camera 并非传统意义上的纯图像处理模块,而是一套完整的“端-云-APP”协同控制系统。其核心价值在于将 ESP32-CAM 这一低成本、高集成度的 AI 视觉平台…...
VASP机器学习力场训练避坑指南:从INCAR参数设置到声子谱验证的完整流程
VASP机器学习力场训练实战:参数调优与声子谱诊断全解析 在材料计算领域,VASP结合机器学习力场的技术路线正逐渐成为平衡计算精度与效率的黄金标准。但当我们真正着手训练自己的力场模型时,往往会发现教程中的理想案例与实际操作之间存在巨大鸿…...
AndroidTVLauncher自定义功能卡片开发:FunctionCardPresenter实现原理与实践
AndroidTVLauncher自定义功能卡片开发:FunctionCardPresenter实现原理与实践 【免费下载链接】AndroidTVLauncher This is a leanback style tv launcher(minSdkVersion 17) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidTVLauncher AndroidTVLaunch…...
探索五大革新能力:BetterGI如何全方位重塑原神自动化体验
探索五大革新能力:BetterGI如何全方位重塑原神自动化体验 【免费下载链接】better-genshin-impact 🍨BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动派遣 | 一键强化 - UI Automation Testing Tools …...
如何用智能工具提升暗黑破坏神3战斗效率:D3KeyHelper全功能指南
如何用智能工具提升暗黑破坏神3战斗效率:D3KeyHelper全功能指南 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 暗黑破坏神3的战斗节奏快…...
5分钟掌握MPC Video Renderer:解锁专业级HDR视频渲染的完整解决方案
5分钟掌握MPC Video Renderer:解锁专业级HDR视频渲染的完整解决方案 【免费下载链接】VideoRenderer RTX HDR modded into MPC-VideoRenderer. 项目地址: https://gitcode.com/gh_mirrors/vid/VideoRenderer MPC Video Renderer是一款功能强大的开源DirectSh…...
