笔记来源: Java工程师面试突击专栏 https://apppukyptrl1086.pc.xiaoe-tech.com/detail/p_5d3114935b4d7_CEcL8yMS/6
- Redis分布式锁 上锁
- Redis分布式锁 释放锁
- 单机Redis与主从架构实现分布式锁的缺点
Redis 实现分布式锁, 官方叫做RedLock .
Redis 实现分布式锁命令: SET my:lock 随机值 NX PX 30000
my:lock 为key value 为随机值.
NX 的含义
- 如果此时Redis中没有要设置的key , 那么返回ok
- 如果存在了key , 那么设置该key失败, 返回nil.
PX的含义 后面的数字为时间,单位为毫秒, PX 30000 代表过了30秒后, key自动过期 , 自动被删除.
其他的线程, 如果没有抢到这把锁(即Redis返回的是nil), 那么会每隔一段时间, 例如1s去尝试获取这把锁.
Redis分布式锁 释放锁释放锁, 删除key , 一般可以用lua脚本去删除, 需要判断value一样才删除.
例如如下的lua脚本 , 判断值, 如果一致, 则执行删除.
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
这段lua脚本作用是把key的value 与 传递过去的value 进行比较, 如果一致, 才会进行删除, 如果不一致就不会进行删除.
需要判断value 一致才进行删除的原因: 在上锁的时候, 会在PX 参数后设置一个值, 代表该key过期时间, 假如说某个线程A执行上锁的时间超过了PX 设置的时间值, 这个时候redis 已经把这个key删除了, 另外一个线程B就会获取了锁, 但过了一会后, 线程A执行完业务代码了, 在最后要去删除key ,假如不判断value,直接删除, 则会把线程B的锁给删除. 后果就是把别人的锁给删除了.
如果加上要比较value的逻辑, 那么在线程A 执行完逻辑后, 要删除key ,但发现此时通过key获取的value不是比较的值, 那么就不能删除.
单机Redis与主从架构实现分布式锁的缺点- 只有单机Redis, 如果此Redis挂了, 那么整个分布式锁的协调也就失效了.
- 如果是主从架构, 由于master和slave 节点数据复制是异步, 如果主节点的redis 挂了, 还没有来得及同步给从节点, 那么此时也会导致分布式锁的协调失效