redis實現分布式鎖 工具類

2021-10-14 11:27:18 字數 1773 閱讀 8362

/*

** @description: redis 分布式鎖

* @author: cy

* @create: 2020-07-10

**/@slf4j

@component

public class redislock

/*** 清除本地執行緒變數,防止記憶體洩露

*/ private void clean(

)/**

* 獲取rediskey

* @param key 原始key,如果為空,自動生成隨機key

* @return*/

private string getrediskey(string key)

//如果都是空那就丟擲異常

if(stringutils.isempty(key) && stringutils.isempty(localkeys.get())

)return lock_prefix + key;

} public boolean lock(string key, string value)

/*** 加鎖

* @param key key

* @param timeout 過期時間

* @return*/

public boolean lock(string key, string value, long timeout)

else

//休眠一定時間後再獲取鎖,這裡時間可以通過外部設定

thread.

sleep

(20)

; result = redistemplate.execute(lock_lua_script, keys);if

(!stringutils.isempty(result) && result == lock_success)

}catch

(exception e)}}

}catch

(exception e1)

return false;

}/**

* 釋放key

* @param key

* @return*/

public boolean unlock(string key)

string rediskey = getrediskey(key);/

/判斷key是否正確,不能釋放其他執行緒的key

if(!stringutils.isempty(localkey) && !localkey.equals(rediskey))/

/組裝lua指令碼引數

listkeys = arrays.aslist(rediskey, localvalues.get())

;// 使用lua指令碼刪除redis中匹配value的key,可以避免由於方法執行時間過長而redis鎖自動過期失效的時候誤刪其他執行緒的鎖

long result = redistemplate.execute(unlock_lua_script, keys);/

/如果這裡拋異常,後續鎖無法釋放

if(result != null && release_success == result)

elseif(

!stringutils.isempty(result) && result == lock_expired)

else

}catch

(exception e)

finally

return false;

}}

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...

redis實現分布式鎖

隨便 系統越來越大,各功能模組除了垂直切割以外,同時也得做集群處理,那麼問題來了,在多執行緒情況下對於資源的競爭就需要乙個統一的訪問限制。以選課系統為例子,集群中各節點對課程可選數量同時操作,這裡就需要同步了,否則會導致最後選到的數量比可選的數量大,這裡我們的分布式鎖就派上用場了。利用redis來實...

redis實現分布式鎖

分布式鎖可以基於很多種方式實現,比如zookeeper redis.不管哪種方式,他的 基本原理是不變的 用乙個狀態值表示鎖,對鎖的占用和釋放通過狀態值來標識。1 使用redis的setnx命令實現分布式鎖 1 實現的原理 redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多客戶...