Redis分布式鎖使用及說明
Redis分布式鎖
如果追求高可用性(AP) 就采用redis
如果追求高一致性(CP) 就采用zookeeper
加鎖方式
set lockKey uniqueId NX PX expireTime
lockKey
可以根據(jù)業(yè)務(wù)自己定義(如訂單)uniqueId
是為了不解錯(cuò)鎖(uniqueId可以是session Id 或者線程Id等)
怎么會(huì)解錯(cuò)鎖?舉個(gè)小案例吧
- S1 獲得Lock,ttl時(shí)間5s,實(shí)際執(zhí)行了7s
- S2 獲得Lock,ttl時(shí)間5s,實(shí)際執(zhí)行了4s
如果沒有uniqueId S1在第7s的時(shí)候解鎖,或解了S2的鎖
NX
代表當(dāng)前不存在鎖的時(shí)候才能加鎖成功PX
毫秒過期時(shí)間,如果是秒就用ES
解鎖方式
通過lua腳本實(shí)現(xiàn)原子操作,先進(jìn)行uniqueId對(duì)比操作,如果相同,則執(zhí)行del解鎖操作
if redis.call("GET",KEYS[1]) == ARGV[1] then return redis.call("DEL",KEYS[1]) else return 0 end
續(xù)期
當(dāng)分布式鎖到達(dá)了超時(shí)時(shí)間,但是業(yè)務(wù)并沒有完成,則將對(duì)鎖進(jìn)行續(xù)期
S1 獲得Lock,ttl時(shí)間5s,實(shí)際執(zhí)行了7s,如果沒有續(xù)期那么S1后2秒就沒有鎖
續(xù)期的兩種方式:
- 開啟一個(gè)后臺(tái)守護(hù)線程,每隔3秒對(duì)key設(shè)置ttl時(shí)間5S進(jìn)行續(xù)期,當(dāng)主線程執(zhí)行完操作之后,對(duì)key進(jìn)行解鎖,那么守護(hù)進(jìn)行也隨之消亡
- 采用異步任務(wù),獲得鎖后,把所有鎖的線程放到一個(gè)Map里,然后每隔幾秒進(jìn)行輪詢,如果客戶端還持有鎖(即Map中還存在),就延長(zhǎng)ttl時(shí)間
RedLock算法對(duì)應(yīng)的場(chǎng)景 主節(jié)點(diǎn)掛掉后,lockkey還未同步到從節(jié)點(diǎn),導(dǎo)致從節(jié)點(diǎn)上沒有l(wèi)ockkey(發(fā)生概率很小,面試官喜歡在AP模型里解決CP模型的問題)
- 對(duì)3個(gè)完全獨(dú)立的redis主服務(wù)器一次獲得鎖(一般要基數(shù)個(gè),為了少數(shù)服從多數(shù))
- 如圖請(qǐng)求時(shí)間4000-1000=3s小于TTL時(shí)間5s,并且至少有半數(shù)(大于2個(gè))獲得鎖,才算真正獲得鎖
缺點(diǎn)(已廢棄,不常用,因此只學(xué)習(xí)算法思想)
- 復(fù)雜度高,需要設(shè)計(jì)一些算法去實(shí)現(xiàn)
- 不可靠,如果redis主服務(wù)器宕機(jī),會(huì)影響到鎖的使用(即少數(shù)服從多數(shù)會(huì)受影響)
- 性能瓶頸,需要訪問多個(gè)redis實(shí)例
- 另外最要命的是還需要求所有redis主服務(wù)器的系統(tǒng)時(shí)間一致性
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Redis分布式鎖的幾種實(shí)現(xiàn)方法
- 使用Redis實(shí)現(xiàn)分布式鎖的代碼演示
- Redis使用SETNX命令實(shí)現(xiàn)分布式鎖
- Redisson分布式鎖解鎖異常問題
- redis分布式鎖實(shí)現(xiàn)示例
- Redis 實(shí)現(xiàn)分布式鎖時(shí)需要考慮的問題解決方案
- Redis實(shí)現(xiàn)分布式鎖的示例代碼
- Redission實(shí)現(xiàn)分布式鎖lock()和tryLock()方法的區(qū)別小結(jié)
- 從原理到實(shí)踐分析?Redis?分布式鎖的多種實(shí)現(xiàn)方案
- Redis本地鎖和分布式鎖的區(qū)別小結(jié)
相關(guān)文章
Redis出現(xiàn)(error)NOAUTH?Authentication?required.報(bào)錯(cuò)的解決辦法(秒懂!)
這篇文章主要給大家介紹了關(guān)于Redis出現(xiàn)(error)NOAUTH?Authentication?required.報(bào)錯(cuò)的解決辦法,對(duì)于 這個(gè)錯(cuò)誤這通常是因?yàn)镽edis服務(wù)器需要密碼進(jìn)行身份驗(yàn)證,但客戶端沒有提供正確的身份驗(yàn)證信息導(dǎo)致的,需要的朋友可以參考下2024-03-03SpringSession通過Redis統(tǒng)計(jì)在線用戶數(shù)量的實(shí)現(xiàn)代碼
這篇文章主要介紹了SpringSession通過Redis統(tǒng)計(jì)在線用戶數(shù)量,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04Spring?Boot?整合Redis?實(shí)現(xiàn)優(yōu)惠卷秒殺?一人一單功能
這篇文章主要介紹了Spring?Boot?整合Redis?實(shí)現(xiàn)優(yōu)惠卷秒殺?一人一單,在分布式系統(tǒng)下,高并發(fā)的場(chǎng)景下,會(huì)出現(xiàn)此類庫(kù)存超賣問題,本篇文章介紹了采用樂觀鎖來解決,需要的朋友可以參考下2022-09-09在Redis集群中使用pipeline批量插入的實(shí)現(xiàn)方法
這篇文章主要介紹了在Redis集群中使用pipeline批量插入的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Redis自動(dòng)化安裝及集群實(shí)現(xiàn)搭建過程
這篇文章主要介紹了Redis自動(dòng)化安裝以及集群實(shí)現(xiàn)搭建過程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09