首页 > 数据库 >记录一次redis分布式锁的坑

记录一次redis分布式锁的坑

时间:2022-10-29 23:13:46浏览次数:45  
标签:60s 记录 lock redis sync 线程 key 分布式

redis分布式锁的实现方式是:

lock(){
    sync(this){
//无法获取自旋 setnx(key,UUID) setex(60s) return UUID } } unlock(key,value){ sync(this){ if(get(key) == UUID){ del(key) } } }

备注:由于redisTemplate版本问题,没有setnxex的原子操作,而且unlock也有两步操作,为了保证单机原子性,加上了sync对象锁,并且lock和unlock锁同一个对象。

看山去一切都很美,但是运行起来发现问题了:并发量一上来,分布式锁并不会正常解锁,而是每次都要等60s自动过期后才能解锁。。。。

仔细分析了下问题原因:

线程A先进入lock方法,获取sync对象锁,获取到分布式锁,释放sync对象锁

线程A执行业务代码

线程B进入lock方法,获取sync对象锁,但无法获取分布式锁,自旋等待

线程A进入unlock方法,尝试获取sync对象锁,但此时sync对象锁被线程B占用,需要等待线程B释放sync对象锁

这时线程A B有死锁,需要等待其中一个锁自动解锁,就是分布式锁的60s,这就解释了为什么每次都要等60s!!!!

而且这种方法还只能在单机保证线程安全,想要实现一个优秀的分布式锁,还必须要满足分布式原子性!

标签:60s,记录,lock,redis,sync,线程,key,分布式
From: https://www.cnblogs.com/zxporz/p/16840155.html

相关文章

  • Redis无法在Arm平台启动的问题
    这是继前文在Arm平台部署遇到的另一个问题,拉取Arm平台下的各服务镜像后,启动时却发现redis无法启动,进行了诊断后发现错误提示如下:redis|1:M28Oct202204:02:33.981#......
  • 【分布式技术专题】「架构实践于案例分析」总结和盘点目前常用分布式技术特别及问题分
    分布式架构互联⽹架构演进单体应⽤架构定义⼀个归档包(例如war格式)包含所有功能的应⽤程序,我们通常称为单体应⽤。⽽架构单体应⽤的⽅法论,就是单体应⽤架构。架构示意图优缺......
  • 国产Ether CAT分布式IO BL200EC与TwinCAT 3通讯示例
    钡铼技术BL200EC耦合器支持标准EtherCAT总线协议的分布式IO,耦合器支持最大输入1024字节,最大输出1024字节,支持的扩展IO模块数量为32个。是由钡铼技术自主要发生产的国产Ether......
  • 个人算法学习记录
    个人算法学习记录暑假准备夏令营的时候学习了一些算法,并作了记录。想法是学完所有内容,然后记录下来,然而想法是美好的,实际上只学到了动态规划那一章,并且只记录了最简单的几......
  • 安装Redis并在springboot项目中使用redis
    一、下载redis1.1官网下载 1.2将其添加到服务上,并使其开机自启动 二、下载redis可视化工具(下不下都行) 三、将redis集成到我们的springboot项目中3.1首先是引......
  • 【实战】Hadoop安装01-伪分布式-Pseudo
    Hadoop安装-伪分布式-Pseudo〇、所需资料一、前置环境安装1、包含内容(1)安装虚拟机安装、系统安装(2)配置ip、host、主机名配置关闭防火墙及selinuxSSH免密登录(2)基......
  • 使用python 接入LDAP验证系统实践记录
    LDAP简介LDAP(LightDirectoryAccessPortocol)是轻量目录访问协议,基于X.500标准,支持TCP/IP。LDAP基本概念LDAP的目的是为各种软件提供统一标准的认证机制,所有软件就可......
  • 分布式文件系统HDFS
      ......
  • 分布式锁中-基于Zookeeper的实现是怎样
    Zookeeper(后续简称ZK)是一个分布式的,开放源码的分布式应用程序协调服务,通常以集群模式运转,其协调能力可以理解为是基于观察者设计模式来实现的;ZK服务会使用Znode存储使用者的......
  • redis批量删除key
    1、删除所有的key,可以使用redis自身的命令:flushdb删除当前数据库中的所有Keyflushall删除所有数据库中的key#会删除集群中所有节点的key2、使用linux中的xargs来删除所有......