码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 微服务架构之:Redisson分布式可重入锁原理


    Redisson可重入锁

      • 可重入锁原理
      • Redisson的锁重试和WatchDog机制
      • Redisson的multiLock原理

    可重入锁原理

        我们自定义的分布式锁采用的是Redis的String数据类型,也就是简单地key-value。在获取锁的时候也就是执行set local thread1 NX EX 10,这个thread1也就是锁的标识,其目的就是将来在释放锁时会判断避免误删,只有锁时自己的才会去删除。那么这个流程是不能重入的。

    在这里插入图片描述
        首先我们来看一下可重入锁的demo:首先m1会执行获取锁的操作,如果失败会报错,如果成功会调用m2。而在m2里有尝试获取锁,在m1调用m2,所以他们是在一个线程里,一个线程两次的来获取锁,这就是锁的重入。
        那在我们的分布式锁流程里,在获取锁就是设置key-value为local、thread1标识。接下来往下执行调用m2,m2会继续获取锁,那么又要执行set local thread1,因为加了NX,所以一点是失败的。所以我们是没有办法实现重入的。

        参考ReentrantLock可重入锁的实现原理,它里面维护了一个阻塞队列和获得锁的次数state,在获取重入锁喉state++,运行完后–。所以我们在设计分布式锁时不仅要记录获取锁的线程,还要记录这个线程它重入锁的记录。显然String类型是不行的,所以我们需要可以存放local、thread1、state的数据结构,这摆明了就是要用Hash。获得重入锁后value++,释放锁时value–。
    在这里插入图片描述
    在这里插入图片描述
    获取锁的Lua脚本:
    在这里插入图片描述

    释放锁的Lua:
    在这里插入图片描述

    Redisson的锁重试和WatchDog机制

        刚才解决了我们自定义redis分布式锁的不可重入问题,但是还存在着锁时不可重试的,而且超时释放的隐患也没能得到解决,最后就是主从一致性的问题。

        我们源码里面的tryLock时可以提供参数的,在给定的参数时间内如果没有获取到锁时可以不停的重新尝试获取锁,成功与否返回true和false。
    在这里插入图片描述

    Redisson的multiLock原理

  • 相关阅读:
    Flink Data Transformation
    UI自动化怎么做?不会代码能不能做
    OpenTelemetry 深度定制:跨服务追踪的实战技巧
    信息学奥赛一本通:1409:判决素数个数
    如何定制一个智能洒水装置(养狗/养花人士请进)
    C++中的继承(上)
    pytest笔记2: fixture
    【微信小程序】常用组件基本使用(viewscroll-viewswiper、textrich-text、buttonimage)
    哈达玛矩阵与克罗内克积
    Java 计算两个字符串的相似度 CosineSimilarity实现
  • 原文地址:https://blog.csdn.net/qq_53999369/article/details/126492760
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号