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

news/2025/1/8 19:53:10/

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


文章目录

  • 【redis】redis分布式锁(二)可重入锁
  • 前言
  • 一、可重入锁(又名递归锁)
    • 1、说明:
    • 2、分开解释:
    • 3、可重入锁的种类
      • 隐式锁(即synchronized关键字使用的锁)默认是可重入锁
      • synchronized的重入实现机理
      • 显式锁也有ReentrantLock这样的可重入锁
  • 二、lock/unlock配合可重入锁进行AQS源码分析讲解
  • 三、思考,上述可重入锁计数问题,redis哪个数据类型可以替代?
    • 1、涉及到可重入锁,原来redis中string类型就无法满足要求,因为没法记录加锁几次,也就没法解锁
    • 2、需要用到hash类型作为可重入锁:
    • 3、案例命令:
    • 4、小总结 太帅了!
  • 四、`思考+设计重点(一横一纵)`
  • 五、lua脚本
    • 1、redis命令过程分析:
    • 2、加锁lua脚本lock
      • V1.0版本
      • V2.0版本
      • V3.0版本
      • 在redis中测试
    • 3、解锁lua脚本unlock
      • 设计思路:先确定这个锁是不是自己的 再去解锁 最后删除锁
      • V1.0 V2.0加参数
      • 测试
  • 六、将上述lua脚本整合进入Java程序
    • 1、v6.0不满足可重入性,需要重新修改为v7.0
    • 2、初始版本
    • 3、新建RedisDistributedLock类并实现JUC里的Lock接口
    • 4、满足JUC里的AQS对lock锁的接口规范定义来进行实现落地代码
    • 5、结合设计模式开发属于自己的redis分布式锁工具类
      • a、在tryLock里实现结合lua脚本的加锁
      • b、unlock
      • c、v7.0调用锁
    • 6、工厂模式引入
      • v7.0版本问题说明
      • 引入工厂模式v7.1代码 将分为工厂类、redis分布式锁、业务类三个讲解
        • 工厂类 相当于spring里在controller里的注入的service
        • redis分布式锁 基本不变,但是在业务类中不再是直接调用,而是通过工厂类来间接调用
        • 业务类,通过spring的注入工厂类,再调用对应分布式锁
  • 七、测试可重入性
    • 1、代码
    • 2、结果 有错误 原因是两次进入锁时,生成的uuid不一致
    • 3、脑图
    • 4、解决
      • 原因:是因为在设计redis锁时,每次调用都会new一个uuid。
      • `解决方法`:在工厂类直接new,这样保证了同一次调用使用的一个uuid


前言

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

在这里插入图片描述


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

1、说明:

在这里插入图片描述

2、分开解释:

在这里插入图片描述

3、可重入锁的种类

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

在这里插入图片描述

synchronized的重入实现机理

在这里插入图片描述

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

结论:
在这里插入图片描述


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

在这里插入图片描述


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

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

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

在这里插入图片描述

3、案例命令:

在这里插入图片描述

4、小总结 太帅了!

在这里插入图片描述


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

在这里插入图片描述


五、lua脚本

在这里插入图片描述

1、redis命令过程分析:

在这里插入图片描述

2、加锁lua脚本lock

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

V1.0版本

蓝色部分是重复的,可以合并
在这里插入图片描述

V2.0版本

redis中,hincrby是具有hset的功能的,所以可以将条件合并
在这里插入图片描述

V3.0版本

换成对应的参数
在这里插入图片描述

在redis中测试

在这里插入图片描述

3、解锁lua脚本unlock

在这里插入图片描述

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

在这里插入图片描述

V1.0 V2.0加参数

在这里插入图片描述

测试

在这里插入图片描述


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

在这里插入图片描述

在这里插入图片描述
对外不再暴露加解锁的代码,直接封装成可执行方法

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

需要将加解锁剥离出来, 封装成可执行方法
在这里插入图片描述
在这里插入图片描述

2、初始版本

在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述

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

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

在这里插入图片描述

b、unlock

在这里插入图片描述

c、v7.0调用锁

在这里插入图片描述

6、工厂模式引入

在这里插入图片描述

v7.0版本问题说明

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

七、测试可重入性

1、代码

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

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

在这里插入图片描述

3、脑图

在这里插入图片描述

4、解决

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

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

在这里插入图片描述



http://www.ppmy.cn/news/55128.html

相关文章

duubo+zookeeper

1、Dubbo简介 1. Dubbo是什么? 高性能、轻量级、开源、基于java Dubbo 是阿里集团开源的远程服务调用的分布式框架(告别Web Service模式中的WSDL,以服务者与消费者的方式在dubbo上注册) 协议和序列化框架都可以插拔是及其鲜明…

scratch比大小 中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析2023年3月

目录 scratch比大小 一、题目要求 1、准备工作 2、功能实现 二、案例分析

Hive ---- Hive 安装

Hive ---- Hive 安装 1. Hive安装地址2. Hive安装部署1. 安装Hive2. 启动并使用Hive 3. MySQL安装1. 安装MySQL2. 配置MySQL3. 卸载MySQL说明 4. 配置Hive元数据存储到MySQL1. 配置元数据到MySQL2. 验证元数据是否配置成功3. 查看MySQL中的元数据 5. Hive服务部署1. hiveserver…

访问学者出国申请可以分为哪几类?

申请出国访学的人越来越多,访学之所以受欢迎,对申请访学的人员来说,又有哪些收获?访问学者可以分为哪几类呢?按照访美经费来源,访问学者大致可分为三类,即公派访问学者、海外资助类和自费访问学…

经济回暖、兴趣电商升级,品牌在竞争白热化的市场中如何突围?| D3大会圆桌回顾

冬去春来,消费市场韧性回弹,消费趋势正处于“转折”和“跃升”的阶段。新的机遇和挑战也将伴随着新的思维、方法和模式,呈现出更多元的变化和创新:渠道虚实融合,内容为王,社会化媒体成为主战场等消费场景不…

改善电商实时聊天体验的 5 大方法

今天,大多数网站都提供实时聊天支持作为选项。这是因为客户压倒性地将实时聊天列为他们的首选联系方式。 高达86%的消费者愿意在更好的客户体验上花费更多,但只有1%的人的期望始终得到满足,对于能够正确进行实时聊天的品牌来说,这…

霍兰德人格分析雷达图

雷达图 Radar Chart 雷达图是多特性直观展示的重要方式 问题分析 霍兰德认为:人格兴趣与职业之间应有一种内在的对应关系 人格分类:研究型、艺术型、社会型、企业型、传统型、现实性 职业:工程师、实验员、艺术家、推销员、记事员、社会工…

整型数据类型详解

大家好,今天我们来聊聊整型数据类型。什么是整型数据类型呢?顾名思义,就是整数,包括正整数、负整数和零。它是编程语言中最基本的数据类型之一,也是应用最广泛的数据类型之一。 在讲整型数据类型之前,我们…