【redis】redis分布式锁(二)可重入锁+设计模式

这篇具有很好参考价值的文章主要介绍了【redis】redis分布式锁(二)可重入锁+设计模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【redis】redis分布式锁(二)可重入锁



前言

上一篇链接: 【redis】redis分布式锁(一)手写分布式锁1.0~6.0

【redis】redis分布式锁(二)可重入锁+设计模式


一、可重入锁(又名递归锁)

1、说明:

【redis】redis分布式锁(二)可重入锁+设计模式

2、分开解释:

【redis】redis分布式锁(二)可重入锁+设计模式

3、可重入锁的种类

隐式锁(即synchronized关键字使用的锁)默认是可重入锁

【redis】redis分布式锁(二)可重入锁+设计模式

synchronized的重入实现机理

【redis】redis分布式锁(二)可重入锁+设计模式

显式锁也有ReentrantLock这样的可重入锁

结论:
【redis】redis分布式锁(二)可重入锁+设计模式


二、lock/unlock配合可重入锁进行AQS源码分析讲解

【redis】redis分布式锁(二)可重入锁+设计模式


三、思考,上述可重入锁计数问题,redis哪个数据类型可以替代?

1、涉及到可重入锁,原来redis中string类型就无法满足要求,因为没法记录加锁几次,也就没法解锁

2、需要用到hash类型作为可重入锁:

【redis】redis分布式锁(二)可重入锁+设计模式

3、案例命令:

【redis】redis分布式锁(二)可重入锁+设计模式

4、小总结 太帅了!

【redis】redis分布式锁(二)可重入锁+设计模式


四、思考+设计重点(一横一纵)

【redis】redis分布式锁(二)可重入锁+设计模式


五、lua脚本

【redis】redis分布式锁(二)可重入锁+设计模式

1、redis命令过程分析:

【redis】redis分布式锁(二)可重入锁+设计模式

2、加锁lua脚本lock

下边将使用lua脚本的方式,把可重入锁的案例语句原子化

V1.0版本

蓝色部分是重复的,可以合并
【redis】redis分布式锁(二)可重入锁+设计模式

V2.0版本

redis中,hincrby是具有hset的功能的,所以可以将条件合并
【redis】redis分布式锁(二)可重入锁+设计模式

V3.0版本

换成对应的参数
【redis】redis分布式锁(二)可重入锁+设计模式

在redis中测试

【redis】redis分布式锁(二)可重入锁+设计模式

3、解锁lua脚本unlock

【redis】redis分布式锁(二)可重入锁+设计模式

设计思路:先确定这个锁是不是自己的 再去解锁 最后删除锁

【redis】redis分布式锁(二)可重入锁+设计模式

V1.0 V2.0加参数

【redis】redis分布式锁(二)可重入锁+设计模式

测试

【redis】redis分布式锁(二)可重入锁+设计模式


六、将上述lua脚本整合进入Java程序

【redis】redis分布式锁(二)可重入锁+设计模式

【redis】redis分布式锁(二)可重入锁+设计模式
对外不再暴露加解锁的代码,直接封装成可执行方法

1、v6.0不满足可重入性,需要重新修改为v7.0

需要将加解锁剥离出来, 封装成可执行方法
【redis】redis分布式锁(二)可重入锁+设计模式
【redis】redis分布式锁(二)可重入锁+设计模式

2、初始版本

【redis】redis分布式锁(二)可重入锁+设计模式

3、新建RedisDistributedLock类并实现JUC里的Lock接口

【redis】redis分布式锁(二)可重入锁+设计模式

4、满足JUC里的AQS对lock锁的接口规范定义来进行实现落地代码

5、结合设计模式开发属于自己的redis分布式锁工具类

【redis】redis分布式锁(二)可重入锁+设计模式

【redis】redis分布式锁(二)可重入锁+设计模式
【redis】redis分布式锁(二)可重入锁+设计模式

a、在tryLock里实现结合lua脚本的加锁

【redis】redis分布式锁(二)可重入锁+设计模式

b、unlock

【redis】redis分布式锁(二)可重入锁+设计模式

c、v7.0调用锁

【redis】redis分布式锁(二)可重入锁+设计模式

6、工厂模式引入

【redis】redis分布式锁(二)可重入锁+设计模式

v7.0版本问题说明

【redis】redis分布式锁(二)可重入锁+设计模式

引入工厂模式v7.1代码 将分为工厂类、redis分布式锁、业务类三个讲解

【redis】redis分布式锁(二)可重入锁+设计模式

工厂类 相当于spring里在controller里的注入的service

【redis】redis分布式锁(二)可重入锁+设计模式

redis分布式锁 基本不变,但是在业务类中不再是直接调用,而是通过工厂类来间接调用

【redis】redis分布式锁(二)可重入锁+设计模式

业务类,通过spring的注入工厂类,再调用对应分布式锁

【redis】redis分布式锁(二)可重入锁+设计模式

七、测试可重入性

1、代码

【redis】redis分布式锁(二)可重入锁+设计模式
【redis】redis分布式锁(二)可重入锁+设计模式

2、结果 有错误 原因是两次进入锁时,生成的uuid不一致

【redis】redis分布式锁(二)可重入锁+设计模式

3、脑图

【redis】redis分布式锁(二)可重入锁+设计模式

4、解决

原因:是因为在设计redis锁时,每次调用都会new一个uuid。

解决方法:在工厂类直接new,这样保证了同一次调用使用的一个uuid

【redis】redis分布式锁(二)可重入锁+设计模式文章来源地址https://www.toymoban.com/news/detail-435718.html


到了这里,关于【redis】redis分布式锁(二)可重入锁+设计模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • redis — redis cluster集群模式下如何实现批量可重入锁?

    一、redis cluster 集群版 在Redis 3.0版本以后,Redis发布了Redis Cluster。该集群主要支持搞并发和海量数据处理等优势,当 Redis 在集群模式下运行时,它处理数据存储的方式与作为单个实例运行时不同。这是因为它应该准备好跨多个节点分发数据,从而实现水平可扩展性。具体能力表

    2024年01月21日
    浏览(33)
  • 【面试 分布式锁详细解析】续命 自旋锁 看门狗 重入锁,加锁 续命 解锁 核心源码,lua脚本解析,具体代码和lua脚本如何实现

    自己实现锁续命 在 controller 里开一个 线程 (可以为 守护线程) 每10秒,判断一个 这个 UUID是否存在,如果 存在,重置为 30秒。 如果不存在,守护线程 也结束。 基本的key value 基本的使用 setIfAbsent存在不设置 16384 Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念。 R

    2023年04月09日
    浏览(30)
  • Java入门-可重入锁

    什么是可重入锁? 当线程获取某个锁后,还可以继续获取它,可以递归调用,而不会发生死锁; 可重入锁案例 程序可重入加锁 A.class,没有发生死锁。 sychronized锁 运行结果 ReentrantLock 运行结果 如何保证可重入 当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里

    2024年02月22日
    浏览(31)
  • java~理解可重入锁

    在Java中,可重入锁(Reentrant Lock)是一种同步机制,允许线程在持有锁的情况下再次获取该锁,而不会被自己所持有的锁所阻塞。也就是说,一个线程可以多次获得同一个锁,而不会出现死锁的情况。 可重入锁在多线程编程中非常有用,它允许线程在访问共享资源时多次获取

    2024年02月09日
    浏览(33)
  • curator实现的zookeeper可重入锁

    Curator是一个Apache开源的ZooKeeper客户端库,它提供了许多高级特性和工具类,用于简化在分布式环境中使用ZooKeeper的开发。其中之一就是可重入锁。 Curator提供了 InterProcessMutex 类来实现可重入锁。以下是使用Curator实现ZooKeeper可重入锁的示例: import org.apache.curator.framework.Curato

    2024年02月15日
    浏览(31)
  • 并发编程之可重入锁ReentrantLock

    大家都知道在并发编程中一般会用到多线程技术,多线程技术可以大大增加系统QPS/TPS。但是在一些特殊的业务场景下我们需要限制线程的并发数目,比如秒杀系统、多种商品金额叠加运算等等都是需要限制线程数量。特别是在分布式微服务架构,多线程同步问题尤为明显。一

    2023年04月25日
    浏览(27)
  • 【Java | 多线程】可重入锁的概念以及示例

    可重入锁(又名递归锁)是一种特殊类型的锁,它允许 同一个线程在获取锁后再次进入该锁保护的代码块或方法,而不需要重新获取锁 。 说白了,可重入锁的特点就是同一个线程可以多次获取同一个锁,而不会因为之前已经获取过锁而阻塞。 可重入锁的一个优点是可以一定

    2024年04月24日
    浏览(26)
  • JavaEE 初阶篇-深入了解 CAS 机制与12种锁的特征(如乐观锁和悲观锁、轻量级锁与重量级锁、自旋锁与挂起等待锁、可重入锁与不可重入锁等等)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录         1.0 乐观锁与悲观锁概述         1.1 悲观锁(Pessimistic Locking)         1.2 乐观锁(Optimistic Locking)         1.3 区别与适用场景         2.0 轻量级锁与重量级锁概述         2.1 真正加

    2024年04月16日
    浏览(26)
  • Redis与分布式-分布式锁

    接上文 Redis与分布式-集群搭建 为了解决上述问题,可以利用分布式锁来实现。 重新复制一份redis,配置文件都是刚下载时候的不用更改,然后启动redis服务和redis客户。 redis存在这样的命令:和set命令差不多,但是它有一个机制,当指定的key不存在的时候,才能进行插入,实

    2024年02月07日
    浏览(37)
  • 【分布式技术专题】「分布式技术架构」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)

    Tomcat的总体结构从外到内进行分布,最大范围的服务容器是Server组件,Service服务组件(可以有多个同时存在),Connector(连接器)、Container(容器服务),其他组件:Jasper(Jasper解析)、Naming(命名服务)、Session(会话管理)、Logging(日志管理)、JMX(Java 管理器扩展服务

    2024年01月24日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包