HotFrameLearning(简称 HFL) Redis_12_redis分布式锁的3种实现方式

-

一、大致介绍

```

1、昨天介绍完redis的数据结构后,有小伙伴让本人讲讲redis的分布式锁,因此才有了此篇的由来,只是把我的节奏提前了而已;

2、接下来我就通过几种方式介绍一下分布式锁的使用;

```

二、源码分享

2.1 获取redis锁且快速失败

图1 - 获取redis锁且快速失败

```

1、图1中,我们首先区分的是单机模式还是集群模式;

2、通过简单的 set 操作,但是要注意一点,set 时需要设置 expiryTimeMills 超时时间,而且设置key与设置expiryTimeMills需要是在一条原子语句里面,如果不是的话则会引起不必要的死锁问题;

3、至于为什么会引起死锁,假设 set key 与 set expiryTimeMills 是两条代码语句,当 set key 成功后,程序立马宕机了,那么这个 key 就没有失效时间,相当于永久有效,那么下次再次竞争获取该 key 时就永远都是失败的,因此要特别注意key与expiryTimeMills需要在同一条原子语句里面被执行;

4、当时又有人说,尝试一次就失败了,岂不是太不让调用方省心了,调用方想尝试多次还得自己写个代码玩玩,因此就有了下面尝试多次获取锁的操作;

```

2.2 尝试数次获取锁,获取不到则返回失败

图2 - 尝试数次获取锁,获取不到则返回失败

```

1、图2中,同样我们首先区分的是单机模式还是集群模式;

2、通过在 tryLockFailFast 外面再套一层 while 循环处理,让入参多传入尝试次数retryTimes、尝试间隔时间retryIntervalMills 两个字段,即可满足多次尝试获取锁的诉求,这样调用方就能省心了;

3、虽然加锁是完事了,但是解锁呢,是不是直接删掉就完事了呢?请接着看~

```

2.3 释放redis锁且快速失败

图3 - 释放redis锁且快速失败

```

1、图3中,同样我们首先区分的是单机模式还是集群模式;

2、只是在解锁的时候,有点点不同,我们需要先看看我们解锁的key对应的内存值是不是我们当初加锁的那个入参值?

3、为什么要这么判断呢?原因就是假设A线程加锁了,但是A的任务还没有执行完,此时key超时过期了,然后B线程又成功抢到了该锁,但是当B前脚抢到锁后A后脚就执行完了任务准备释放锁,那么就会将B已经获取到的锁释放掉,这么一操作已不是把不该释放的释放了,最终都会导致相应业务功能执行出问题的;

4、因此才会在解锁的时候,看下锁对应的值是不是当初加锁的那个值,如果一致则删除,否则删除失败;

5、但是这么一连串的 get del 是两个命令语句,但是解锁的真实诉求需要保证原子性,因此我们就需要 redis 给我们提供的 lua 脚本原子性执行多个命令语句;

6、但是但是,说到这,又会有小伙伴会问,怕担心任务执行太久导致redis超时,有啥好的方式处理呢?接着看~

```

2.4 阻塞获取redisson锁

图4 - 阻塞获取redisson锁

```

1、图4中,用的redisson框架版本号为 redisson-3.11.2.jar,具体maven坐标大家去中央仓库看吧;

2、大家会想,这个redisson和之前的 tryUnLockFailFast 的加锁有啥区别呢?不也是执行加锁么?

3、答案当然不一样,redisson 底层会有一个续命线程,每到过期时间的的1/3时就自动重新将过期时间置为入参的过期时间值,所以即使业务线程的任务执行很久,也不会因为锁自动过期一事而烦恼,岂不快哉;

```

2.5 redisson知识扩展

图5 - redisson知识扩展

```

1、图5中,我们稍微多看一眼 redisson 框架,然后我们会发现底层提供了很多的锁操作;

2、然而稍微再认真的同学仔细看看,会发现我们 JUC 有的类,这里都差不多实现了一番,可见 redisson 为分布式做了很多封装,方便调用方尽情的使用;

```

欢迎关注+点赞,您的肯定是对我最大的支持!!!

为什么多个线程不可能同时抢到一把锁_HFL Redis_12_redis分布式锁的3种实现方式...相关推荐

  1. 为什么多个线程不可能同时抢到一把锁_分布式为什么一定要有高可用的分布式锁?看完就知道了...

    分布式锁定义 分布式锁在分布式环境下,锁定全局唯一公共资源,表现为: 请求串行化 互斥性 第一步是上锁的资源目标,是锁定全局唯一公共资源,只有是全局唯一的资源才存在多个线程或服务竞争的情况. 互斥性表 ...

  2. 为什么多个线程不可能同时抢到一把锁_并发基础理论:原子性问题、锁、管程...

    我们再回顾一下,原子性问题的根源是CPU切换线程执行指令所导致的,当前一个对共享变量的操作没有完成之前,CPU又切换到另外一个线程来操作对应的共享变量,那么最终产生的结果就可能出现问题. 比如如果现在 ...

  3. 深入浅出 超详细 从 线程锁 到 redis 实现分布式锁(篇节 1)

    在 使用 redis 实现分布式锁 之前 我们需要先了解以下几点 什么是分布式锁 要介绍 什么是分布式锁,那首先要提到 与之对应的 的两个锁:线程锁 和 进程锁 1.线程锁 主要 用来 给方法.代码块 ...

  4. reentrantlock非公平锁不会随机挂起线程?_【原创】Java并发编程系列16 | 公平锁与非公平锁...

    本文为何适原创并发编程系列第 16 篇,文末有本系列文章汇总. 上一篇提到重入锁 ReentrantLock 支持两种锁,公平锁与非公平锁.那么这篇文章就来介绍一下公平锁与非公平锁. 为什么需要公平锁 ...

  5. python-生产者消费者模型_线程_线程互斥锁_GIL全局解释器锁

    进程 1. 开启进程的两种方式 2. 进程对象其他属性和方法-pid: 进程id号 os.getpid()-ppid: 父进程id号 os.getppid() -is_alive(): 当前进程是否存 ...

  6. Java基础21 多线程线程两种实现方式 锁

    一.多线程的概念 1.程序 :一个固定逻辑与数据的集合 就称为程序 例如淘宝 贪吃蛇小游戏 2.CPU: 中央处理器 主要用于协调程序与硬件进行配置的工作 3.并发与并行 1.并发(高并发) 在同一个 ...

  7. 8-26-GLI锁与普通互斥锁、死锁问题、递归锁、信号量、Event事件、并发的tcp通信、进程池线程池

    昨日回顾1 生产者消费者-在生产者和消费者之间,通过队列,增加缓冲,避免了生产者和消费者之间交互-Queue,redis,rabbitmq,kafka-解耦合,队列是微服务的基础2 线程理论,开启-进 ...

  8. 线程同步机制synchronized中锁的判断以及锁的作用范围

    当我们使用多个线程访问同一资源(可以是同一个变量.同一个文件.同一条记录等)的时候,若多个线程只有读操作,那么不会发生线程安全问题,但是如果多个线程中对资源有读和写的操作,就容易出现线程安全问题. 要 ...

  9. 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)

    线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...

最新文章

  1. Future获取线程返回值能使线程顺序执行?
  2. python创建子进程_Python--- subprocess 创建子进程
  3. AlwaysOn 2016 新特性和提升
  4. 用户关系表 存储_如何解决oracle 19c中创建用户报错的故障
  5. android jni java调用c_Android与JNI(一) ---- Java调用C 静态调用
  6. PHP实现调用淘宝SDK开放接口返回天猫或淘宝商品详情
  7. Flask - 基础
  8. java程序设计专业介绍_简介Java编程中的Object类
  9. Android 多媒体框架stagefright
  10. 计算机字节与位的换算,计算机字节换算(计算机字节换算器)
  11. CA服务器开开发(一)---颁发证书,生成pfx证书安装文件
  12. 目标检测论文解读复现之十九:基于YOLOv5网络模型的人员口罩佩戴实时检测
  13. 汇率兑换——小象学院知识点
  14. 偏振器件传输矩阵matlab编程,关于传输矩阵法模拟光子晶体的MATLAB编程
  15. 使用echarts制作地图+散点图的实例
  16. 百度新闻向左 Google新闻向右【新媒体】
  17. 【调制识别】基于高阶累积量的调制方式识别算法matlab仿真,课题识别BPSK, QPSK, 16QAM, 64QAM
  18. qps,tps,TP50,TP90,TP99,TP999详解
  19. AAC音频格式解析(ADTS)
  20. 不要再这么傻,OK?

热门文章

  1. 从lambda表达式看final关键字
  2. 一篇搞懂mysql中的索引(大白话版)
  3. php开发电商项目的技术,[项目实战] php电商开发基本功课程 电商后台实战开发视频教程 共6章...
  4. 优酷html5视频网站,国内主要视频网站的嵌入方式
  5. rap2检测哪些接口在使用_Apifox for Mac(接口调试管理工具)
  6. python缺失值类型与分析_3.1.1 缺失值分析
  7. 计算差分方程的收敛点_数值计算(五十九)热传导方程组的差分数值求解
  8. JVM007_运行时栈帧结构
  9. spring源码分析第一天------源码分析知识储备
  10. 新闻资讯java开发_新闻资讯app开发的功能与意义