一 分布式鎖
由於在平時的工作中,線上服務器是分布式多台部署的,經常會面臨解決分布式場景下數據一致性的問題,那么就要利用分布式鎖來解決這些問題。
分布式的CAP理論告訴我們“任何一個分布式系統都無法同時滿足一致性(Consistency)、可用性(Availability)和分區容錯性(Partition tolerance),最多只能同時滿足兩項。”所以,很多系統在設計之初就要對這三者做出取舍。在互聯網領域的絕大多數的場景中,都需要犧牲強一致性來換取系統的高可用性,系統往往只需要保證“最終一致性”,只要這個最終時間是在用戶可以接受的范圍內即可。
1. 樂觀鎖和悲觀鎖
悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。傳統的關系型數據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣可以提高吞吐量,像數據庫如果提供類似於write_condition機制的其實都是提供的樂觀鎖
2. 分布式鎖的一般實現方式
針對分布式鎖的實現,目前比較常用的有以下幾種方案:
- 基於數據庫實現分布式鎖
- 基於緩存(redis,memcached,tair)實現分布式鎖
- 基於Zookeeper實現分布式鎖
1 基於數據庫實現分布式鎖
基於數據庫實現的分布式鎖分為行鎖(for update實現的record lock)和排他鎖/表鎖(添加唯一標識子段)的方式實現。
實現原理
要實現分布式鎖,最簡單的方式可能就是直接創建一張鎖表,然后通過操作該表中的數據來實現了。當我們要鎖住某個方法或資源時,我們就在該表中增加一條記錄,想要釋放鎖的時候就刪除這條記錄。創建這樣一張數據庫表:
相關文章:
Java Jedis操作Redis示例(三)——setnx/getset實現分布式鎖