分布式鎖一般有三種實現方式:1. 資料庫鎖;2. 基於redis的分布式鎖;3. 基於zookeeper的分布式鎖
1、基於資料庫
建立一張資料庫表 鎖表 使用insert語句來鎖住某個方法, 儲存鎖資訊來加鎖,使用for update 來實現分布式鎖
2、基於redis來實現分布式鎖 redis中set方法可以支援分布式鎖 可以設定過期時間 可以設定請求的id資訊redis分布式鎖可以 解決死鎖 單點 和 阻塞 互斥的等條件
3、使用zookeeper來實現分布式鎖
zookeeper可以建立瞬時臨時節點 該節點可以報錯請求伺服器資訊 和執行緒資訊 還可以在遇到session連線斷開的情況下,刪除節點防止發生死鎖 zk集群部署 解決單點問題
分布式鎖應該是怎麼樣的
1.互斥性: 可以保證在分布式部署的應用集群中,同乙個方法在同一時間只能被一台機器上的乙個執行緒執行。
2.這把鎖要是一把可重入鎖(避免死鎖)
3.不會發生死鎖:有乙個客戶端在持有鎖的過程中崩潰而沒有解鎖,也能保證其他客戶端能夠加鎖
4.這把鎖最好是一把阻塞鎖(根據業務需求考慮要不要這條)
5.有高可用的
5.獲取鎖和釋放鎖功能獲取鎖和釋放鎖的效能要好
寫的不錯這篇:
實現分布式鎖的三種方式
1 資料庫的樂觀鎖 版本號機制 悲觀鎖與樂觀鎖 2 基於redis的分布式鎖 加鎖public class redistool return false 我們加鎖就一行 jedis.set string key,string value,string n string expx,int time 這...
實現分布式鎖的三種方式
類似的文章網上一搜一大把,實現方式也無非這三種,不過自己還是總結一下吧,實際應用中只採用過快取來實現 通過增刪操作,借助資料庫唯一索引的唯一性或主鍵唯一性,來實現 缺點 資料庫單點問題,如果資料庫掛了,會導致業務系統不可用 獲取鎖後,沒有失效時間,如果解鎖失敗,就會導致鎖記錄始終在資料庫中,其他執行...
分布式鎖的三種實現方式
更多請參考 1 基於資料庫的實現方式的核心思想是 在資料庫中建立乙個表,表中包含方法名等字段,並在方法名字段上建立唯一索引,想要執行某個方法,就使用這個方法名向表中插入資料,成功插入則獲取鎖,執行完成後刪除對應的行資料釋放鎖。drop table if exists method lock crea...