細(xì)說(shuō)Redis分布式鎖
Setnx
Redlock
Redisson

SET?key?value?[EX?seconds|PX?milliseconds]?[NX|XX]?[KEEPTTL]




String?uuid?=?xxxx;
//?偽代碼,具體實(shí)現(xiàn)看項(xiàng)目中用的連接工具
//?有的提供的方法名為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分別是以集合方式傳入的參數(shù),對(duì)應(yīng)上文的Test和uuid。
--?如果對(duì)應(yīng)的value等于傳入的uuid。
if?redis.call('get',?KEYS[1])?==?ARGV[1]?
????then?
?--?執(zhí)行刪除操作
????????return?redis.call('del',?KEYS[1])?
????else?
?--?不成功,返回0
????????return?0?
end
1.?setnx?Test?uuid
2.?expire?Test?30







順序向五個(gè)節(jié)點(diǎn)請(qǐng)求加鎖
根據(jù)一定的超時(shí)時(shí)間來(lái)推斷是不是跳過(guò)該節(jié)點(diǎn)
三個(gè)節(jié)點(diǎn)加鎖成功并且花費(fèi)時(shí)間小于鎖的有效期
認(rèn)定加鎖成功

Martin Kleppmann的質(zhì)疑貼: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
評(píng)論
圖片
表情
