Redis实现分布式锁的官方文档介绍

Redis的官方文档对用Redis分布式锁的难点以及解决方案的考虑做了一些说明,具体内容参见:/docs/reference/patterns/distributed-locks/,译文参考:《Redis官方文档》用Redis构建分布式锁 | 并发编程网 – ifeve.com

场景一:

保存锁的Redis的master节点挂了。这里不是说有slave就没问题了,因为Redis的数据复制功能(replication)是异步的,存在这样的可能,线程1获取到锁了,该锁在从master复制到slave之前,master挂掉了,然后slave提升为了master,这个时候线程2从新的master节点上是可以获取到锁的,之前的锁丢失了,这样会导致安全问题。

场景二:

对于锁“lock123”(名字随便取的),线程一获取到锁,设置过期时间为30s,但是真正业务执行时间超过了30s,比如说40s。在32s的时候线程二尝试获取锁,并且成功了,因为这个锁的超时时间是30s,在32s的时候,该锁已经失效了。当40s的时候,线程一业务执行完毕,这个时候尝试去释放锁,即删除锁,很不幸,这个时候线程二锁持有的锁会被线程一误删掉,因为它们的key相同。

解决方案:

set操作的时候,设置一个random value作为该key的value,在解锁的时候,判断当前锁的value和该value是相同的,这样才可以执行删除操作,就可以解决上面场景中的误删问题了。但是其实并不完美,因为在第一个线程执行完任务之前,线程二不应该获取锁,但是该锁的过期时间比业务执行时间短,从而导致了线程二仍然获取到了锁。

Redisson的解决方案

在redis的文档中提到了一个算法,如果按照这个算法来实现分布式锁的话,可以解决之前提到的那些问题。

Redisson的实现在RedissonMultiLock中,核心算法在tryLock方法中:

这里管理了多个锁,为的就是解决某一个Redis节点上保存的锁因为该Redis节点出现问题而导致锁不可用的情况。for循环对每个锁进行尝试加锁操作,这里有两种情况:

①如果获取锁成功,那么就将当前锁添加到已获取锁的队列中去

②如果加锁失败,那么判断当前成功的锁的个数是否达标,如果达标,那么跳出循环。如果不达标,那么失败限制计数减一(因为上面再次循环成功的次数有可能加一,所以这里失败限制要减一)。然后检查是否已经超时,如果超时,说明在超时限定时间内没有获取到锁,即获取锁失败,这时释放所有已经成功加锁的所有锁。如果加锁成功的话,那么给所有已经加锁成功的锁设置超时时间。

Redisson(4)分布式锁之RedLock相关推荐

  1. 22-09-20 西安 谷粒商城(04)Redisson做分布式锁、布隆过滤器、AOP赋能、自定义注解做缓存管理、秒杀测试

    Redisson 1.Redisson做分布式锁  分布式锁主流的实现方案: 基于数据库实现分布式锁 基于缓存(Redis),性能最高 基于Zookeeper,可靠性最高 Redisson是一个在Re ...

  2. 基于后端开发Redisson实现分布式锁源码分析解读

    一.分布式锁的概念和使用场景 分布式锁是控制分布式系统之间同步访问共享资源的一种方式. 在分布式系统中,常常需要协调他们的动作.如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问 ...

  3. 整合redisson了解分布式锁的配置熟悉lock的看门狗机制以及应用

    java相对主流分布式锁 - redis的Redisson (Java implementation) the Redlock 设计 1.引入依赖 <!-- https://mvnreposit ...

  4. redisson的锁的类型_绝对干货:利用redisson完成分布式锁功能

    在单体架构中,我们使用synchronize或者Lock就能完成上锁同步的操作,但是这些在分布式,微服务的今天,失去了作用. 分布式锁的实现一般有三种解决方案:基于数据库表实现 基于缓存实现,比如re ...

  5. 基于Redis的分布式锁和Redlock算法

    来自:后端技术指南针 1 前言 今天开始来和大家一起学习一下Redis实际应用篇,会写几个Redis的常见应用. 在我看来Redis最为典型的应用就是作为分布式缓存系统,其他的一些应用本质上并不是杀手 ...

  6. java设计前期工作基础和存在的困难_Java秒杀系统实战系列-基于Redisson的分布式锁优化秒杀逻辑...

    本文是"Java秒杀系统实战系列文章"的第十五篇,本文我们将借助综合中间件Redisson优化"秒杀系统中秒杀的核心业务逻辑",解决Redis的原子操作在优化秒 ...

  7. 聊聊redisson的分布式锁

    序 本文主要研究一下redisson的分布式锁 maven <dependency><groupId>org.redisson</groupId><artif ...

  8. Redisson实现分布式锁原理

    Redisson实现分布式锁原理 一.高效分布式锁 当我们在设计分布式锁的时候,我们应该考虑分布式锁至少要满足的一些条件,同时考虑如何高效的设计分布式锁,这里我认为以下几点是必须要考虑的. 1.互斥 ...

  9. Java秒杀系统实战系列~基于Redisson的分布式锁优化秒杀逻辑

    摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十五篇,本文我们将借助综合中间件Redisson优化"秒杀系统中秒杀的核心业务逻辑",解决Redis的原子 ...

  10. Redisson实现分布式锁(3)—项目落地实现

    Redisson实现分布式锁(3)-项目落地实现 有关Redisson实现分布式锁前面写了两篇博客作为该项目落地的铺垫. 1.Redisson实现分布式锁(1)-原理 2.Redisson实现分布式锁 ...

最新文章

  1. [USACO5.3]校园网Network of Schools
  2. 互联网1分钟 | 1015
  3. Spark Streaming实时流处理学习
  4. (HDU4324)判断一个图中是否存在两点的出度相同
  5. css 外弧_css 伪类实现弧形
  6. Ubuntu下安装opencv3.4.6+opencv_contrib
  7. 两周从爬虫小白变大神,看完你就知道我不是标题党了【五万字教程,建议收藏】
  8. 虚短”“虚断”两板斧,搞定运算放大器 11张大图详(转)
  9. python编写一个函数把华氏温度转换成摄氏温度_编写一个函数把华氏温度转换成摄氏温度,温度转换公式为:c=(f-32)*5/9。在主函数中输入华氏温度值......
  10. Java swing的主题风格设置
  11. kmplayer 修改快捷键——以倍速播放为例
  12. ベルベット / 贝姐
  13. 【Linux】awk文本替换
  14. 10G DWDM SFP+ Tunable可调光模块与常规DWDM光模块的区别
  15. AndroidStudio单元测试——instrumentation
  16. c++: Logger日志信息
  17. 微信小程序中裁剪图片以及压缩到指定尺寸并上传
  18. 使用命令行激活window10 亲测有效【不要修改命令】
  19. VRTK4开发VR2:射线
  20. Grakn Forces 2020 D E F

热门文章

  1. 10个常见的Android 新手误区
  2. 积极适应大数据时代要求 提升科技化和智能化水平
  3. 【Java进阶营】阿里架构师加持,十分钟入门RocketMQ,就是这么简单
  4. 乐高机器人走进图书馆活动方案_欢迎参加“乐高机器人创意搭建赛”活动
  5. WIN7 64位 安装ANACONDA3 报错:FAILED TO CREATE MENUS
  6. 《12个工作的基本》读书分享
  7. python打开word并插入图片_Python操作word文档插入图片和表格的实例演示
  8. 使用OpenCV合成训练图片,同时生成labelme兼容格式的标注文件
  9. android实现地图功能实现,Android快速实现地图功能(不仅快!而且小!)
  10. 微信公众号创建菜单报错40016