您好,登錄后才能下訂單哦!
這篇文章主要介紹了怎么使用Redis鎖定資源的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇怎么使用Redis鎖定資源文章都會有所收獲,下面我們一起來看看吧。
在這個技術不斷更新迭代的情況下,分布式這個概念,在企業中的權重越來越高!談及分布式時,不可避免一定會提到分布式鎖,現階段分布式鎖的實現方式主流的有三種實現方式, Zookeeper
、DB
、Redis
,我們本篇文章以Redis為例!
從我們的角度來看,這三個屬性是有效使用分布式鎖所需的最低保證。
我們使用Redis鎖定資源的最簡單方法是:
乍一看,似乎并沒有什么問題。但是不妨我們深究一下,這種實現方案在redis單機環境下似乎并沒有什么問題!但是如果節點宕了呢?好吧,那么讓我們添加一個slave
節點!如果主服務器宕機了,就使用這個節點!但是我們不妨來看看她真的能保證可用嗎?
在談論這個的致命缺陷時,我們需要了解一個知識點,Redis復制是異步的。
slave
晉升為
master
。顯然,這樣是不對的,主節點因為沒來得及同步數據就宕機了,所以從節點沒有該數據,從而造成分布式鎖的失效,那么作者antirez
的觀點是如何解決這個呢?
作者認為,我們應該使用多個Redis
,這些節點是完全獨立的,不需要使用復制或者任何協調數據的系統,多個redis系統獲取鎖的過程就變成了如下步驟:
設置的有效時間-獲取鎖花費的時間
Martin Kleppmann發表文章任務,Redlock并不能保證該鎖的安全性!
他認為鎖的用途無非兩種
提升效率,用鎖來保證一個任務沒有必要被執行兩次。比如(很昂貴的計算) 保證正確,使用鎖來保證任務按照正常的步驟執行,防止兩個節點同時操作一份數據,造成文件沖突,數據丟失。
對于第一種原因,我們對鎖是有一定寬容度的,就算發生了兩個節點同時工作,對系統的影響也僅僅是多付出了一些計算的成本,沒什么額外的影響。這個時候 使用單點的 Redis 就能很好的解決問題,沒有必要使用RedLock,維護那么多的Redis實例,提升系統的維護成本。
但是對于第二種場景來說,就比較慎重了,因為很可能涉及到一些金錢交易,如果鎖定失敗,并且兩個節點同時處理同一數據,則結果將導致文件損壞,數據丟失,永久性不一致,或者金錢方面的損失!
我們假設一種場景,我們有兩個客戶端,每一個客戶端必須拿到鎖之后才能去保存數據到數據庫,我們使用RedLock算法實現會出現什么問題呢?RedLock中,為了防止死鎖,鎖是具有過期時間的,但是Martin
認為這是不安全的!該流程圖類似于這樣!
客戶端1獲取到鎖成功后,開始執行,執行到一半系統發生Full GC ,系統服務被掛起,過段時間鎖超時了。
客戶端2等待客戶端1的鎖超時后,成功的獲取到鎖,開始執行入庫操作,完成后,客戶端1完成了Full GC,又做了一次入庫操作!這是不安全的!如何解決呢?
Martin
提出來一種類似樂觀鎖的實現機制,示例圖如下:
客戶端1長時間被掛起后,客戶端2獲取到鎖,開始寫庫操作,同時攜帶令牌 34
,寫庫完成后,客戶端1蘇醒,開始進行入庫操作,但是因為攜帶的令牌為33 小于最新令牌,該次提交就被拒絕!
這個想法聽起來似乎時很完備的思路,這樣即使系統因為某些原因被掛起,數據也能夠被正確的處理。但是仔細想一下:
回想一下Redlock算法
獲取鎖的幾個步驟,你會發現鎖的有效性是與當前的系統時鐘強依賴,我們假設:
我們有,A B C D E 五個redis節點:
如果C在將鎖持久保存到磁盤之前崩潰并立即重新啟動,則可能會發生類似的問題。
Martin認為系統時間的階躍主要來自兩個方面(以及作者給出的解決方案):
我們回顧 1 觀點,深究抽象出現這個缺陷的根本原因,就是為了解決由于系統宕機帶來的鎖失效而給鎖強加了一個失效時間,異常情況下,程序(業務)執行的時間大于鎖失效時間從而造成的一系列的問題,我們能否從這方面去考慮,從而用程序來解決這個樣一個死局 呢?
既然是因為鎖的失效時間小于業務時間,那么我們想辦法保證業務程序執行時間絕對小于鎖超時時間不久解決了?
java語言中redisson
實現了一種保證鎖失效時間絕對大于業務程序執行時間的機制。官方叫做看門狗機制(Watchdog),他的主要原理是,在程序成功獲取鎖之后,會fork一條子線程去不斷的給該鎖續期,直至該鎖釋放為止!他的原理圖大概如下所示:
redisson使用守護線程來進行鎖的續期,(守護線程的作用:當主線程銷毀,會和主線程一起銷毀。)防止程序宕機后,線程依舊不斷續命,造成死鎖!
另外,Redisson還實現并且優化了 RedLock算法、公平鎖、可重入鎖、連鎖等操作,使Redis分布式鎖的實現方式更加簡便高效!
關于“怎么使用Redis鎖定資源”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“怎么使用Redis鎖定資源”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。