redis實現分布式鎖

2021-07-23 14:09:32 字數 1580 閱讀 1103

隨便**系統越來越大,各功能模組除了垂直切割以外,同時也得做集群處理,那麼問題來了,在多執行緒情況下對於資源的競爭就需要乙個統一的訪問限制。

以選課系統為例子,集群中各節點對課程可選數量同時操作,這裡就需要同步了,否則會導致最後選到的數量比可選的數量大,這裡我們的分布式鎖就派上用場了。

利用redis來實現每個節點對資源訪問前都需要獲取到許可 才能繼續進行後續操作,這樣就保證了資料的同步。

這裡使用到了redis 的setnx命令,當且僅當 key 不存在,將 key 的值設為 value ,並返回1;若給定的 key 已經存在,則 setnx 不做任何動作,並返回0。

這樣我們就可以利用key是否存在來進行能否獲取資源的,當乙個執行緒已經設定了key那麼下乙個執行緒繼續去設定的時候會得到返回值0,這樣說明鎖已經被另外乙個執行緒所獲得。

public class redislock {

public static final logger logger = logge***ctory.getlogger(redislock.class);

/** 加鎖標誌 */

public static final string locked = "true";

/** 毫秒與毫微秒的換算單位 1毫秒 = 1000000毫微秒 */

public static final long milli_nano_conversion = 1000 * 1000l;

/** 預設超時時間(毫秒) */

public static final long default_time_out = 1000;

public static final random random = new random();

/** 鎖的超時時間(秒),過期刪除 */

public static final int expire = 3 * 60;

/** 鎖的超時時間(毫秒),對比*/

public static final long lock_default_time_out = 60*1000l;

@autowired

private jedispool jedispool;

/*** 加鎖 key:需要獲取得key timeout:等待超時時間

* @description

* @author peng.wang

* @param key

* @param timeout

* @return

*/public boolean lock(string key,long timeout){

jedis jedis = null;

long nano = system.nanotime();

timeout *= milli_nano_conversion;

try {

jedis = this.jedispool.getresource();

//獲取鎖成功 返回設定的value

while((system.nanotime()-nano)

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

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

redis實現分布式鎖

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

Redis實現分布式鎖

如果為空就插入值,返回true,如果不為空則不做操作,返回false param key param value return public static boolean setifabsent string key,string value 插入新值並返回舊值 獲取分布式鎖,獲取不成功會一直嘗試獲...