之前有用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不存在。如給定的...