redis分布式鎖

2021-08-29 03:10:17 字數 1637 閱讀 6114

之前有用zk+curator選出leader,指定一台機器執行定時任務。後來嘗試用redis來實現分布式鎖,來確定一台機器執行定時任務。

版本1加鎖

public boolean trylock(string lockkey, integer expireseconds) 

if (expireseconds == null || expireseconds < 0)

jedis jedis = null;

try else

} finally

}

釋放鎖

public void releaselock(string lockkey) 

} finally

}

有以下實現,上述參考鏈結,還有多種錯誤示範及講解,可以看看

加鎖

private static final string lock_success_result="ok";

public boolean trylock(string lockkey,string requestid, integer expireseconds)

if (expireseconds == null || expireseconds < 0)

jedis = getjedis();

//@param n*** n***的值只能取nx或者xx,如果取nx,則只有當key不存在是才進行set,如果取xx,則只有當key已經存在時才進行set

//@param expx expx的值只能取ex或者px,代表資料過期時間的單位,ex代表秒,px代表毫秒。

string result = jedis.set(lockkey,requestid,"nx","ex",expireseconds);

if(lock_success_result.equalsignorecase(result))

return false;

} finally

}

釋放鎖

private static final long release_success = 1l;

public boolean releaselock(string lockkey,string requestid)

return false;

}} finally

}

上面執行eval指令碼,會出現以下錯誤

exception in thread "main" redis.clients.jedis.exceptions.jedisdataexception: err unknown command ' eval '
如果是自己搭建的redis伺服器

檢查redis版本是否大於等於2.6.0

如果版本沒問題,開啟redis.conf配置檔案

檢查是否有rename-command eval ""這項配置

如果有,注釋掉#rename-command eval "",重啟redis即可

在實際使用中,最好能傳入requestid,如果eval沒辦法執行指令碼,那麼個人感覺傳不傳沒什麼影響

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的分布式鎖.首先,為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件 互斥性。在任意時刻,只有乙個客戶端能持有鎖。不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保...

redis分布式鎖

使用redis的setnx命令實現分布式鎖 redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多個客戶端對redis的連線並不存在競爭關係。redis的setnx命令可以方便的實現分布式鎖。setnx key value 將key的值設為value,當且僅當key不存在。如給定的...