玖叶教程网

前端编程开发入门

Redis学习-分布式锁,分五个阶段详细讲解

redis 的set命令

redis中文官方文档http://www.redis.cn/commands/set.html

先了解一下命令set命令的NX(not exist)指令后续有用:NX(not exist)只有key不存在的时候再设置锁,并且它是原子性的

set命令

分布式锁演进-基本原理

举例:例如:我们同时去一个地方“占坑”,如果占到了,就执行业务逻辑,否则就必须等待,等到释放“坑位”才可以执行业务逻辑,可以去redis、可以去数据库、可以去任何大家都能访问的地方。

基本原理

分布式锁演进-阶段一

阶段一

阶段一代码实现:

阶段一实现

问题:当代码执行期间,服务器宕机,没有执行删锁的的逻辑,那么就会导致死锁

解决:设置过期时间,请看阶段二

分布式锁演进-阶段二

代码实现:

阶段二实现

问题:如果在设置过期时间时突然断电,依然会导致死锁的问题

解决:保证占锁和设置过期时间的原子性,利用EX命令来设置过期时间,请看阶段三

分布式锁演进-阶段三

阶段三

利用EX命令来设置过期时间

代码实现:

问题:如果锁设置过期时间为10s但是业务执行花了11秒,这时我的锁已经过期了,再执行删锁操作时就会删掉别人的锁

解决:占锁时设置uuid,每个人匹配自己的锁才删除,请看阶段四

分布式锁演进-阶段四

阶段四

代码实现:

uuid保证不删除错锁

问题:没有保证删锁的原子性

解决:官方对阶段四进行优化,采用lua脚本操作,请看阶段五-最终实现

分布式锁演进-阶段五-最终实现

最终形态

官方说明:

Lua脚本:

if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end

采用Lua脚本优化,保证删除锁的原子性

多多指教,有什么问题请务必指出,互相学习,是务必哦

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言