前幾日做了乙個類似論壇的功能實現,話不多說,上**
工具類 jedisutil
@componentpublic
class
jedisutil ")
public
void
setjedisclusterprefix(string jedisclusterprefix)
}@value("$")
private
void
initredishostinfo(string hosts)
/*** jedis初始化**
@since
2020-02-26
*/public
static
void
redispoolfactory()
/*** 獲取字串**
@since
202-02-26
*/public
static string getstring(string key, int
... second)
catch
(exception e)
finally
}/*** 寫入字串**
@since
2020-02-26
*/public
static
void setstring(string key, string data, int
... second)
catch
(exception e)
finally
}/*** 設定key的時間**
@since
2020-02-26
*/public
static
long expire(string key, integer second)
catch
(exception e)
finally
}/*** redis分布式鎖判定**
@since
2020-02-26
*/public
static object eval(string key, listkeys, listargs)
catch
(exception e)
finally
}/*** 延長key的時間**
@since
2020-02-26
*/private
static
void expireinside(jedis jedis, string key, int
... second)
}/*** 嘗試獲取分布式鎖**
@param
lockkey 鎖
* @param
requestid 請求標識
* @param
expiretime 超期時間
* @return
是否獲取成功
*/public
static
boolean trygetlock(string lockkey, string requestid, int
expiretime)
return
false
; }
catch
(exception e)
finally
}/*** 釋放分布式鎖**
@param
lockkey 鎖
* @param
requestid 請求標識
* @return
是否釋放成功
*/public
static
boolean
releaselock(string lockkey, string requestid)
else
} catch
(exception e)
finally
}}
實際**呼叫
//uuid
string requestid =uuidutils.getuuid();
//分布式鎖
string topiclock = "topiclock_" +topicid;
boolean flag = true
;
if(條件)
thread.sleep(300l);
}}
這是在jedis基礎上自己封裝的分布式鎖,跟redistemplate分布式鎖一樣存在集群中鎖異常關閉導致重複獲取鎖的問題,簡單業務可以應用,如果業務龐大且伺服器不穩定,建議選擇zk做分布式鎖
jedis實現分布式鎖
1.互斥性。在任意時刻,只有乙個客戶端能持有鎖。2.不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保證後續其他客戶端能加鎖。3.具有容錯性。只要大部分的redis節點正常執行,客戶端就可以加鎖和解鎖。4.解鈴還須繫鈴人。加鎖和解鎖必須是同乙個客戶端,客戶端自己不能把別人加的鎖給...
分布式 分布式鎖
本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...
分布式專題 分布式鎖
在傳統的單體應用架構中,遇到併發安全性問題時我們可以通過同步鎖synchronized,同步 塊,reentrantlock等方式都可以解決,但隨著業務的發展,單體應用架構不能滿足龐大的使用者請求量,於是分布式系統應用而生,在分布式系統中,由於每個系統都執行在不同的伺服器上,有著不同的jvm,所以j...