編寫乙個redis分布式鎖

2021-09-06 23:35:28 字數 1058 閱讀 7907

分布式鎖:無論集群伺服器有多少臺,使用了該分布式鎖之後都可以統一的對某乙個資源進行鎖定;某個使用者加鎖之後只有他將分布式鎖釋放了才能讓其它的人操作資源。

redis分布式鎖:根據redis中的乙個key的是否存在來實現的;如果key不存在則說明沒有人加鎖,所以建立key成功表示鎖獲取到了;如果key存在了說明已經有人在使用鎖只能等待。

以下是編寫的redis分布式鎖的小小工具類:

/**

* 主要用於在分布式環境下對於共享資源的操作進行鎖定

*/public class redislock

/*** 在一定的限定時間內 獲取某一類資源或操作的鎖

** @param key 鍵名(可以隨便指定;一般為某一類資源或操作命名)

* @return true or false

*/public boolean lock(string key) throws interruptedexception

//獲取鎖失敗,檢視是否鎖已經超時

long oldexpiretime = (long) redistemplate.boundvalueops(key).get();

//鎖已經超時

if (oldexpiretime < system.currenttimemillis())

}//沉睡隨機幾百毫秒再去嘗試獲取鎖

long sleeptime = (long) (math.random() * 1000);

//遞減等待獲取鎖的時間

timeout = timeout - sleeptime;

thread.sleep(sleeptime);

}return false;

}/**

* 釋放某一類資源或操作的鎖

** @param key key 鍵名(與加鎖時候的key要一致)

*/public void unlock(string key)

}//只要呼叫釋放鎖,不管有沒釋放鎖,但是執行緒變數都已經沒有存在意義

tlexpiretime.remove();

}}

Redis分布式鎖(一)

每個方案都有各自的優缺點,例如mysql雖然直觀理解容易,但是實現起來卻需要額外考慮鎖超時 加事務等,並且效能侷限於資料庫,諸如此類我們在此不作討論,重點關注redis。使用redis作為分布式鎖的優點 對於redis實現簡單,效能對比zookeeper和mysql較好。如果不需要特別複雜的要求,那...

redis分布式鎖

redis分布式鎖 直接上 我寫了四個redis分布式鎖的方法,大家可以提個意見 第一種方法 redis分布式鎖 param timeout public void lock long timeout thread.sleep 100 catch exception e override publi...

Redis分布式鎖

分布式鎖一般有三種實現方式 1.資料庫樂觀鎖 2.基於redis的分布式鎖 3.基於zookeeper的分布式鎖.首先,為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件 互斥性。在任意時刻,只有乙個客戶端能持有鎖。不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保...