Redis 如何實現分布式鎖

2021-09-20 13:17:34 字數 1069 閱讀 4107

分布式鎖需要解決的問題

1、互斥性

2、安全性

3、死鎖

4、容錯

setnx key value : 如果key不存在,則建立並賦值

時間複雜度o(1) 

返回值: 設定成功 ,返回1 ,設定失敗返回 0

get locknx 

(nil) 空值 不存在的

setnx locknx test 

返回 1 

如果再賦值一次  setnx locknx test123

返回 0 

以此有設想,我們可以通過**層面,去設定這個key的值,如果設定成功,代表該資源沒有被別的程式所占用,如果設定失敗,則證明有別的程式,或者執行緒占用該資源

如何解決setnx 長期有效問題 

expire key seconds 

為給定key設定生存時間,當key過期時(生存時間為0) 會被自動刪除

expire locknx 2 (2代表2秒)

缺點:缺少原子性

從redis 2.6.12 開始 就可以保證原子性

set key value [ex seconds] [px milliseconds] [nx | xx]

ex second : 設定鍵的過期時間為seconds秒

px millisecond : 設定鍵的過期時間為millisconds 毫秒

nx :只在鍵不存在時,才對鍵進行設定操作

xx : 只在鍵存在時,才對鍵進行設定操作

set 操作完成時,返回ok ,否則返回 nil 

例如:set locktarget 12345 ex 10 nx 

大量key同時過期的注意事項

集中過期,由於清除大量的key很耗時,會出現短暫的卡頓現象。

解放方案:在設定key的過期時間的時候,給每個key加上隨機值

Redis如何實現分布式鎖

一 redis分布式鎖實現思路redis實現分布式鎖基於setnx命令,因為在redis中key是保證是唯一的。所以當多個執行緒同時建立setnx時,只要誰能夠建立成功誰就能獲取到鎖。set命令 每次set時,可以修改原來舊值 setnx命令 每次setnx檢查key是否已經存在,如果已經存在的話就...

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...

如何通過Redis實現分布式鎖

互斥性,安全性,死鎖,容錯 時間複雜度 o 1 返回值 設定成功,返回1 設定失敗,返回0。expire key seconds 設定key的生存時間,當key過期時 生存時間為0 會自動刪除 缺點 原子性得不到滿足 set key value ex secounds px milliseconds...