redis 的set命令
redis中文官方文档:http://www.redis.cn/commands/set.html
先了解一下命令set命令的NX(not exist)指令后续有用:NX(not exist)只有key不存在的时候再设置锁,并且它是原子性的
分布式锁演进-基本原理
举例:例如:我们同时去一个地方“占坑”,如果占到了,就执行业务逻辑,否则就必须等待,等到释放“坑位”才可以执行业务逻辑,可以去redis、可以去数据库、可以去任何大家都能访问的地方。
分布式锁演进-阶段一
阶段一代码实现:
问题:当代码执行期间,服务器宕机,没有执行删锁的的逻辑,那么就会导致死锁
解决:设置过期时间,请看阶段二
分布式锁演进-阶段二
代码实现:
问题:如果在设置过期时间时突然断电,依然会导致死锁的问题
解决:保证占锁和设置过期时间的原子性,利用EX命令来设置过期时间,请看阶段三
分布式锁演进-阶段三
利用EX命令来设置过期时间
代码实现:
问题:如果锁设置过期时间为10s但是业务执行花了11秒,这时我的锁已经过期了,再执行删锁操作时就会删掉别人的锁
解决:占锁时设置uuid,每个人匹配自己的锁才删除,请看阶段四
分布式锁演进-阶段四
代码实现:
问题:没有保证删锁的原子性
解决:官方对阶段四进行优化,采用lua脚本操作,请看阶段五-最终实现
分布式锁演进-阶段五-最终实现
官方说明:
Lua脚本:
if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end
采用Lua脚本优化,保证删除锁的原子性
多多指教,有什么问题请务必指出,互相学习,是务必哦