细说Redis分布式锁
Setnx
Redlock
Redisson
SET key value [EX seconds|PX milliseconds] [NX|XX] [KEEPTTL]
String uuid = xxxx;
// 伪代码,具体实现看项目中用的连接工具
// 有的提供的方法名为set,有的叫setIfAbsent
set Test uuid NX PX 3000
try{
// biz handle....
} finally {
// unlock
if(uuid.equals(redisTool.get('Test')){
redisTool.del('Test');
}
}
-- Lua删除锁:
-- KEYS和ARGV分别是以集合方式传入的参数,对应上文的Test和uuid。
-- 如果对应的value等于传入的uuid。
if redis.call('get', KEYS[1]) == ARGV[1]
then
-- 执行删除操作
return redis.call('del', KEYS[1])
else
-- 不成功,返回0
return 0
end
1. setnx Test uuid
2. expire Test 30
顺序向五个节点请求加锁
根据一定的超时时间来推断是不是跳过该节点
三个节点加锁成功并且花费时间小于锁的有效期
认定加锁成功
Martin Kleppmann的质疑贴:http://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html
Antirez的反击贴:http://antirez.com/news/101
https://redis.io/commands/set
https://github.com/redisson/redisson/wiki/Table-of-Content
https://redis.io/topics/distlock
评论