為什么redis可以做分布式鎖

為什么redis可以做分布式鎖

redis為單進程單線程模式,采用隊列模式將并發訪問變成串行訪問,且多客戶端對Redis的連接并不存在競爭關系。

代碼實現的,主要是針對某一筆數據的流水號加鎖,防止多個線程寫入這個數據。(具有互斥性) ? (推薦學習:Redis視頻教程

現在最流行的redis分布式鎖就是Redisson了,來看看它的底層原理就了解redis是如何使用分布式鎖的了

為什么redis可以做分布式鎖原理分析

分布式鎖要解決的是分布式環境下,并行相同代碼的加鎖功能;了解過redis分布式鎖的人肯定知道,一開始redis作為分布式鎖用的是setnx,再這基礎上設置個定時過期時間,但這種方式有什么問題呢?

實際上看懂上圖的人也就明白了那有什么問題,首先是原子性問題,setnx+過期時間這兩個操作必須是原子性的,所以這可以用lua腳本解決

再然后是釋放鎖的時機該如何定?

不管我們定多少過期時間,都不能保證,在這段時間內鎖住的代碼執行完成了,所以這個時間定多少都不好;

如果不定時間,當執行完成后釋放鎖,問題就是如果執行到一半機器宕機,那這把鎖就永遠放不掉了

那Redisson是如何解決上述問題的呢?

它對代碼進行了精簡的封裝,我們的使用非常簡單,甚至我們不用主動設置過期時間

它設計了個watch dog看門狗,每隔10秒會檢查一下是否還持有鎖,若持有鎖,就給他更新過期時間30秒;通過這樣的設計,可以讓他在沒有釋放鎖之前一直持有鎖,哪怕宕機了,也能自動釋放鎖

而不能獲得鎖的客戶端則是不斷循環嘗試加鎖

通過記錄鎖的客戶端id,可以把它設計成可重入鎖

為什么redis可以做分布式鎖

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享