Java 分布式锁:Redisson、Zookeeper、Spring 提供的 Redis 分布式锁封装详解
📚 Java 分布式锁:Redisson、Zookeeper、Spring 提供的 Redis 分布式锁封装详解
在分布式系统中,分布式锁 用于解决多个服务实例同时访问共享资源时的 数据一致性 问题。Java 生态中,有多种成熟的框架可以实现分布式锁,包括:
- Redisson:基于 Redis 的分布式锁框架
- Zookeeper:基于 Zookeeper 的分布式锁框架
- Spring Data Redis:Spring 提供的 Redis 分布式锁封装
本文将详细介绍这些分布式锁框架的 原理、使用方法、优势与注意事项。
🔑 1. Redisson 基于 Redis 的分布式锁框架
✅ 1.1 Redisson 简介
Redisson 是一个 基于 Redis 的 Java 分布式锁框架,提供了丰富的分布式数据结构和工具,包括 分布式锁、读写锁、信号量、限流器 等。Redisson 的分布式锁功能强大,支持多种锁类型:
| 锁类型 | 描述 |
|---|---|
| RLock | 可重入锁 |
| FairLock | 公平锁 |
| ReadWriteLock | 读写锁 |
| MultiLock | 联锁(多个锁的组合) |
| RedLock | 基于 Redis 的 Redlock 算法实现 |
🔧 1.2 Redisson 分布式锁使用示例
✅ 使用 Maven 引入依赖
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.19.0</version>
</dependency>
✅ 初始化 Redisson 客户端
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class RedissonDistributedLockExample {public static void main(String[] args) {// 配置 Redis 服务器地址Config config = new Config();config.useSingleServer().setAddress("redis://localhost:6379");// 创建 Redisson 客户端RedissonClient redisson = Redisson.create(config);// 获取锁RLock lock = redisson.getLock("myLock");// 加锁lock.lock();try {System.out.println("Lock acquired!");// 执行关键业务逻辑} finally {// 解锁lock.unlock();System.out.println("Lock released!");}}
}
⚙️ 1.3 Redisson 锁类型
| 锁类型 | 描述 |
|---|---|
| RLock | 可重入锁,支持自动续期 |
| FairLock | 公平锁,按请求的顺序获取锁 |
| ReadWriteLock | 读写锁,支持读多写少的场景 |
| RedLock | 基于 Redis 的分布式锁算法,增强容错性 |
⚠️ 1.4 Redisson 使用注意事项
- 锁的自动续期:Redisson 的锁支持自动续期,防止锁因超时被释放。
- 高可用 Redis 环境:建议使用 Redis 集群模式,提高锁的可靠性。
- 避免长时间持有锁:长时间持有锁可能导致死锁问题。
📋 2. 基于 Zookeeper 的分布式锁框架
✅ 2.1 Zookeeper 简介
Zookeeper 是一个 分布式协调服务,通过 临时节点(Ephemeral Node) 实现分布式锁。Zookeeper 的锁机制天然支持 高可用性 和 一致性,适用于对一致性要求较高的分布式系统。
🔧 2.2 使用 Curator 实现 Zookeeper 分布式锁
✅ 使用 Maven 引入依赖
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>5.4.0</version>
</dependency>
✅ 实现分布式锁
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;public class ZookeeperDistributedLockExample {public static void main(String[] args) throws Exception {// 创建 Zookeeper 客户端CuratorFramework client = CuratorFrameworkFactory.builder().connectString("localhost:2181").retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();client.start();// 创建分布式锁InterProcessMutex lock = new InterProcessMutex(client, "/distributed_lock");// 获取锁lock.acquire();try {System.out.println("Lock acquired!");// 执行业务逻辑} finally {// 释放锁lock.release();System.out.println("Lock released!");}client.close();}
}
⚙️ 2.3 Zookeeper 锁的优势
| 优势 | 描述 |
|---|---|
| 强一致性 | Zookeeper 的锁机制天然保证数据一致性 |
| 高可用性 | 支持主从同步和故障恢复 |
| 可重入性 | 支持锁的可重入 |
⚠️ 2.4 Zookeeper 使用注意事项
- 节点数量限制:Zookeeper 的节点数量有限,避免大量创建节点。
- 网络延迟:Zookeeper 对网络延迟敏感,确保网络稳定性。
📋 3. Spring 提供的 Redis 分布式锁封装
✅ 3.1 Spring Data Redis 锁的实现
Spring Data Redis 提供了简单的分布式锁封装,可以通过 RedisTemplate 实现。
🔧 使用示例
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;@Service
public class SpringRedisLockService {private final StringRedisTemplate redisTemplate;public SpringRedisLockService(StringRedisTemplate redisTemplate) {this.redisTemplate = redisTemplate;}public boolean acquireLock(String lockKey, String value, long expireTime) {Boolean result = redisTemplate.opsForValue().setIfAbsent(lockKey, value, expireTime);return Boolean.TRUE.equals(result);}public void releaseLock(String lockKey, String value) {String currentValue = redisTemplate.opsForValue().get(lockKey);if (value.equals(currentValue)) {redisTemplate.delete(lockKey);}}
}
⚙️ 3.2 Spring Data Redis 锁的优势
| 优势 | 描述 |
|---|---|
| 简单易用 | 使用 Spring 提供的封装,易于集成到项目中 |
| 可扩展性强 | 支持多种 Redis 配置模式 |
| 与 Spring Boot 无缝集成 | 无需额外引入第三方库 |
🔄 4. 分布式锁对比总结
| 实现方式 | 优点 | 缺点 |
|---|---|---|
| Redisson | 高性能、支持多种锁类型 | 依赖 Redis 服务 |
| Zookeeper(Curator) | 强一致性、天然支持分布式环境 | 配置复杂、性能略低 |
| Spring Data Redis | 简单易用、与 Spring Boot 无缝集成 | 功能有限,适用于简单场景 |
🎯 5. 选择指南
| 场景 | 推荐实现 |
|---|---|
| 高并发、低延迟的场景 | Redisson |
| 强一致性要求的分布式系统 | Zookeeper |
| 简单的分布式锁需求 | Spring Data Redis |
⚙️ 6. 总结
- Redisson 是基于 Redis 的分布式锁框架,适用于大多数高并发场景。
- Zookeeper 提供了更强的 一致性保证,适用于分布式协调和任务调度系统。
- Spring Data Redis 提供了简单的分布式锁封装,适用于 Spring Boot 项目。
相关文章:
Java 分布式锁:Redisson、Zookeeper、Spring 提供的 Redis 分布式锁封装详解
📚 Java 分布式锁:Redisson、Zookeeper、Spring 提供的 Redis 分布式锁封装详解 在分布式系统中,分布式锁 用于解决多个服务实例同时访问共享资源时的 数据一致性 问题。Java 生态中,有多种成熟的框架可以实现分布式锁࿰…...
智能汽车的数字钥匙安全
数字钥匙作为汽车智能化变革下的一项创新技术,利用蓝牙定位、NFC等近场通信技术进行钥匙与汽车的匹配继而开锁,可以让车主通过智能手机、可穿戴设备等解锁汽车,并对汽车实施相关的操作,提升用车便利性,受到越来越多车企…...
YangQG 面试题汇总
一、交叉链表 问题: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 解题思想: 双指针 备注:不是快慢指针,如果两个长度相…...
急速了解什么是GPU服务器
GPU服务器是一种专门配置了高性能图形处理器(GPU)的服务器,旨在提供高性能计算、深度学习、科学计算等多种场景的计算服务。与传统的CPU服务器相比,GPU服务器在处理并行密集型计算任务时具有显著优势。本文将详细介绍GPU服务器的定…...
用 Python 绘制可爱的招财猫
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常…...
Linux 获取文本部分内容
Linux获取文本部分内容 前言场景获取前几行内容获取末尾几行内容获取中间内容head 命令 tail 命令 结合sed 命令awk 命令 前言 test.log 文本内容如下: (注意:内容 a1004和a1005之间有一空行) [rootgaussdb002 tmp]# cat test.…...
01-51单片机LED与独立按键
一、单片机概述 注意:个人学习笔记,里面涉及到的C语言和进程转换相关的知识在C语言部分已经写了,这里是默认都会的状态学习单片机。 1.什么是单片机 单片机,英文Micro Controller Unit,简称MCU。其内部集成了CPU、R…...
【微服务】SpringBoot 整合Redis实现延时任务处理使用详解
目录 一、前言 二、延迟任务的高频使用场景 三、延迟任务常用解决方案 3.1 Quartz 3.2 DelayQueue 3.2.1 Timer + TimerTask 3.2.2 ScheduledExecutorService 3.3 Redis sorted set 3.4 RabbitMQ 四、Redis实现延时队列操作实战 4.1 Redis Sorted Set 概述 4.1.1 Re…...
【Java项目】基于SpringBoot的【校园交友系统】
【Java项目】基于SpringBoot的【校园交友系统】 技术简介:系统软件架构选择B/S模式、SpringBoot框架、java技术和MySQL数据库等,总体功能模块运用自顶向下的分层思想。 系统简介:系统主要包括管理员和用户。 (a) 管理员的功能主要有首页、个人…...
Elasticsearch学习(1) : 简介、索引库操作、文档操作、RestAPI、RestClient操作
目录 1.elasticsearch简介1.1.了解es1.2.倒排索引正向索引和倒排索引 1.3.es的一些概念:文档和字段;索引和映射;Mysql与ES1.4.安装es、kibana部署单点es部署kibanaIK分词器安装IK分词器与测试扩展与停用词词典总结 部署es集群 2.索引库操作2.1.mapping映…...
ls指令详讲
🏝️专栏:https://blog.csdn.net/2301_81831423/category_12872319.html 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 基本语法 常用选项详解 1. 基本选项 …...
【前端】【CSS3】基础入门知识
目录 如何学习CSS 1.1什么是CSS编辑 1.2发展史 1.三种导入方式 1.1、行内样式 1.2、外部样式 1.3、嵌入方式 2.选择器 2.1、基本选择器 (1)元素选择器 (2)类选择器 (3)id选择器:必…...
计算机网络之---RIP协议
RIP协议的作用 RIP (Routing Information Protocol) 协议是一个基于距离矢量的路由协议,它在网络中用来动态地交换路由信息。RIP 是最早的路由协议之一,通常用于小型和中型网络中。它的工作原理简单,易于实现,但在一些大型网络中效…...
【LeetCode Hot100 贪心算法】 买卖股票的最佳时机、跳跃游戏、划分字母区间
贪心算法 买卖股票的最佳时机买卖股票的最佳时机II跳跃游戏跳跃游戏II划分字母区间 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的…...
互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅
本文将给出关于互联网架构演进的一个不同视角。回顾一下互联网的核心理论基础产生的背景: 左边是典型的集中控制通信网络,很容易被摧毁,而右边的网络则没有单点问题,换句话说它很难被全部摧毁,与此同时,分…...
git相关操作笔记
git相关操作笔记 1. git init git init 是一个 Git 命令,用于初始化一个新的 Git 仓库。执行该命令后,Git 会在当前目录创建一个 .git 子目录,这是 Git 用来存储所有版本控制信息的地方。 使用方法如下: (1ÿ…...
jenkins 使用 ssh-agent向windows进行部署
背景: jenkins在linux的docker环境内,应用服务部署在windows。需要使用jenkins实现自动化部署。 实现方式: jenkins上构建pipeline任务,脚本如下: 遇到问题: 1、问题:jenkins 调用部署bat脚…...
MySQL入门学习笔记
第一章 数据库系统概述 数据库的4个基本概念 数据、数据库、数据库管理系统、数据库系统是与数据库技术密切相关的4个基本概念 数据 数据是数据库中存储的基本对象,描述事物的符号记录称为数据,数据的表现形式还不能完全表达其内容,需要…...
机器学习全流程解析:数据导入到服务上线全阶段介绍
目录 1. 数据导入 2. 数据预处理 3. 超参数搜索与优化 4. 模型训练 5. 模型评估 6. 模型压缩与优化 7. 模型注册与版本管理 8. 服务上线与部署 总结 1. 数据导入 数据源:数据库、文件系统、API等。数据格式:CSV、JSON、SQL 数据库表、Parquet …...
C#从“Hello World!“开始
是时候一览C#的庐山真面目了。现在,让我们从"Hello World"开始吧,出发! 1. 一个简单的C#程序 先来看一段最简单的示例代码,如代码清单2-1所示。 代码清单2-1 HelloWorldClass.cs using System;namespace Programmi…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。
2024 年,高端封装市场规模为 80 亿美元,预计到 2030 年将超过 280 亿美元,2024-2030 年复合年增长率为 23%。 细分到各个终端市场,最大的高端性能封装市场是“电信和基础设施”,2024 年该市场创造了超过 67% 的收入。…...
