Redisson 分布式锁原理分析

Redisson 分布式锁原理分析

示例程序

示例程序:

public class RedissonTest {public static void main(String[] args) {Config config = new Config();config.useSingleServer().setPassword("123456").setAddress("redis://127.0.0.1:6379");RedissonClient redisson = Redisson.create(config);// RLock对象RLock lock = redisson.getLock("MY_KEY");ExecutorService pool = Executors.newFixedThreadPool(5);IntStream.range(1, 5).forEach(item -> {pool.execute(() -> {try {if (lock.tryLock(2000, TimeUnit.MILLISECONDS)) {System.out.println(Thread.currentThread().getName() + "get Lock!!");if (lock.tryLock(2000, TimeUnit.MILLISECONDS)) {System.out.println(Thread.currentThread().getName() + "get Lock!!");Thread.sleep(300000);lock.unlock();}Thread.sleep(500000);lock.unlock();}} catch (Exception e) {System.out.println("error!!");}});});}
}

运行结果:
image.png

redis中的值:
image.png

原理

分布式锁实现加锁解锁都需要使用lua脚本。
利用Redis的Hash结构实现可重入。

Hash结构存值如下:

keyfieldvalue
  • key:就是分布式锁的key
  • field:用于存储一个能够表示一个线程的唯一标识(Redisson使用的UUID)
  • value:表示当前锁被同一个线程加锁的次数(可重入的实现方式)

下面以key为MY_KEY,field线程唯一标识为:WWSSWWWKKII99I为例,总结下加锁解锁流程:

加锁流程

加锁流程:

加锁之后,hash结构为

keyfieldvalue
MY_KEYWWSSWWWKKII99I1

实际的存储示例:
一个线程获取了一次:
image.png
一个线程获取了两次(可重入):
image.png

解锁流程

解锁流程:
假设当前锁的hash结构是

keyfieldvalue
MY_KEYWWSSWWWKKII99I2

这代表分布式锁 MY_KEY 被线程标识为 WWSSWWWKKII99I 的线程获取了两次

需要注意,整个加锁解锁的命令全都需要使用lua脚本。这样能保证操作的原子性。

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

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

相关文章

cool 中的Midway ----node.js的TypeORM的使用

1.介绍 TypeORM | Midway TypeORM 是 node.js 现有社区最成熟的对象关系映射器(ORM )。本文介绍如何在 Midway 中使用 TypeORM 相关信息: 描述可用于标准项目✅可用于 Serverless✅可用于一体化✅包含独立主框架❌包含独立日志❌ 和老写…

第二十四天-数据可视化Matplotlib

目录 1.介绍 2.使用 1. 安装: 2.创建简单图表 3.图表类型 1.一共分为7类 2.变化 1.折线图 3.分布 ​编辑 1.直方图 2.箱型图 4.关联 1. 散点图: 2.热力图: 5.组成 1.饼图 2.条形图 6.分组 1.簇型散点图 2.分组条形图 3.分…

JOSEF约瑟 TQ-100同期继电器 额定直流电压220V 交流电压100V±10V

TQ-100型同期继电器 TQ-100同期继电器 ​ l 应用 本继电器用于双端供电线路的自动重合闸和备用电源自投装置中,以检查线路电压与母线电压的 相位差和幅值差。 2 主要性能 2 1采用进口集成电路和元器件构成,具有原理先进、性能稳定、可靠性高、动作值精…

Git版本管理--远程仓库

前言: 本文记录学习使用 Git 版本管理工具的学习笔记,通过阅读参考链接中的博文和实际操作,快速的上手使用 Git 工具。 本文参考了引用链接博文里的内容。 引用: 重学Git-Git远程仓库管理_git remote add origin-CSDN博客 Git学习笔记&am…

[自研开源] MyData 数据集成之数据过滤 v0.7.2

开源地址:gitee | github 详细介绍:MyData 基于 Web API 的数据集成平台 部署文档:用 Docker 部署 MyData 使用手册:MyData 使用手册 试用体验:https://demo.mydata.work 交流Q群:430089673 概述 本篇基于…

javaEE——线程的等待和结束

文章目录 Thread 类及常见方法启动一个线程中断一个线程变量型中断调用 interrupt() 方法来通知观察标志位是否被清除 等待一个线程获取当前线程引用休眠当前线程 线程的状态观察线程的所有状态观察 1: 关注 NEW 、 RUNNABLE 、 TERMINATED 状态的切换 多线程带来的风险为什么会…

【大模型系列】问答理解定位(Qwen-VL/Llama2/GPT)

文章目录 1 Qwen-VL(2023, Alibaba)1.1 网络结构1.2 模型训练 2 Llama2(2023, Meta)2.1 网络结构2.1.1 MHA/GQA/MQA2.1.2 RoPE(Rotary Position Embedding, 旋转式位置编码)2.1.3 RMSNorm 2.2 推理2.2.1 集束搜索(beam search)2.2.2 RoPE外推 3 GPT系列(OpenAI) 1 Qwen-VL(2023…

android中单例模式为什么会引起内存泄漏?

单例模式使用不恰当会造成内存泄漏。因为单例的静态特性使得单例的生命周期和应用的生命周期一样长, 如果一个对象已经不需要使用了,但是单例对象还持有该对象的引用,那么这个对象就不能被正常回收,因此会导致内存泄漏。 举个例子…

【数据可视化】使用Python + Gephi,构建中医方剂关系网络图!

代码和示例数据下载 前言 在这篇文章中,我们将会可视化 《七版方剂学》 的药材的关系,我们将使用Python制作节点和边的数据,然后在Gephi中绘制出方剂的网络图。 Gephi是一个专门用于构建网络图的工具,只要你能提供节点和边的数…

机器学习算法在数据挖掘中的应用

在数据挖掘的实践中,各种机器学习算法都扮演着重要的角色,它们能够从数据中学习规律和模式,并用于预测、分类、聚类等任务。以下是几种常见的机器学习算法以及它们在数据挖掘任务中的应用场景和优缺点。 1. 决策树(Decision Tree…

Golang的CSP模型讲解

一.CSP是什么 CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型,是一个很强大的并发数据模型,是上个世纪七十年代提出的,用于描述两个独立的并发实体通过共享的通讯chann…

Stable Diffusion科普文章【附升级gpt4.0秘笈】

随着人工智能技术的飞速发展,我们越来越多地看到计算机生成的艺术作品出现在我们的生活中。其中,Stable Diffusion作为一种创新的图像生成技术,正在引领一场艺术创作的革命。本文将为您科普Stable Diffusion的相关知识,带您走进这…

微信小程序睡眠X秒【while循环模式】

// 微信小程序睡眠X秒sleep(numberMillis) { var now new Date(); var exitTime now.getTime() numberMillis; while (true) { now new Date(); if (now.getTime() > exitTime) {return;}} }, // 微信小程序睡眠X秒 this.sleep(2000); 参考:微信小程序睡眠…

Linux/Ubuntu/Debian控制台启动的程序和terminal分离的方法-正在运行怎么关闭窗口

disown 是一个 shell 内置函数,它从 shell 的作业表中删除指定的作业,使它们免受挂起的影响。 使用方法如下: 首先,正常运行命令: 你的命令然后,按 Ctrl Z 暂停命令。 现在,运行&#xff…

MT1069 圆切平面

n个圆最多把平面分成几部分?输入圆的数量N,问最多把平面分成几块。比如一个圆以把一个平面切割成2块。 不考虑负数,0或者其他特殊情况。 格式 输入格式:输入为整型 输出格式:输出为整型 样例 1 输入: …

全量知识系统“全基因序列” 的百度AI答问 之1

在您所描述的框架下,我们可以开始探索“知识”实体的起点以及如何认识它。首先,让我们明确一下“实体”的定义和性质。实体,在哲学和许多其他学科中,通常被理解为存在于我们世界中的具体事物或抽象概念。它们可以是物理的&#xf…

Flink 集群部署模式

文章目录 前言一、会话模式(Session Mode)二、单作业模式(Per-Job Mode)三、应用模式(Application Mode) 前言 Flink支持多种集群部署模式,以满足不同场景和需求。以下是Flink的主要集群部署模…

springboot多模块下swaggar界面出现异常(Knife4j文档请求异常)或者界面不报错但是没有显示任何信息

继上一篇博文,我们解决了多模块下扫描不到子模块的原因,建议先看上一个博客了解项目结构: springboot 多模块启动报错Field XXX required a bean of type XXX that could not be found. 接下来我们来解决swaggar异常的原因,我们成功启动项目…

QML 布局管理器之ColumnLayout

一.ColumnLayout讲解 QML中的ColumnLayout是一种布局元素,用于在垂直列中排列其子元素。它的主要使用下列附加属性: Layout.minimumWidth Layout.minimumHeight Layout.preferredWidth Layout.preferredHeight Layout.maximumWidth Layout.maximumHeight Layout.fil…

代码随想录算法训练营 Day25|回溯算法2

216.组合总和III 思路 按照回溯算法的逻辑,写代码。 递归函数的参数,除了原有的n, k, startIndex,增加一个sum,计算当前path中的和。 终止条件用sum与n比较,如果满足相等,且满足长度为k,则加入…