Redis分布式鎖的原理是什么?
在傳統單體應用單機部署的情況下,并發問題可以通過使用Java并發相關的鎖如synchronized,但是當規模上升到分布式集群的情況下,要控制共享資源訪問,就需要通過分布式鎖來實現。常見的分布式鎖方案如數據庫樂觀鎖,Redis鎖,zk鎖等。
Redis分布式鎖的原理Redis分布式鎖可以有多種方式實現但是其核心就是通過以下三個Redis命令組合實現。
SETNX SETNX key val 當且僅當key不存在時,set一個key為val的字符串,返回1;若key存在,則什么都不做,返回0。 Expire expire key timeout 為key設置一個超時時間,單位為second,超過這個時間鎖會自動釋放,避免死鎖。 Delete delete key 刪除key核心思想使用setnx獲取鎖。如果成功取到鎖,則使用expire命令為鎖添加一個超時時間,超過該時間則自動釋放鎖。 獲取鎖的時候還設置一個獲取的超時時間,若超過這個時間則放棄獲取鎖。注意上面為Redis的一個最簡單的鎖實現原理,實際中還需要考慮更多具體的情況作出相應的調整。如
上面的demo中,當集群系統時間不一致時會有問題當服務器異常關閉或是重啟,加鎖后沒來得急設置鎖超時時間,如何避免死鎖實際開發環境中不確定的因素有很多,需要慢慢地去調整實踐達到理想狀態,可以考慮使用redisson框架來實現。
如何續期?這個情況比較獨特,出現這個問題的根本原因在于鎖失效的時間小于業務處理的時間導致業務還沒處理完畢鎖就釋放了。那么解決方案是合理地結合業務去設置鎖失效的時間。
但是也有更好的方案就如前文提到的redisson,其中的可重入鎖概念。
默認情況下,加鎖的時間是30秒.如果加鎖的業務沒有執行完,那么到 30-10 = 20秒的時候,就會進行一次續期,把鎖重置成30秒。
以上就是redis鎖的原理及續期的方式,希望我的回答能對你有所幫助。