版本一: redis判斷是否有值,沒有加值
導致問題:1、加鎖不是個原子操作2、若加鎖後宕機,系統死鎖
版本二: redis加鎖原子性操作(setnx),鎖加過期時間
導致問題:1、若設定過期時間2s,程式執行3s,釋放了別人的鎖
版本三: redis加鎖上放乙個隨機值,然後判斷隨機值刪除鎖
導致問題:1、刪除是不是乙個原子操作,也會出現刪除別人的鎖的情況
版本四: redis刪除鎖通過lua指令碼實現(判斷相等在刪除)
遺留問題:以上問題都是針對單節點而言,實際生產都是redis集群,redis主從複製是非同步的.
資料庫主庫和從庫不一致,常見有這麼幾種優化方案:
(1)業務可以接受,系統不優化
(2)強制讀主,高可用主庫,用快取提高讀效能
(3)在cache裡記錄哪些記錄發生過寫請求,來路由讀主還是讀從
config config =
newconfig()
;config.
useclusterservers()
.addnodeaddress
("redis:").
addnodeaddress
("redis:").
addnodeaddress
("redis:").
addnodeaddress
("redis:").
addnodeaddress
("redis:").
addnodeaddress
("redis:");
redissonclient redisson = redisson.
create
(config)
;rlock lock = redisson.
getlock
("anylock");
lock.
lock()
;lock.
unlock()
;
就是這麼簡單,我們只需要通過它的api中的lock和unlock即可完成分布式鎖,他幫我們考慮了很多細節:
redisson所有指令都通過lua指令碼執行,redis支援lua指令碼原子性執行
redisson設定乙個key的預設過期時間為30s,如果某個客戶端持有乙個鎖超過了30s怎麼辦?
redisson中有乙個watchdog的概念,翻譯過來就是看門狗,它會在你獲取鎖之後,每隔10秒幫你把key的超時時間設為30s
這樣的話,就算一直持有鎖也不會出現key過期了,其他執行緒獲取到鎖的問題了。
redisson的「看門狗」邏輯保證了沒有死鎖發生。
(如果機器宕機了,看門狗也就沒了。此時就不會延長key的過期時間,到了30s之後就會自動過期了,其他執行緒可以獲取到鎖)
下面文章寫的不錯,在此記錄一下
Redis分布式鎖的實踐
首先說一下場景,不根據實際場景講的技術都是吹流弊,沒人反對吧,咳咳 醫院 需要盡量高效的顯示最新的資料,根據不同的科室設定不同的快取時間,因為科室的熱門程度也不一樣嘛,這裡本次只分享我學習的一些心得.思路 號源的快取是30分鐘,然後在第25的時候,如果還有患者訪問某個部門的號源,就開啟一條非同步執行...
Redis分布式鎖的正確思路及踩坑詳解
一.v1版本 setnx命令可以用於加鎖判斷,對於同乙個key,如果已存在,則未false,不存在則返回true,表示加鎖成功。那麼假設在併發場景下,同一時間假設30個請求打進來,會有29個return返回,只有1個會執行業務 這裡依靠的是redis的單執行緒模型,不論你的併發,在redis的單執行...
redis分布式鎖
redis分布式鎖 直接上 我寫了四個redis分布式鎖的方法,大家可以提個意見 第一種方法 redis分布式鎖 param timeout public void lock long timeout thread.sleep 100 catch exception e override publi...