實現方式
具備條件
確保鎖可用,必須要滿足一下幾個條件:
1、互斥性,任意時刻只有乙個使用者能持有鎖
2、不會產生死鎖,假設某個使用者在持有鎖的期間由於服務崩潰或者其他原因沒有主動釋放鎖,也能保證後續其他使用者可以加鎖
3、加鎖和解鎖必須是同一使用者,b使用者無法解除a使用者加的鎖
**實現
1、引入jedis組建依賴
2、加鎖
這裡使用key作為鎖,value作為加鎖的人的標識,用於後續的解鎖。
(jedis的set方法中關於 nx | xx 的區別,nx是值不存在的時候才會把值成功設定進去,xx是只有值存在的時候才會把值成功設定進去)
錯誤的示範加鎖情況一:
這裡加鎖和設定過期時間採用兩條命令,不具備原子性,如果中途發生故障,會產生死鎖。
錯誤的示範加鎖情況二:
這種寫法:第一比較麻煩;第二需要分布式部署的幾台伺服器的時間必須同步;第三無法保證解鎖的是否和加鎖的是同乙個使用者
3、解鎖
這裡使用 eval() 方法執行lua指令碼,首先獲取鎖對應的value值,檢查是否與requestid相等,如果相等則刪除鎖(解鎖)。
因為確保操作需要原子性,並且保證加鎖和解鎖的人是同乙個,使用lua指令碼可以很方便的確保這兩點。
解鎖錯誤示範一:
問題:沒***加鎖人和解鎖人是同乙個
解鎖錯誤示範二:
問題:多執行緒環境中,在獲取鎖之後,鎖可能由於時間過期,自動釋放,然後這個時候其他執行緒加了鎖,就會導致鎖的歸屬人發生了變化,這時候解的鎖就是別人的鎖。
基於Redis實現分布式鎖
分布式鎖的基本功能 1.同一時刻只能存在乙個鎖 2.需要解決意外死鎖問題,也就是鎖能超時自動釋放 3.支援主動釋放鎖 分布式鎖解決什麼問題 多程序併發執行任務時,需要保證任務的有序性或者唯一性 準備 redis版本 2.6 redis是主從 sentinel模式 為了高可用 原理 redis2.6之...
基於Redis實現分布式鎖
之前專案中使用redis鎖實現秒殺等一些併發業務,在這裡整理一下基於redis實現分布式鎖的簡單入門例項,記錄一下,便於以後檢視 學習。springboot整合redisson分布式鎖 1 簡介 在分布式系統中存在併發場景,為了解決這一問題,基於redis鎖一定程度可以解決這一問題,但是也有缺點,如...
基於redis實現分布式鎖
四個同時都去切換表 1 的操作是不可以的,他們要先從 redis 獲取一把鎖,沒有獲取到鎖的就直接退出,等待下一次定時任務的排程。拿到了鎖的就去執行切換當前分表的操作 獲取鎖 和 釋放鎖 的關鍵 如下所示 set the string value as value of the key.the st...