redis為單進程單線程模式,采用隊列模式將并發訪問變成串行訪問,且多客戶端對Redis的連接并不存在競爭關系。
代碼實現的,主要是針對某一筆數據的流水號加鎖,防止多個線程寫入這個數據。(具有互斥性) ? (推薦學習:Redis視頻教程)
現在最流行的redis分布式鎖就是Redisson了,來看看它的底層原理就了解redis是如何使用分布式鎖的了
原理分析
分布式鎖要解決的是分布式環境下,并行相同代碼的加鎖功能;了解過redis分布式鎖的人肯定知道,一開始redis作為分布式鎖用的是setnx,再這基礎上設置個定時過期時間,但這種方式有什么問題呢?
實際上看懂上圖的人也就明白了那有什么問題,首先是原子性問題,setnx+過期時間這兩個操作必須是原子性的,所以這可以用lua腳本解決
再然后是釋放鎖的時機該如何定?
不管我們定多少過期時間,都不能保證,在這段時間內鎖住的代碼執行完成了,所以這個時間定多少都不好;
如果不定時間,當執行完成后釋放鎖,問題就是如果執行到一半機器宕機,那這把鎖就永遠放不掉了
那Redisson是如何解決上述問題的呢?
它對代碼進行了精簡的封裝,我們的使用非常簡單,甚至我們不用主動設置過期時間
它設計了個watch dog看門狗,每隔10秒會檢查一下是否還持有鎖,若持有鎖,就給他更新過期時間30秒;通過這樣的設計,可以讓他在沒有釋放鎖之前一直持有鎖,哪怕宕機了,也能自動釋放鎖
而不能獲得鎖的客戶端則是不斷循環嘗試加鎖
通過記錄鎖的客戶端id,可以把它設計成可重入鎖
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END