redis分布式鎖踩坑實踐

2021-09-29 08:35:35 字數 1401 閱讀 3196

版本一: 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...