关于Redisson分布式锁的用法

关于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.mzph.cn/pingmian/38399.shtml

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

相关文章

深度学习11-20

1.神经元的个数对结果的影响: (http://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html) (1)神经元3个的时候 (2)神经元是10个的时候 神经元个数越多,可能会产生…

langchain报错

ImportError: cannot import name ‘BaseModel’ from ‘langchain_core.pydantic_v1’ (/Users/sunwenjun/anaconda3/envs/python310/lib/python3.10/site-packages/langchain_core/pydantic_v1/init.py) pip install -U pydantic pip install -qU langchain-openai

第3章-数据类型和运算符

#本章目标 掌握Python中的保留字与标识符 理解Python中变量的定义及使用 掌握Python中基本数据类型 掌握数据类型之间的相互转换 掌握eval()函数的使用 了解不同的进制数 掌握Python中常用的运算符及优先级1,保留字与标识符 保留字 指在Python中被赋予特定意义的一…

AI时代下的个体创业

核心理念: 少工作,多赚钱,享受生活:减少工作量,提高工作效率;设定主观的赚钱目标,根据兴趣和追求持续获利;平衡工作与生活,实现时间和地点自由。个人成长与试错&#xf…

FireAct:使用智能体(agent)微调大语言模型

1.概述 近年来,针对语言模型(LMs)的研究致力于探索其与外部工具或环境互动的能力,以推进新型语言代理的发展。此类代理具备从环境反馈中汲取新知识、通过语言推理进行连续决策,以及借助自我反思提升任务解决能力的能力。工业界的进展,如ChatGPT插件,凸显了语言代理在实际…

微信小程序的跳转页面

在微信小程序中,要实现从当前页面返回到指定页面的功能,通常不直接使用“返回上一页”的逻辑,而是利用小程序的页面栈管理和navigateBack或者重新定向到目标页面的API。下面我将介绍两种主要的方法: 方法一:使用 navi…

[C++][设计模式][备忘录模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受 1.动机 在软件构建过程中,某些对象的状态转换过程中,可能由于某中需要,要求程序能够回溯到对象之前处于某个点的状态。 如果使用一些公开接口来让其他对象得到对象的状态,便会暴露对象…

pygame下载安装流程

方案一:直接下载 使用cmd打开窗口: 使用命令:pip install pygame即可下载最新pygame安装包 方案二:下载指定版本 我们需要去python官网查看对应包和发布版本: python官网 进去后点击PyPI,查找python发布…

C#异常捕获

前言 在C#中,我们无法保证我们编写的程序没有一点bug,如果我们对于这些抛出异常的bug不进行任何的处理的话,那么我们的软件在抛出这些异常的时候就会崩溃,也就是软件闪退,并且这种闪退由于我们没有进行处理&#xff0…

初阶数据结构之堆讲解

本篇文章带大家学习的是堆,还请各位观众老爷给个三连 正片开始 堆的概念 如果有一个关键码的集合 K { , , , … , } ,把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,并满…

【Redis】主从复制

https://www.bilibili.com/video/BV1cr4y1671t?p101 https://blog.csdn.net/weixin_54232666/article/details/128825763 单节点Redis的并发能力是有上限的,要进一步提高Redist的并发能力,就需要搭建主从集群,实现读写分离。 主从搭建 这…

访客(UV)、点击量(PV)、IP、访问量(VV)概念

1、https://www.cnblogs.com/QingPingZm/articles/13855808.htmlhttps://www.cnblogs.com/QingPingZm/articles/13855808.html

SAAS多租户系统的详细设计方案,后台数据库及各类框架详细设计方案-程序员必被的技术

SAAS多租户系统的详细设计方案 多租户(Multi-Tenant)架构是一种在单个软件实例中服务多个客户(租户)的设计方式。每个租户的数据和配置是独立的,但共享同一个应用程序和基础设施。设计一个高效的SAAS多租户系统需要考…

监控电脑的软件有哪些?精选8大监控电脑的软件

根据当前市场反馈和功能评价,以下是八款备受推崇的电脑监控软件推荐,适合不同企业和组织的监控与管理需求: 1.安企神监控软件 特点:全面的局域网监控工具,擅长网络设备监控、网络性能管理和故障诊断。提供员工电脑屏幕…

配置Eclipse的C++环境

配置Eclipse的C环境主要包括以下几个步骤,以下是详细的步骤和说明: 1. 下载和安装JDK(如果尚未安装) JDK(Java Development Kit)是Eclipse运行的基础,如果尚未安装JDK,请从Oracle官…

计算机网络:408考研|湖科大教书匠|原理参考模型II|学习笔记

系列目录 计算机网络总纲领 计算机网络特殊考点 计算机网络原理参考模型I 计算机网络原理参考模型II 目录 系列目录更新日志前言应用层(Application Layer)一、应用层概述二、客户/服务器方式和对等方式三、动态主机配置协议(DHCP, Dynamic Host Configuration Protocol)四、域…

最优化方法Python计算:线性规划的标准化

目标函数和约束函数均为线性函数的最优化问题 { minimize c ⊤ x s.t. A i q x ≤ b i q A e q x b e q x ≥ o ( 1 ) \begin{cases} \text{minimize}\quad\quad\boldsymbol{c}^\top\boldsymbol{x}\\ \text{s.t.\ \ }\quad\quad\boldsymbol{A}_{iq}\boldsymbol{x}\leq\bold…

微机原理与接口技术:重点内容|计算机系统|学习笔记

系列目录 前言 只将最重要的知识点考点列出来方便学习复习 目录 系列目录前言第1章 微型计算机概述第2章 16位和32位微处理机🌟16位微处理器 8086 第3章 Pentium 的指令系统常用指令 第4章 存储器、存储管理和高速缓存技术第5章 微型计算机和外设的数据传输第6章 串…

Socket网络编程基础教程

Socket网络编程基础教程 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java中的Socket网络编程,这是实现网络通信的重要基础。 …

echarts进度环叠加背景图

vue组件实现&#xff1a; <template><div class"ringWrap" :style"{transform:scale(${scale})}"><!-- 圆环 --><div :id"chartId" :style"{width:220px,height:220px,transform:scale(${scale})}"></div…