實現分布式鎖的三種方式

2021-08-13 06:40:52 字數 687 閱讀 7448

1、資料庫的樂觀鎖(版本號機制)

悲觀鎖與樂觀鎖

2、基於redis的分布式鎖

加鎖

public class redistool 

return false;

}}

我們加鎖就一行**:jedis.set(string key, string value, string n***, string expx, int time),這個set()方法一共有五個形參:

總的來說,執行上面的set()方法就只會導致兩種結果:1. 當前沒有鎖(key不存在),那麼就進行加鎖操作,並對鎖設定個有效期,同時value表示加鎖的客戶端。2. 已有鎖存在,不做任何操作。

解鎖

public class redistool 

return false;

}}

第二行**,我們將lua**傳到jedis.eval()方法裡,並使引數keys[1]賦值為lockkey,argv[1]賦值為requestid。eval()方法是將lua**交給redis服務端執行。

那麼這段lua**的功能是什麼呢?其實很簡單,首先獲取鎖對應的value值(requestid),檢查是否與requestid相等,如果相等則刪除鎖(解鎖)。那麼為什麼要使用lua語言來實現呢?因為要確保上述操作是原子性的。

3、基於zookeeper的分布式鎖

實現分布式鎖的三種方式

類似的文章網上一搜一大把,實現方式也無非這三種,不過自己還是總結一下吧,實際應用中只採用過快取來實現 通過增刪操作,借助資料庫唯一索引的唯一性或主鍵唯一性,來實現 缺點 資料庫單點問題,如果資料庫掛了,會導致業務系統不可用 獲取鎖後,沒有失效時間,如果解鎖失敗,就會導致鎖記錄始終在資料庫中,其他執行...

分布式鎖的三種實現方式

更多請參考 1 基於資料庫的實現方式的核心思想是 在資料庫中建立乙個表,表中包含方法名等字段,並在方法名字段上建立唯一索引,想要執行某個方法,就使用這個方法名向表中插入資料,成功插入則獲取鎖,執行完成後刪除對應的行資料釋放鎖。drop table if exists method lock crea...

實現分布式鎖的三種方式

類似的文章網上一搜一大把,實現方式也無非這三種,不過自己還是總結一下吧,實際應用中只採用過快取來實現 通過增刪操作,借助資料庫唯一索引的唯一性或主鍵唯一性,來實現 缺點 資料庫單點問題,如果資料庫掛了,會導致業務系統不可用 獲取鎖後,沒有失效時間,如果解鎖失敗,就會導致鎖記錄始終在資料庫中,其他執行...