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

【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

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/15510.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【软件测试】测试用例的设计

文章目录 一. 针对没有需求的案例来设计测试用例二. 针对有需求的案例来设计测试用例1. 穷举法2. 等价类3. 边界值4. 判定表法5. 场景设计法5.1 简介5.2 基本设计步骤5.3 基本流和备选流5.4 使用场景5.5 优缺点5.6 实例 6. 错误猜测法 一. 针对没有需求的案例来设计测试用例 针…

深度强化学习——蒙特卡洛算法(6)

注:本章的内容作为补充插曲,大家可以选看,不过还是建议把最后一个使用蒙特卡洛近似求期望稍微看一下 蒙特卡洛是一大堆随机算法,通过随机样本来估算真实值 使用随机样本来近似Π 1、在[a,b]做随机均匀抽样,抽出n个样…

YOLO物体检测系列1.经典方法概述及评价指标体现

1. 深度学习经典检测方法: two-stage(两阶段): Faster-rcnn Mask-RCNN系列 one-stage(单阶段):Yolo系列 两阶段:一阶段实现RPN候选区域预选 二阶段基于候选区域再进行检测回归分类任务 单阶段:一个CNN卷积网络实现检测…

C++线程的简单学习及了解

此篇文章只是线程的简单了解。 文章目录 前言一、线程的优缺点二、C线程库 1.thread类的简单介绍2.线程函数参数总结 前言 什么是线程? 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控…

day3 TCP/IP协议与五层体系结构

TCP / IP 四层体系结构 TCP / IP工作流程: 现在互联网使用的 TCP/IP 体系结构已经发生了演变,即某些应用程序可以直接使用 IP 层,或甚至直接使用最下面的网络接口层。 沙漏型展示: 五层体系结构 各层的主要功能 应用层&#xff1…

搭建外网minecraft服务器方案

很多minecraft服务器主都想自己搭建一个外网可以访问的minecraft服务器,在没有外网IP的情况下,一般都是使用Logmein Hamachi方案。这种方案有它的弊端,需要客户机安装Hamachi,十分不方便。另外,免费版只支持5人&#x…

mysql如何加行锁

一、概述 InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁,所以后面的内容都是基于 InnoDB 引擎的。当我们使用delete、update进行数据库删除、更新的时候,数据库会自动加上行锁。但是,行锁有时也会失效。 数据库版本&a…

笔记:计算机网络体系结构(OSI七层模型、TCP/IP五层协议)

计算机网络体系结构 计算机网络是一个复杂的、具有综合性技术的系统,它由计算机系统、通信处理机、通信线路和通信设备、操作系统以及网络协议等组成。为了更好地描述计算机网络结构,使计算机网络系统有条不紊地处理工作,需要定义一种较好的…

CH9121网络串口透传应用

概述 随着物联网技术的普及,越来越多的传统设备出现联网功能需求。串口作为使用较为广泛的一种通信接口,串口转以太网,进行远程数据传输需求逐渐显现出来。CH9121内部集成TCP/IP协议栈,无需编程,即可轻松实现网络数据…

【SWAT水文模型】SWAT水文模型建立及应用第二期:土地利用数据的准备

SWAT水文模型建立及应用:土地利用数据的准备 1 简介2 土地利用数据的下载2.1 数据下载方式2.1.1 中科院1km土地利用数据2.1.2 清华大学高精度土地利用数据 2.2 数据下载 3 土地利用数据的准备3.1 矢量转栅格3.2 土地利用类型的重分类3.3 土地利用分布图投影调整3.4 …

【LeetCode】213. 打家劫舍 II

213. 打家劫舍 II(中等) 思路 这道题是 198.打家劫舍 的拓展版,区别在于:本题的房间是环形排列,而198.题中的房间是单排排列。 将房间环形排列,意味着第一间房间和最后一间房间不能同时盗窃,因…

EPIT定时器实验(一)

EPIT定时器简介 EPIT:Enhanced Periodic Interrupt Timer,直译就是增强的周期中断定时器,它主要完成周期性中断定时的。 STM32里面的定时器有很多其它功能,比如输入捕获、PWM输出等,但是I.MX6U的的EPIT定时器只是完成…

【五一创作】数据可视化之美 ( 三 ) - 动图展示 ( Python Matlab )

1 Introduction 在我们科研学习、工作生产中,将数据完美展现出来尤为重要。 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。 …

CSS布局之圣杯布局/双飞翼布局

📝个人主页:爱吃炫迈 💌系列专栏:HTMLCSS 🧑‍💻座右铭:道阻且长,行则将至💗 文章目录 圣杯布局HTML代码步骤CSS代码 双飞翼布局HTML代码步骤CSS代码 小结 圣杯布局 HTM…

Java --- springboot2的静态资源配置原理

目录 一、静态资源配置原理 1.1、配置类只有一个有参构造器 1.2、资源处理的默认规则 1.3、欢迎页的处理规则 一、静态资源配置原理 springboot启动默认加载xxxAutoConfiguration(自动配置) springmvc功能的自动配置类,生效 Configuration(proxyBeanMethods …

《编码——隐匿在计算机软硬件背后的语言》精炼——第13-14章(二进制减法器——1位存储器)

“成功不是最终的,失败不是致命的,勇气才是最关键的。” - 温斯顿丘吉尔 文章目录 如何实现减法计算机进行减法运算的逻辑借位的代替机制二进制下的替代机制 减法的电路实现 反馈与触发器电铃触发器R-S触发器 电平触发的D型触发器 如何实现减法 计算机进…

霍兰德人格分析雷达图

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

1992-2022年31省人均gdp/各省人均地区生产总值

1992-2022年31省人均gdp/各省人均地区生产总值 1、时间:1992-2022年 2、来源:国家统计J、各省NJ 3、范围:包括31省 4、缺失情况说明:无缺失 5、指标包括:各省人均GDP/省人均地区生产总值 6、指标解释&#xff1a…

五一劳动节前 特辑 ,路上那些车不能碰 你赔不起系列

相信明天大家4月29日都上了高速,都奔赴自己今年第一个想去的地方,那么上了高速,见的车辆就多了,哪些车辆我们要明白,尽量不要去碰,或者看见进行 技术性躲避,因为碰一下,半套房没了&a…

Vue3超详细的ref()用法,看这一篇就够了

ref()接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性 .value。 ref() 将传入参数的值包装为一个带 .value 属性的 ref 对象。 1、ref 对象是可更改的,即可以为 .value 赋予新的值 举例: c…