新增Redis分布式鎖

2021-10-14 17:52:14 字數 2220 閱讀 2663

加鎖+過期時間必須是乙個原子性操作,如果鎖已經加上了,在設定過期時間時程式斷電,則會導致鎖一直存在,利用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不存在。如給定的...