超實用!一篇文章講透分布式鎖,建議收藏!
分布式鎖是在分布式系統環境下,確保多個節點(可能位于不同機器或不同地理位置)對共享資源的互斥訪問,從而避免數據不一致和競爭條件。
它是現代微服務應用(分布式應用)架構解決并發控制問題的關鍵技術,也是面試中的常客了,今天咱們來盤點一下分布式鎖的 3 種常見實現方案。
1.基于Redis的分布式鎖
這是分布式鎖最常見的實現方案,因為 Redis 本身為分布式組件,所以 Redis 實現的鎖就天然的分布式鎖:
圖片
基于 Redis 的分布式的實現方案也有以下幾種:
- setnx(set if Not eXists):嘗試設置鍵 key 的值為 value,但如果 key 已經存在,則不會執行任何操作并返回 0,如果 key 不存在則加鎖成功。
- 缺陷:存在死鎖問題、鎖誤刪問題、不可重入問題、鎖無法自動續期問題。
- set nx ex/px:setnx 升級版本,Redis 2.6 版本后才能支持此語法。嘗試加鎖和設置鎖超時時間,使用案例 set key value nx px 3000。
- 缺陷:存在鎖誤刪問題、不可重入問題、鎖無法自動續期問題。
- Lua 腳本:解決鎖重入的問題
- 缺陷:實現復雜、且存在鎖無法自動續期問題。
- Redisson 框架:基于 Redis 實現分布式鎖的開源框架。其實現簡單、不存在鎖重入和鎖續期等問題。
可用于生成環境的實現方式為 Redisson 框架實現的分布式鎖,它底層是基于 Redis 主線程執行任務為單線程 + Set 命令的原子性來加鎖的,核心命令:SET key value NX EX 命令:
- NX:僅當 KEY 不存在時設置,保證互斥;
- EX:設置過期時間,防止死鎖;
- value:擁有者 ID,防止誤刪鎖。
但它實現簡單,不存在鎖重入、鎖誤刪、解決了鎖續期的問題,所以常被用于生產環境。
2.基于Zookeeper的分布式鎖
ZooKeeper 提供強一致性和順序性,適合實現高可靠分布式鎖。
它的實現原理:
- 創建一個持久父節點,如 /locks;
- 每個客戶端嘗試獲取鎖時,在該父節點下創建一個臨時順序節點,如 /locks/lock_000000001;
- 客戶端獲取所有子節點并排序,檢查自己創建的節點是否為最小節點;
- 若是最小節點,則獲得鎖;否則監聽前一個節點的刪除事件;
- 釋放鎖時刪除自己的臨時節點,ZooKeeper 自動通知下一個節點。
優點:
- 臨時節點在客戶端斷開連接后自動刪除,避免死鎖;
- 順序節點保證公平性;
- Watch 機制實現高效通知。
缺點:
- 依賴 ZooKeeper 集群,運維復雜;
- 網絡抖動可能導致臨時節點被誤刪。
3.基于數據庫的分布式鎖
最簡單的實現方式是創建一張鎖表,包含資源名稱(唯一索引)和持有者信息。加鎖時插入記錄,利用數據庫的唯一約束保證互斥;釋放鎖時刪除記錄。
它的缺點是性能差、存在單點故障、無法自動釋放(若客戶端宕機)。改進方式包括引入過期時間字段,配合定時任務清理,但存在精度問題和性能問題。
小結
分布式鎖的常見實現方案有:基于 Redis 的分布式鎖實現、基于 Zookeeper 的分布式鎖實現,以及基于數據庫的分布式鎖實現,但其中使用 Redisson 框架(基于 Redis 實現)實現分布式鎖的方案使用的最多,因為它無需單獨部署中間件服務,并且使用簡單,不存在鎖重入和解決了鎖續期等問題。






























