加鎖+過期時間必須是乙個原子性操作,如果鎖已經加上了,在設定過期時間時程式斷電,則會導致鎖一直存在,利用setifabsent的api中的加鎖+過期時間解決該問題
刪除鎖也要是個原子操作,先查再刪依然會出現以上情況,利用redis執行lua指令碼解決刪除鎖問題
pom
>
>
org.redissongroupid
>
>
redissonartifactid
>
>
3.10.6version
>
dependency
>
加鎖
@autowired
private oldmarketdataservice oldmarketdataservice;
@autowired
private redissonclient redissonclient;
@resource
public
static
final string ms_history =
"ms_history"
;public
static
final threadpoolexecutor pool =
newthreadpoolexecutor(1
,1,60
, timeunit.seconds,
newlinkedblockingqueue
<
>(1
),executors.
defaultthreadfactory()
,new
threadpoolexecutor.discardpolicy()
);@override
public
void
syncold()
mshistorycodepolist.
foreach
(mshistorycodepo -
>);
}}catch
(exception e)
finally}}
);}
redis配置類
/**
* redis配置
* * @author xlj
* @date 2020/12/28 16:24
*/@configuration
public
class
redisconfig")
private string nodes;
@value
("$"
)private string password;
@bean
public redissonclient redissonclient()
string address =
"redis://%s"
; string[
] split = nodes.
split
(",");
string[
] array =
newstring
[split.length]
;for
(int i =
0; i < split.length; i++
) config config =
newconfig()
; config.
useclusterservers()
.addnodeaddress
(array)
.setpassword
(password)
;return redisson.
create
(config);}
}
專案重啟清除鎖
/**
* 專案重啟後清除redis鎖
* * @author xlj
* @date 2021/1/12
*/@component
@slf4j
public
class
redisinit
implements
", mrkhistoryscheduletaskserviceimpl.ms_history);}
}
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不存在。如給定的...