码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 随笔:分布式锁的一点思想


    目录

    首先先从JVM锁开始

    然后到分布式锁

     Redis中分布式锁的应用

     为什么Redis可以实现分布式锁?

     我们来模拟一下分布式锁

    场景:但是如果说服务器宕机了怎么办?那么这个try_lock就一直存在在redis中,其他服务就永远获取不到锁了,被try_lock进行占用

    场景:如果说超时时间内获取锁的业务还没有执行完怎么办?(锁过期处理)

     Redis集群中主节点宕机的不安全情况

    然后说到我们基于异步Event实现的 分布式锁


     

    首先先从JVM锁开始

    1.多线程操作数据的时候,像synchronized,当其中一个线程拿到锁资源,其中线程中的lockRecord记录会与synchronized中锁的对象中的对象头中Monitor word中的锁记录进行交换,而这个锁锁住的对象来自于堆中(一般单机下我们都是这样玩);

    (38条消息) 偏向锁+轻量型锁+重量型锁_Fairy要carry的博客-CSDN博客_偏向锁 轻量锁 重量锁

    2.第二种情况,我们可以锁住的mysql或者redis中的数据,这样就不是堆中的对象数据了

    然后到分布式锁

    首先我们分布式锁在场景下一般是分为两种,一种是cas,一种是基于异步的Event事件

    首先来说下我们为啥用分布式锁

    因为单机下我们JVM锁就保证了数据的一致性,是较为安全的,但是多机下如果操作同一个数据如何保证数据一致性?——>利用我们的分布式锁

    那么用了分布式锁还需要我们的JVM锁吗?

    那肯定是需要的,虽然从分布式锁出来确实也是唯一线程出来操作数据,但是IO太高了,吞吐量较低,我们要提高分布式锁这里效率,就是单机效率高——>所以还是需要JVM锁保证单机出来的线程的唯一性

     Redis中分布式锁的应用

     为什么Redis可以实现分布式锁?

    因为我们redis是一个单独的非业务服务,那么我们所有业务都可以通过redis发送命令,因为我们redis是单线程——>所以只有一个业务能写入命令成功,也就是说这个写入命令获取到了锁可以进行后续操作,而那些其他命令就进行自旋——>体现出了分布式锁在场景在的其一:基于cas操作实现的锁;

    我们的其他命令会在拿到锁的命令在执行的时候进行自旋:setnx(set not if exist)——>判断是否有该key了,不存在该key才会设置值

     我们来模拟一下分布式锁

    1.首先是客户端setnx key 1,然后我们客户端2再setnx key 1发现key已经存在所以说啥也干不了锁已经存在了

    2.然后客户端1删除锁资源,立即删除了try_lock,然后客户端2进行操作获取到锁

    场景:但是如果说服务器宕机了怎么办?那么这个try_lock就一直存在在redis中,其他服务就永远获取不到锁了,被try_lock进行占用

    避免死锁的解决方式:我们可以增加timeout过期时间,当超过这个时间key自动删除,这样就能获取到锁了

    场景:如果说超时时间内获取锁的业务还没有执行完怎么办?(锁过期处理)

    我们redis中引入了一个监控线程,当锁的过期时间要到的时候,监控线程会续上去,来保证我们的命令继续执行下去

     

     Redis集群中主节点宕机的不安全情况

    当一服务请求到redis上,setnx key,然后上锁,此时数据还未同步到从机,然后主节点突然宕机,这样从机顶上去成为新的主机,这样新的主机就会缺少这个上锁key,那么当其他服务过来拿锁就可以拿到从而导致数据不一致的情况

    解决:

    采用redLock(需要五个以上redis实例,分片集群那种),引入时间戳,master1加锁失败,到master2

    (38条消息) Redis实现分布式锁_玄郭郭的博客-CSDN博客_redis分布式锁

    然后说到我们基于异步Event实现的 分布式锁

    (38条消息) Zookeeper_Fairy要carry的博客-CSDN博客

    我们的Zookeeper分布式锁就是基于异步Event实现的,最明显的就是里面的Watch机制,众所周知zk是基于树一样的节点实现的,比如说我们三个client进行请求——>对数据下创建三个节点,比较最小的——>最小的直接拿到锁——>然后其余节点进行监听,当发现操作完毕,删除锁占用的节点时,开始进行竞争——>再次进行比较,最小的占用锁

     

     

  • 相关阅读:
    刷爆力扣之等价多米诺骨牌对的数量
    蓝牙官网demo的记录
    笔记二十二、使用路由state进行传递参数
    简述信息论与采样定理
    【精讲】vue框架 具名插槽、作用域插槽、默认插槽(内含所有源码)
    vue中禁止ios浏览器页面滚动的橡皮筋效果
    数据结构实验二(2) 简单模拟病人看病过程
    批量寄件教程
    评价指标(一)精确率,召回率,F1-score
    nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
  • 原文地址:https://blog.csdn.net/weixin_57128596/article/details/126757617
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号