码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 微服务架构之:基于Redis的分布式锁优化(Redisson)


    Redis分布式锁优化

      • 基于setnx实现分布式锁存在下面的问题
        • 不可重入
        • 不可重试
        • 超时释放
        • 主从一致性问题
      • Redisson
      • Redisson入门

        在此之前先看一看我们搭建的Redis分布式锁3.0版本微服务架构之:Redis的分布式锁—搭建生产可用的Redis分布式锁

    基于setnx实现分布式锁存在下面的问题

    不可重入

        可重入锁就是指一个线程可用多次获取同一把锁。比如说有一个方法a()调用方法b(),在方法a中要先获取锁,然后执行业务去调用方法b。这时候如果锁时不可重入的,那么在a()里获取的锁,在b()时又想获取这把锁,显然是无法获取的,所以这时候就回去等待a()锁的释放,而锁时无法释放的,于是就会出现死锁。所以在这个场景下就要要求锁时可重入的。

    不可重试

        我们之前实现的锁时非阻塞式,我们尝试获取锁如果失败会立即返回false,没有重试的机制。但是在很多业务下锁没获取到的线程不能立即失败,我们希望的是乐观锁自旋的思想,在没获取到的时候重新再次尝试获取锁,等成功了在执行业务。

    超时释放

        虽然我们解决了超时释放误删别人线程锁的问题。但是这个超时的情况还是有可能发生的,虽然不会误删,但是还可能有其他的隐患。所以这个超时释放问题还是要解决,如果这个时间设置的太短,我们的业务还没执行完锁就释放了,这样一来我的业务执行过程中其他线程也有可能执行。这是一个风险,但是如果设置的太长,万一出现了故障,在很长的一段时间里都要等待这个锁的释放,这样的锁的阻塞周期就过长。这是一个矛盾,也需要去解决。

    主从一致性问题

        如果Redis提供了主从集群(就是读写分离),主从同步存在延迟(子线程加载RDB的执行操作,就是写、改、删操作)。我们在主机那获取了锁(setnx),因为存在延迟,在还没有同步到从节点的时候,主机宕机。这个时候会选一个从机当主机,但是从机没有这个锁,所以就会有多个线程拿到锁,可能会出现线程安全问题。但是出现的概率很低,因为延迟太小了。

        虽然这些问题多多少少都存在隐患,但是概率小到可以忽略不计,自己去实现代价太多,但是不实现心里总不踏实,所以我们来找找有没有什么成熟的框架可以让我们直接调用。(Redisson)

    Redisson

        Redisson是一个成熟的在Redis基础上实现的Java驻内存的数据网格。说句人话,之前上一章的内容白学了,因为这里有更成熟,更安全的组件qwq
        它不仅提供了一系列分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。
    在这里插入图片描述
    官网:https://redisson.org/(外网,可能有点卡)

    Redisson入门

    1. 引入依赖
      在这里插入图片描述
    2. 配置Redisson客户端
      在这里插入图片描述
    3. 使用Redisson的分布式锁(阻塞式,可重入,可重试)
      在这里插入图片描述
  • 相关阅读:
    【搞定k8s】k8s轻松部署Dashboard管理集群
    第2章 应用Thinkphp6框架
    2023年苏工展丨合共软件诚邀您参观苏州工业制造展,全新一代制造运营管理平台RockPlus MOM即将亮相!
    阿里云全站加速 DCDN 重磅发布!打造新一代加速引擎
    智慧公厕是将数据、技术、业务深度融合的公共厕所敏捷化“操作系统”
    C++启航跟沸羊羊有关系吗?
    @Controller和@RestController的区别
    eBPF理解 (一)
    中国设备维修安装企业能力等级证书(制冷空调)
    只用二十行代码,用Python实现获取网抑云榜单文件保存本地,非常简单...
  • 原文地址:https://blog.csdn.net/qq_53999369/article/details/126456167
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号