分布式鎖 redisson

2021-10-10 06:24:33 字數 3563 閱讀 3327

1、匯入依賴

>

>

org.redissongroupid

>

>

redissonartifactid

>

>

3.11.1version

>

dependency

>

2、配置redisson

@configuration

public

class

redissonconfig

}

spring:

name: cjs-redisson-example

redis:

cluster:

nodes: 10.0.29.30:6379

・可重用鎖:redisson預設獲取的都是可重用鎖

public

static rlock lock

(string lockkey)

redisson看門狗功能,能給鎖自動續時間,比如兩個伺服器上有同一把鎖,當兩個執行緒訪問這把鎖時,乙個執行緒正在占用,則另外乙個等待鎖的釋放,當占用那個執行緒的伺服器突然宕機了,無法釋放鎖時,看門狗則會自動給這個服務延時不用擔心業務時間超時導致鎖被刪除,防止死鎖問題

1、 lock.lock();--------》加鎖,阻塞式等待,乙個執行緒進來如果沒有解鎖就一直在這裡等待

2、lock.lock(10, timeunit.seconds)--------》獲取到鎖10s後自動解鎖,自動解鎖時間一定要大於業務時間。鎖時間到了不會自動續期。

3、lock.trylock(waittime, leasetime, timeunit.seconds);--------》嘗試獲取鎖,waittime 最多等待時間,leasetime 上鎖後自動釋放鎖時間。

用法:讀資料加讀鎖(共享鎖),改資料加寫鎖(互斥鎖),允許多個執行緒併發讀資料,當有現在在寫資料時,讀資料執行緒等待寫資料完畢後才能讀。

讀+讀:無鎖

寫+讀:等待寫鎖釋放

寫+寫:阻塞方式

讀+寫:等待讀鎖釋放・・

讀鎖與寫鎖的建立:

rreadwritelock rwlock = redisson.

getreadwritelock

("anyrwlock");

// 最常見的使用方法,讀鎖

rwlock.

readlock()

.lock()

;// 或,寫鎖

rwlock.

writelock()

.lock()

;

大家都知道,如果負責儲存這個分布式鎖的redis節點宕機以後,而且這個鎖正好處於鎖住的狀態時,這個鎖會出現鎖死的狀態。為了避免這種情況的發生,redisson內部提供了乙個監控鎖的看門狗,它的作用是在redisson例項被關閉前,不斷的延長鎖的有效期。預設情況下,看門狗的檢查鎖的超時時間是30秒鐘,也可以通過修改config.lockwatchdogtimeout來另行指定。另外redisson還通過加鎖的方法提供了leasetime的引數來指定加鎖的時間。超過這個時間後鎖便自動解開了。

// 10秒鐘以後自動解鎖

// 無需呼叫unlock方法手動解鎖

rwlock.

readlock()

.lock(10

, timeunit.seconds)

;// 或

rwlock.

writelock()

.lock(10

, timeunit.seconds)

;// 嘗試加鎖,最多等待100秒,上鎖以後10秒自動解鎖

boolean res = rwlock.

readlock()

.trylock

(100,10

, timeunit.seconds)

;// 或

boolean res = rwlock.

writelock()

.trylock

(100,10

, timeunit.seconds);.

..lock.

unlock()

;

//生成訊號量

rsemaphore semaphore = redisson.

getsemaphore

("semaphore");

//獲取乙個訊號量

semaphore.

acquire()

;//阻塞式等待

semaphore.

tryacquire()

;//嘗試獲取,被阻塞就直接返回不等待

//釋放乙個訊號量

semaphore.

release()

;

案例:比如停車,3個車位,都被semaphore.acquire();獲取了,獲取乙個訊號量減減,當第4個人來semaphore.acquire()訊號量變為0;則它在這裡等待,知道有semaphore.release();釋放,訊號量加加時,它才能獲取成功。

如果semaphore.tryacquire();嘗試獲取訊號量時獲取失敗就直接返回錯誤不等待;

用法: 當加鎖閉鎖後只有當閉鎖設定的計算量被減完後閉鎖才能完成。

//獲取閉鎖

rcountdownlatch latch = redisson.

getcountdownlatch

("anycountdownlatch");

//設定閉鎖計算

latch.

setcount(1

);//等待閉鎖完成

latch.

await()

;// 在其他執行緒或其他jvm裡

rcountdownlatch latch = redisson.

getcountdownlatch

("anycountdownlatch");

latch.

countdown()

;//計數減一(1-1)

案例:比如關學校大門對應latch.await(); 班級關門對應latch.countdown();當乙個班關門後執行latch.countdown();將latch.setcount(1);中的計數減為0,latch.await();執行關閉校門。

redisson分布式鎖

介面做冪等的方式很多,我們應用使用分布式鎖 插入明細來做冪等。但是發現冪等失效了,最終確認是業務執行尚未結束,還沒有插入明細。但是客戶端第二個訪問就來到了,此時呢,分布式鎖的時間也失效了。也就是兩個問題 1是業務執行為什麼很慢,這個就有很多種情況暫不考慮。考慮第二種情況,能不能加長分布式鎖的時間。由...

redis分布式鎖redisson

原文 關於redisson的源 請參考官網 redisson官方講解參考 wiki e7 9b ae e5 bd 95 首先需要引入redisson org.springframework.bootgroupid spring boot starter data redisartifactid de...

Redisson實現分布式鎖

引入包 org.redissongroupid redissonartifactid 3.10.0version dependency redissonconfig類 package com.xiepanpan.locks.lockstest.config import org.redisson.r...