系列文章目录
【redis】redis分布式锁(一)手写分布式锁1.0~6.0
【redis】redis分布式锁(二)可重入锁+设计模式
文章目录
- 系列文章目录
- 前言
- 一、CAP
- redis集群 AP
- ZooKeeper集群 CP 数据一致性
- Eureak集群 AP
- nacos集群 AP
- 二、lua脚本
- 脚本:`if redis.call('HEXISTS',KEYS[1],ARGV[1]) == 1 then return redis.call('expire',KEYS[1],ARGV[2]) else return 0 end`
- 三、融合进业务类
- 四、redis分布式锁的总结
- V1.0 和 V2.0 单机锁
- V3.0 和 V4.0 finally删除锁、自旋、过期时间、lua脚本保证原子化执行
- V5.0 和 V6.0 5.0删除锁时需要同时判断锁是否为自己的,6.0unlock用到lua脚本原子化执行。至此,小厂可以使用V6.0版本。
- V7.0 可重入锁 使用hset来替代原来的setnx、lua脚本、以及实现Lock接口的AQS规范、工厂模式的引入
- V8.0 自动续期 保证锁在业务类执行期间不会过期,自动续期
前言
一、CAP
redis集群 AP
在主节点set的值,但是在复制给从机过程中宕机了,这时候从机上位是不能获取这个值的
ZooKeeper集群 CP 数据一致性
CP:
故障:牺牲了高可用,即在一台master宕机后,选举新master时,zk服务不可用
Eureak集群 AP
AP:
nacos集群 AP
二、lua脚本
脚本:if redis.call('HEXISTS',KEYS[1],ARGV[1]) == 1 then return redis.call('expire',KEYS[1],ARGV[2]) else return 0 end
三、融合进业务类
在锁的代码
主线程代码
执行:
四、redis分布式锁的总结
V1.0 和 V2.0 单机锁
V3.0 和 V4.0 finally删除锁、自旋、过期时间、lua脚本保证原子化执行
V5.0 和 V6.0 5.0删除锁时需要同时判断锁是否为自己的,6.0unlock用到lua脚本原子化执行。至此,小厂可以使用V6.0版本。
V7.0 可重入锁 使用hset来替代原来的setnx、lua脚本、以及实现Lock接口的AQS规范、工厂模式的引入