Redis 分布式锁实现原理
官方叫做RedLock算法,是redis官方支持的分布式锁算法。
这个分布式锁有3个重要的考量点,互斥(只能有一个客户端获取锁),不能死锁,容错(大部分redis节点或者这个锁就可以加可以释放)
第一个最普通的实现方式,如果就是在redis里创建一个key算加锁
SET my:lock 随机值 NX PX 30000,这个命令就ok,这个的NX的意思就是只有key不存在的时候才会设置成功,PX 30000的意思是30秒后锁自动释放。别人创建的时候如果发现已经有了就不能加锁了。
释放锁就是删除key,但是一般可以用lua脚本删除,判断value一样才删除:
关于redis如何执行lua脚本,自行百度
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
elsereturn 0
end
为啥要用随机值呢?因为如果某个客户端获取到了锁,但是阻塞了很长时间才执行完,此时可能已经自动释放锁了,此时可能别的客户端已经获取到了这个锁,要是你这个时候直接删除key的话会有问题,所以得用随机值加上面的lua脚本来释放锁。
但是这样是肯定不行的。因为如果是普通的redis单实例,那就是单点故障。或者是redis普通主从,那redis主从异步复制,如果主节点挂了,key还没同步到从节点,此时从节点切换为主节点,别人就会拿到锁。
第二个问题,RedLock算法
这个场景是假设有一个redis cluster,有5个redis master实例。然后执行如下步骤获取一把锁:
1)获取当前时间戳,单位是毫秒
2)跟上面类似,轮流尝试在每个master节点上创建锁,过期时间较短,一般就几十毫秒
3)尝试在大多数节点上建立一个锁,比如5个节点就要求是3个节点(n / 2 +1)
4)客户端计算建立好锁的时间,如果建立锁的时间小于超时时间,就算建立成功了
5)要是锁建立失败了,那么就依次删除这个锁
6)只要别人建立了一把分布式锁,你就得不断轮询去尝试获取锁
Redis 分布式锁实现原理相关推荐
- Redis分布式锁的原理以及如何续期
面试问题 Redis锁的过期时间小于业务的执行时间该如何续期? 问题分析 首先如果你之前用Redis的分布式锁的姿势正确,并且看过相应的官方文档的话,这个问题So easy.我们来看 很多同学在用分布 ...
- redis分布式锁实现原理_redis分布式锁实现分析与实践
前言: 在分布式环境中, 我们有些情况下需要使用到锁进行并发控制, 可供基于的 redis, zookeeper,mysql类数据库 基于数据库类的实现是乐观锁, 基于redis,zookeeper的 ...
- 面试必需要明白的 Redis 分布式锁实现原理!
点击蓝色"架构文摘"关注我哟 加个"星标",每天上午 09:25,干货推送! 作者 | Vt 来源 | juejin.im/post/5e61a454e51d4 ...
- Redis分布式锁实现原理
一.使用 1.pom.xml导入依赖 <dependency><groupId>org.springframework.boot</groupId><arti ...
- Redis分布式锁的原理、作用及实现(简单易懂)
转载地址:https://blog.csdn.net/d1562901685/article/details/54881862: setnx+getset方式 加锁:setnx(lock, 时间戳+ ...
- 17、Redis、Zk分布式锁实现原理
我们在编程有很多场景使用本地锁和分布式锁,但是是否考虑这些锁的原理是什么?本篇讨论下实现分布式锁的常见办法及他们实现原理. 一.使用锁的原则 使用本地锁和分布式锁是为了解决并发导致脏数据的场景,使用锁 ...
- 分布式锁 哨兵模式_手撕redis分布式锁,隔壁张小帅都看懂了!
前言 上一篇老猫和小伙伴们分享了为什么要使用分布式锁以及分布式锁的实现思路原理,目前我们主要采用第三方的组件作为分布式锁的工具.上一篇运用了Mysql中的select -for update实现了分布 ...
- Redis分布式锁如何提高可用性
在编程中我们时常考虑高并发带来的数据访问不安全问题,那么我们在redis中是否也要考虑呢?答案是肯定的,有人会问:redis不是单线程的吗?对它是单线程,但是在某些情况他会出现信息更新,用户没有拿到最 ...
- 面试必问:如何实现Redis分布式锁
摘要:今天我们来聊聊分布式锁这块知识,具体的来看看Redis分布式锁的实现原理. 一.写在前面 现在面试,一般都会聊聊分布式系统这块的东西.通常面试官都会从服务框架(Spring Cloud.Dubb ...
最新文章
- Linux下scp无密码上传 下载 文件 目录的方法
- 公司的API接口被刷了,那是因为你没这样做!
- Cisco Packet Tracer7.0的安装汉化与使用
- General texture mapping resources
- linux 企业数据,Linux企业数据标准出炉 IBM惠普等数巨头加盟
- 如何使用Maven scope
- Java创建一个学生类
- [Cracking the Coding Interview] 4.1 Route Between Nodes 节点间的路径
- 监控视频异常检测数据集整理
- ruby 调用java_利用RJB在Ruby on Rails中使用Java代码的教程
- 重复代码检查工具Simian
- 测试之串口连接及调试
- 计算机信息系统的运行安全包括什么,计算机信息系统安全主要包括什么
- Unity学习笔记:Tilemap的基础使用【By Chutianbo】
- ClickOnce 通过URL传递参数
- Roberts边缘检测算子
- move_base导航框架中recovery_behaviors
- 钱宝订单查询 chaqb.com
- 如何从八字中看“从医”之人
- JavaScript id_JavaScript实现五子棋小游戏_javascript技巧