关于Redisson分布式锁的用法

news2025/1/23 11:58:46

关于Redisson分布式锁的用法

Redisson是一个基于Redis的Java分布式对象和服务框架,它提供了多种分布式锁的实现,包括可重入锁、公平锁、读写锁等。Redisson实现分布式锁的核心原理主要依赖于Redis的数据结构和Redisson框架提供的高级功能。以下详细讲解Redisson如何实现分布式锁:

1. 数据结构选择

Redisson分布式锁主要使用了Redis的字符串(String)数据结构来存储锁的标识和过期时间。对于公平锁,Redisson还利用了Redis的有序集合(Sorted Set)来记录等待锁的线程,以实现锁的公平分配。

2. 锁的获取

当一个线程尝试获取锁时,Redisson会执行以下步骤:

  • 创建键值对:在Redis中创建一个字符串类型的键值对,键是锁的名称,值是线程的唯一标识(通常是线程ID)和重入次数(如果支持可重入锁)。
  • 设置过期时间:为了防止死锁,Redisson会在设置键值对的同时设置一个过期时间。如果线程在过期时间内没有释放锁,锁将自动释放。
  • 检查锁状态:Redisson会检查Redis中是否已经存在该锁的键值对。如果不存在,则当前线程成功获取锁;如果存在且锁的持有者不是当前线程,则当前线程需要等待或尝试其他方式获取锁。

3. 可重入锁的实现

Redisson支持可重入锁,即同一个线程可以多次获取同一个锁。Redisson通过以下方式实现可重入锁:

  • 记录重入次数:在锁的键值对中,除了存储线程ID外,还存储了重入次数。每次线程获取锁时,如果锁的持有者是当前线程,则将重入次数加1。
  • 释放锁:当线程释放锁时,Redisson会检查重入次数。如果重入次数大于1,则将重入次数减1并重新设置过期时间;如果重入次数为0,则删除键值对,彻底释放锁。

4. 锁的续期

为了防止业务逻辑执行时间过长导致锁自动释放,Redisson提供了锁续期的功能。在获取锁成功后,Redisson会启动一个定时任务(通常称为“看门狗”),该任务会定期检查锁的状态,并在锁即将过期时重置过期时间,从而延长锁的有效期。

5. 锁的竞争与等待

当多个线程同时请求获取同一个锁时,可能会出现锁竞争的情况。Redisson通过以下几种方式处理锁竞争:

  • 自旋等待:线程在获取锁失败后会进入自旋等待状态,不断尝试获取锁,直到获取成功或超过设定的超时时间。
  • 信号量机制:Redisson还利用Redis的发布/订阅功能(Pub/Sub)和信号量机制,实现等待锁的线程之间的通信和唤醒。当锁被释放时,持有锁的线程会向等待队列中的线程发送信号,通知它们重新尝试获取锁。

6. 公平锁的实现

对于公平锁的实现,Redisson利用了Redis的有序集合。每个锁都对应一个有序集合,集合中的成员是等待锁的线程,分数是线程的等待时间戳。当线程尝试获取锁时,Redisson会将线程添加到有序集合中,并按照时间戳排序。当锁被释放时,Redisson会从有序集合中移除线程,并让等待时间最长的线程获取锁,从而实现公平性。

7. Redisson的高级特性

除了基本的分布式锁实现外,Redisson还提供了许多高级特性,如联锁(同时获取多个锁以避免死锁)、红锁(基于多个Redis节点实现的高可用性分布式锁)和读写锁(允许多个线程同时读取资源但只允许一个线程写入资源)等。这些特性使得Redisson在分布式系统中的应用更加灵活和强大。

7.1 联锁(MultiLock)

Redisson的联锁机制允许一个线程同时获取多个锁,从而避免死锁的发生。联锁是通过将多个独立的锁组合成一个逻辑上的锁来实现的。当一个线程请求联锁时,Redisson会依次尝试获取每一个独立的锁,只有在所有锁都成功获取后,联锁才会被视为成功获取。否则,Redisson会释放已经获取的锁并进行重试,直到所有锁都被成功获取或达到重试次数上限。

7.2 红锁(RedLock)

红锁是一种高可用的分布式锁实现,基于Redis的多个独立节点来保证锁的可靠性。Redisson的红锁机制遵循RedLock算法,即在N个Redis节点上创建同一个锁,且只要超过一半的节点(即N/2+1个节点)成功创建了锁,当前线程就视为成功获取了锁。这样即使部分节点发生故障,分布式锁依然能够可靠地工作。

7.3 读写锁(ReadWriteLock)

读写锁允许多个线程同时读取资源,但只允许一个线程写入资源。Redisson通过将读锁和写锁分开实现这种机制:

  • 读锁:多个线程可以同时获取读锁,不会互相阻塞。
  • 写锁:当有线程持有写锁时,其他线程的读锁和写锁请求都会被阻塞,直到写锁被释放。

这种机制提高了并发读取的性能,同时保证了写操作的独占性,适用于读多写少的场景。

7.4 信号量(Semaphore)

Redisson的信号量实现允许多个线程根据许可数量来访问共享资源。信号量初始化时会设置一个许可数量,当线程请求信号量时,如果还有剩余许可,线程即可获取信号量并继续执行;否则,线程会进入等待状态,直到有其他线程释放信号量。

7.5 可过期的计数器(CountDownLatch)

Redisson的可过期计数器允许一个或多个线程等待其他线程执行完成后再继续执行。计数器初始化时会设置一个计数值,表示需要等待的事件数量。每当一个事件完成时,计数器的值就会减少。当计数器值变为0时,所有等待的线程会被唤醒继续执行。

7.6 可过期的桶(Bucket)

Redisson的可过期桶是一种具有过期时间的数据结构,可以存储任何类型的对象。桶在存储对象时可以指定过期时间,过期后对象会自动删除。可过期桶适用于需要临时存储数据的场景,如缓存数据、会话数据等。

参考链接

  • Redisson GitHub项目:https://github.com/redisson/redisson
  • Redis官方文档:https://redis.io/documentation
  • Redisson Wiki:https://github.com/redisson/redisson/wiki
  • Redis分布式锁实现介绍:https://redis.io/topics/distlock

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1878798.html

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

相关文章

java之动态代理

1 代理模式 代理模式提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。简言之,代理模式就是设置一个中间代理来控制访问原目标…

普通集群与镜像集群配置

一. 环境准备 关闭防火墙和selinux,进行时间同步 主机名系统IP服务rabbitmq-1 Rocky_linux9.4 192.168.226.22RabbitMQ,MySQLrabbitmq-2Rocky_linux9.4192.168.226.23RabbitMQrabbitmq-3Rocky_linux9.4192.168.226.24RabbitMQ 修改主机名#192.168.226…

机械硬盘故障分析及损坏处理(坏道屏蔽)

机械硬盘故障分析: 1、加电后没有声音就是电机不转,是电路问题,更换电路板解决。 2、加电后电机转,有连续敲击声音,或有异响,磁头损坏或机械故障。 3、加电后电机转,运行正常,BIOS无…

docker pull 镜像的时候遇到Pulling fs layer问题

最近遇到一个很奇怪的问题,docker pull 镜像的时候,总是出现Pulling fs layer问题,导致镜像拉取不成功,以前是安装好docker,正常拉取镜像都是没什么问题的,在这里记录一下这个问题的解决方法,当然,可能并不通用。 1、进入阿里云容器服务 地址:https://cr.console.aliy…

【反者道之动,弱者道之用】统计学中的哲理——回归均值 Regression to the mean

💡💡在统计学中,回归均值(Regression toward the Mean/Regression to the Mean) 指的是如果变量在其第一次测量时是极端的,则在第二次测量时会趋向于接近平均值的现象。   在金融学中, 回归均值是指股票价格无论高于…

【计算机组成原理实验】——运算器组成实验

计组TEC4实验——运算器组成实验 1. 实验目的 (1)掌握算术逻辑运算加、减、乘、与的工作原理。 (2) 熟悉简单运算器的数据传送通路。 (3) 验证实验台运算器的8位加、减、与、直通功能。 (4) 验证实验台的4位乘4位功能。 (5) 按给定数据,完成几种指…

JS乌龟吃鸡游戏

代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>乌龟游戏</title><script type"text/javascript">function move(obj){//乌龟图片高度var wuGui_height 67;…

HarmonyOS Next开发学习手册——创建轮播 (Swiper)

Swiper 组件提供滑动轮播显示的能力。Swiper本身是一个容器组件&#xff0c;当设置了多个子组件后&#xff0c;可以对这些子组件进行轮播显示。通常&#xff0c;在一些应用首页显示推荐的内容时&#xff0c;需要用到轮播显示的能力。 针对复杂页面场景&#xff0c;可以使用 Sw…

MySQL1(初始数据库 概念 DDL建库建表 数据库的三大范式 表约束)

目录 一、初始数据库 二、概念 三、DDL建库建表 1. 数据库结构 2. SQL语句分类 3. DDL语句操作数据库 注释&#xff1a; 查看数据库&#xff1a; ​编辑创建数据库&#xff1a; 删除数据库&#xff1a; 选择数据库&#xff1a; 4. 数据库表的字段类型 4.1 字符串…

JVM内存模型剖析与参数设置

目录 Java语言的跨平台特性 JVM 的主要组成部分及其作用是什么? JVM整体结构及内存模型 线程栈&#xff08;Machine Stack&#xff09; 局部变量表&#xff08;Local Variable Table&#xff09; 操作数栈&#xff08;Operand Stack&#xff09; 程序计数器&#xff08…

【Linux】已解决:Ubuntu虚拟机安装Java/JDK

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项结论 已解决&#xff1a;Ubuntu虚拟机安装Java/JDK 一、分析问题背景 在Ubuntu虚拟机上安装Java开发工具包&#xff08;JDK&#xff09;是许多开发者的常见任务。然而&#xff0c;在…

Pc端多功能视频混剪工具/便携版打开即用

PC便携版 视频批量剪辑大师&#xff0c;全自动剪辑神器&#xff0c;会打字就能做视频 多功能&#xff0c;视频混剪&#xff0c;视频配音&#xff0c;文字生成语音&#xff0c;图片合成视频&#xff0c;自动识别音频并生成字幕等功能 链接&#xff1a;https://pan.baidu.com/…

2007-2022年 省级-绿色农业合作社数量相关数据整理

绿色农业合作社作为一种推动农业可持续发展的组织形式&#xff0c;对于促进环境保护、提高农产品质量和增加农民收入等方面具有重要作用。以下是对省级绿色农业合作社数量相关数据的介绍&#xff1a; 数据简介 定义&#xff1a;绿色农业合作社是由农民、农业专家、企业家等组…

详细解释Redis的SET NX命令

详细解释Redis的SET NX命令 SET NX 命令是 Redis 中用于实现分布式锁的一个重要命令。它的语法和用法如下&#xff1a; SET key value NX [EX seconds | PX milliseconds]参数解释 key&#xff1a;要设置的键名。value&#xff1a;要设置的键值&#xff0c;通常用一个唯一标…

【小沐学AI】Python实现语音识别(whisper+HuggingFace)

文章目录 1、简介1.1 whisper 2、HuggingFace2.1 安装transformers2.2 Pipeline 简介2.3 Tasks 简介2.3.1 sentiment-analysis2.3.2 zero-shot-classification2.3.3 text-generation2.3.4 fill-mask2.3.5 ner2.3.6 question-answering2.3.7 summarization2.3.8 translation 3、…

SM2258XT量产工具,SM2258XT开卡三星SSV4颗粒成功分享,SM2259XT量产参考教程,威刚ADATA SP580开卡记录

前两天拆了笔记本上的威刚ADATA SP580 240GB&#xff0c;准备做移动硬盘用&#xff0c;装入移动硬盘盒之后接入电脑&#xff0c;发现系统可认盘&#xff0c;SMART显示正常&#xff0c;Windows的磁盘管理能显示正确容量&#xff0c;但处于未初始化状态&#xff0c;且始终无法初始…

鸿蒙系统——强大的分布式系统

鸿蒙相比较于传统安卓最最最主要的优势是微内核分布式操作系统&#xff0c;具有面向未来&#xff0c;跨设备无缝协作&#xff0c;数据共享的全场景体验。下面简单来感受一下鸿蒙系统的多端自由流转。 自由流转概述 场景介绍 随着全场景多设备的生活方式不断深入&#xff0c;…

SSM网上旅游信息管理系统-计算机毕业设计源码06975

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据新增流程 2.2.2 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体设…

计算神经网络中梯度的核心机制 - 反向传播(backpropagation)算法(1)

计算神经网络中梯度的核心机制 - 反向传播&#xff08;backpropagation&#xff09;算法&#xff08;1&#xff09; flyfish 链式法则在深度学习中的主要应用是在反向传播&#xff08;backpropagation&#xff09;算法中。 从简单的开始 &#xff0c;文本说的就是链式法则 R …

酒店客房管理系统(Java+MySQL)

技术栈 Java: 作为主要编程语言。Swing GUI: 用于开发图形用户界面。MySQL: 作为数据库管理系统。JDBC: 用于连接和操作MySQL数据库。 功能要点 管理登录认证 系统提供管理员登录认证功能。通过用户名和密码验证身份&#xff0c;确保只有授权的用户可以访问和管理酒店客房信…