• 谷粒商城实战(009 缓存-分布式锁)


    Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强

    总时长 104:45:00 共408P

    此文章包含第158p-第p165的内容


    分布式锁

    原理和使用

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    使用下shell对产生的命令进行发送
    查看 -> 撰写 -> 撰写栏

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    idea 选中的代码提取成方法
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    加锁和过期时间是一个原子操作 就可以避免死锁
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    使用lua

    在这里插入图片描述

    也可以全部用lua脚本写分布式锁,这种一半Java代码,一半Redis运行代码,受网络原因影响很大 。网上有基于lua脚本实现的分布式锁 。
    在这里插入图片描述

    原子删锁
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    怕业务未执行完锁就过期了,可以给过期时间设置长一些 如300秒
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    redis自己实现分布式锁的最大的问题就是自旋,自旋消耗cpu资源,所以还是得中间件进行阻塞,比如zookeeper。
    ZooKeeper 可以作为解决自旋问题的一种工具或组件的一部分。在分布式系统中,如果多个节点或线程需要协调访问某个共享资源,可以借助 ZooKeeper 提供的分布式锁机制来解决自旋问题。

    具体来说,当一个节点或线程需要访问共享资源时,它可以尝试获取一个分布式锁。如果锁已经被其他节点或线程持有,那么它可以选择在获取锁之前自旋一段时间,等待锁释放。当锁释放时,它再次尝试获取锁。如果自旋等待的时间过长,也可以选择放弃自旋,暂时释放 CPU 控制权,并稍后再次尝试获取锁。

    总的来说,虽然 ZooKeeper 本身并不直接解决自旋问题,但它提供了一种分布式锁的实现,可以帮助分布式系统中的节点或线程协调访问共享资源,从而间接地解决自旋问题。

    使用更专业的Redisson进行分布式锁操作

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    第二个带配置,我们使用第一个原生的

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    单元测试
    在这里插入图片描述

    在这里插入图片描述

    可重入锁

    在这里插入图片描述

    注入的变量名称最好可以和配置类里的名称(组件ID)一样(不一样也可以)
    在这里插入图片描述
    在这里插入图片描述
    继承了juc包下的Lock类
    在这里插入图片描述
    在这里插入图片描述
    阻塞式等待,不需要自旋了
    (无锁自旋和重量级锁)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    使用了redis的看门狗 会自动续期
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    redis 看门狗原理

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    这里看不懂应该去学习手动使用redis实现分布式锁,框架是对手动的封装,看不懂很正常
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    读写锁

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    写成功才能读到
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    闭锁

    在这里插入图片描述
    在这里插入图片描述
    Latch翻译:门闩(shaun)
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    juc lock的用法如下选中的蓝色代码
    在这里插入图片描述

    信号量

    在这里插入图片描述

    在这里插入图片描述

    设置3个车位
    在这里插入图片描述

    值变成0后无法继续停车(请求阻塞)
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    可以利用信号量进行限流操作
    在这里插入图片描述

    使用tryAcquire 不会阻塞 会直接返回false,利用false可以返回一个页面给客户,让样客户可以看到当前爆满,请稍后重试这样的页面
    在这里插入图片描述

    在这里插入图片描述

    error那里可以直接写当前流量过大,请稍后重试
    在这里插入图片描述

    在这里插入图片描述


  • 相关阅读:
    Bert:语言模型
    AIE磷脂化合物微球/AIE分子脂质体磷脂化合物微球/表面基团修饰AIE微球的制备过程
    【javaEE】多线程初阶(Part8线程池!!!)【重要】
    KingbaseES应对表年龄增长过快导致事务回卷
    网络安全(黑客)自学
    Vue3中h方法和createVnode的实现-详细步骤
    WPF 项目开发入门(四) MVVM 模式 与 TreeView树组件
    保护视力,从 CareUEyes 开始 —— 你的电脑护眼小助手
    vue事件处理&&表单输入绑定
    计算机操作系统 第四章 存储器管理(3)
  • 原文地址:https://blog.csdn.net/wang_book/article/details/137268885