基于Redis的分布式锁

时间:2019-06-16 10:55:48   收藏:0   阅读:132

Redis分布式锁

1、锁场景

任务通过竞争获取锁才能才能对该资源进行操作(竞争锁)

当有一个任务对资源进行操作时(占有锁)

其他任务不能对该资源进行操作(任务阻塞)

直到该任务操作结束(释放锁)

竞争锁 -> 占有锁 -> 任务阻塞 -> 释放锁

graph LR
A(竞争锁) -->B(占有锁) 
B(占有锁) --> C[任务阻塞] 
C[任务阻塞] --> D[释放锁]

2、实现思路

加锁:

通过setnx向特定的key写入一个随机值,并设置失效时间,写值成功即加锁成功

1、必须给锁设置失效时间:避免死锁

2、加锁时,每个节点产生一个随机字符串:避免误删锁

3、写入随机值与设置失效时间同一命令:保证原子性

解锁:

匹配随机值,删除redis上特定的key数据,保证获取数据,判断一致性,以及删除数据也是原子性

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

3、代码实现

1、RedisTemplate实现

基于RedisTemplate简单封装的RedisHelper,这不是重点

2、Redisson实现

自动续约,不用自己开线程检查

3、封装功能

原文:https://www.cnblogs.com/zuier/p/11029424.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!