关于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个的时候 神经元个数越多,可能会产生…

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

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

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

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

pygame下载安装流程

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

初阶数据结构之堆讲解

本篇文章带大家学习的是堆,还请各位观众老爷给个三连 正片开始 堆的概念 如果有一个关键码的集合 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

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

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

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

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

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

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

LeetCode-213. 打家劫舍 II【数组 动态规划】

LeetCode-213. 打家劫舍 II【数组 动态规划】 题目描述:解题思路一:分三种情况,一:不考虑头尾;二:考虑头不考虑尾;三:考虑尾不考虑头。解题思路二:优化空间解题思路三&am…

Android笔记-adb keycode大全

使用方法 用adb发送按键事件时,可以使用下面表中的枚举值或者直接使用数值,比如 adb shell input keyevent KEYCODE_HOME 或者 adb shell input keyevent 3 下面按三种排序方法列出所有按键的 keycode, 分别是: 按功能分 按枚…

LLM端侧部署系列 | 陈天奇MLC-LLM重磅升级:基于机器学习编译的通用LLM部署引擎

引言 简介 MLCEngine的聊天功能 OpenAI风格API 云端REST API Python API iOS SDK Android SDK WebLLM SDK 小结 结构化生成 支持各种平台 优化引擎性能 总结 引言 流星透疏水,走月逆行云。 小伙伴们好,我是《小窗幽记机器学习》的小编&am…

关于onlyoffice回调函数的问题

参考文档1:https://api.onlyoffice.com/zh/editors/callback 在官方文档中描述的十,文档存储服务的回调函数,必须要返回 {"error": 0}表示成功,否则将提示错误信息。 但是经过实测,我们只需要正常的返回2…

每日一题——Python实现PAT乙级1090 危险品装箱(举一反三+思想解读+逐步优化)4千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 题目链接:https://pintia.cn/problem-sets/994805260223102976/exam/problems/typ…

基于SSM的校园闲置物品交易平台

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的校园闲置物品交易平台,java项目…

Advanced RAG 09:『提示词压缩』技术综述

编者按: 如何最大限度地发挥 LLMs 的强大能力,同时还能控制其推理成本?这是当前业界研究的一个热点课题。 针对这一问题,本期精心选取了一篇关于"提示词压缩"(Prompt Compression)技术的综述文章。正如作者所说&#xf…

Zookeeper 四、Zookeeper应用场景

Zookeeper是一个典型的发布/订阅模式的分布式数据管理与协调框架,我们可以使用它来进行分布式数据的发布与订阅。另一方面,通过对Zookeeper中丰富的数据节点类型进行交叉使用,配合Watcher事件通知机制,可以非常方便地构建一系列分…

八爪鱼现金流-032,给用户发邮件提示功能

每个月的 5 号、15 号、25 号的 17:30 工资日,给用户发送邮件,提示记账月报。 您也来记账一笔吧。 然后首页能看到趋势图。 八爪鱼现金流 八爪鱼

【Apache Doris】周FAQ集锦:第 9 期

【Apache Doris】周FAQ集锦:第 9 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和…