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脚本。这样能保证操作的原子性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

哔哩哔哩秋招Java二面

前言 作者:晓宜 个人简介:互联网大厂Java准入职,阿里云专家博主,csdn后端优质创作者,算法爱好者 一面过后面试官叫我别走,然后就直接二面,二面比较简短,记录一下,希望可以…

Docker基本配置及使用

Docker基本配置及使用 使用步骤 1.卸载旧版 代码如下:首先如果系统中已经存在旧的Docker,则先卸载 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engin…

深入了解 大语言模型(LLM)微调方法

引言 众所周知,大语言模型(LLM)正在飞速发展,各行业都有了自己的大模型。其中,大模型微调技术在此过程中起到了非常关键的作用,它提升了模型的生成效率和适应性,使其能够在多样化的应用场景中发挥更大的价值。 那么&…

【运维】StarRocks数据迁移到新集群(针对于集群互通、不互通的情况)

文章目录 一. 迁移整体思路1. 对于新旧集群互通的情况2. 对于新旧集群不互通的情况 二、迁移过程(两个集群互通的情况)1. 备份过程1.1. 通过mysqlclient与starrocks进行关联1.2. 创建仓库与minio建立联系1.3. 备份数据到minio 2. 迁移过程2.1. 通过mysql…

个人网站制作 Part 9 | Web开发项目

文章目录 个人网站制作 Part 9 | Web开发项目👩‍💻 基础Web开发练手项目系列:个人网站制作🚀 添加博客功能🔨使用Express和MongoDB🔧步骤 1: 创建博客模型🔧步骤 2: 创建博客路由 &#x1f528…

边缘计算网关的工作原理及其在工业领域的应用价值-天拓四方

随着物联网技术的快速发展,物联网时代已经悄然来临。在这个时代,数以亿计的设备相互连接,共享数据,共同构建智慧的世界。边缘计算网关通过将计算能力和数据存储推向网络的边缘,实现了对海量数据的实时处理,…

VBA combox/listbox 控件响应鼠标滚轮事件

在vba中,我们在用户窗体中如果添加有combox控件,或者是listbox控件。正常情况下,combox 和 listbox 是不响应鼠标滚轮事件的,且默认的VBA控件中,也没有提供响应鼠标滚轮事件的方法和入口。如此以来,我们在c…

三维卡通数字人解决方案,支持unity和Maya

企业对于品牌形象和宣传手段的创新需求日益迫切,美摄科技凭借其在三维卡通数字人领域的深厚积累,推出了面向企业的三维卡通数字人解决方案,帮助企业轻松打造独具特色的虚拟形象,提升品牌影响力和市场竞争力。 美摄科技的三维卡通…

AI技术崛起:数据可视化之路更近

在当今AI技术蓬勃发展的时代,数据可视化作为信息传达的重要手段,其门槛逐渐降低。然而,这并不意味着我们可以忽视学习数据可视化的重要性。即使不需要深入专业技术,对数据可视化的基础知识的了解也是至关重要的。那么,…

应用程序开发教学:医保购药系统源码搭建实战

医保购药系统作为医疗服务的重要组成部分,其开发不仅能够为患者提供更加便捷的购药服务,还能够提高医疗机构的管理效率。接下来,小编将为您讲解医保购药系统的源码搭建过程,介绍应用程序开发的基本步骤和技巧。 一、系统设计 我…

01背包 与 emo题目背景(周超人的遗憾) 的爱恨情仇

本题背景有意思,大家当乐子看,目前没有找到题目原题,也没有写过完全是01背包模板的题目,该篇文章大家注意其01背包一维写法的模板就好,注意各个关键点 ✨欢迎来到脑子不好的小菜鸟的文章✨ 🎈创作不易&…

Vue3-03_组件基础_上

单页面应用程序 什么是单页面应用程序 单页面应用程序(英文名:Single Page Application)简称 SPA,顾 名思义,指的是一个 Web 网站中只有唯一的一个 HTML 页面,所有的 功能与交互都在这唯一的一个页面内完…

Square Pair

传送门 题意 思路 实际上我们要的 AiAj 肯定是 (ab)^2 所以我们只需要关注于 ai 这个数经过质因数分解 除掉平方数的结果 也就是Ai​ 除去完全平方数因子 每次我们对ai讨论只需要加上 cnt[a[i]] 即可 此外 0 需要特判 code

mysql 排序底层原理解析

前言 本章详细讲下排序,排序在我们业务开发非常常见,有对时间进行排序,又对城市进行排序的。不合适的排序,将对系统是灾难性的,这个不是危言耸听。可能有些人会想,对于排序mysql 是怎么实现的,…

WWW2024 | PromptMM:Prompt-Tuning增强的知识蒸馏助力多模态推荐系统

论文:https://arxiv.org/html/2402.17188v1 代码:https://github.com/HKUDS/PromptMM 研究动机 多模态推荐系统极大的便利了人们的生活,比如亚马逊和Netflix都是基于多模态内容进行推荐的。对于研究,人们也遵循工业界的趋势,进行modality-aware的用户…

生成器建造者模式(Builder)——创建型模式

生成器/建造者模式——创建型模式 什么是生成器模式? 生成器模式是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。 提炼两个关键点:Ⅰ.分步骤创建复杂对象。Ⅱ.相同创建代码…

北斗卫星在桥隧坡安全监测领域的应用及前景展望

北斗卫星在桥隧坡安全监测领域的应用及前景展望 北斗卫星系统是中国独立研发的卫星导航定位系统,具有全球覆盖、高精度定位和海量数据传输等优势。随着卫星导航技术的快速发展,北斗卫星在桥隧坡安全监测领域正发挥着重要的作用,并为相关领域…

python 目录和文件基本操作

目录操作 获取当前目录: import os dir_path os.getcwd() print("当前目录:", dir_path) 当前目录: D:\work\pycharm\object 创建目录: import osdir_path os.getcwd() print("当前目录:", d…

【算法刷题 | 栈】3.16(有效的括号、删除字符串中的所有相邻重复项、逆波兰表达式求值)

文章目录 1.有效的括号1.1题目1.2解法:栈 2.删除字符串中的所有相邻重复项2.1题目2.2解法:栈 3.逆波兰表达式求值3.1题目3.2解法:栈 1.有效的括号 1.1题目 给定一个只包括 (,),{,},[&#xff…

Midjourney绘图欣赏系列(十二)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子,它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同,Midjourney 是自筹资金且闭源的,因此确切了解其幕后内容尚不…