Redisson 原始碼初探(八) RedLock

2021-10-20 11:04:32 字數 2268 閱讀 3016

本篇主要講解redisson中得redlock實現,但是很多知識因為和前面一樣,就直接省略了

redlock 原理理一下:

(1)獲取當前時間戳,單位是毫秒

(2)和redissonmultilock一樣,一次輪詢嘗試去每個機器上建立鎖,需要加乙個超時時間,如果超過一定時間就表示獲取鎖失敗

(3)嘗試在大多數節點上建立乙個鎖,如果3個節點就要求建立 n/2 + 1 = 2個節點上建立鎖

(4)客戶端計算建立鎖的時間,如果在規定時間內,建立鎖成功,就代表加鎖成功

(5)如果建立鎖失敗,那麼就會依次的刪除鎖

(6)只要別人建立了鎖,那麼你就得不停得輪詢去嘗試獲取鎖 

public static void main(string args) throws exception
但是這個redlock的原始碼相當的簡單,為什麼?我們學習了redissonmultilock的原始碼,其實你們想想redlock的邏輯,其實是不是和redissonmultilock極其的相似,

對的,沒錯,redlock 就是redissonmultilock 的乙個子類,裡面僅僅覆蓋了幾個方法

public class redissonredlock extends redissonmultilock  objects.

* each rlock object could be created by own redisson instance.

** @param locks - array of locks

*/public redissonredlock(rlock... locks)

//允許失敗的個數

@override

protected int failedlockslimit()

//最少要獲取幾個鎖

//如果size = 3,計算出來=2

protected int minlocksamount(final listlocks)

//計算等待時間,其實是計算出乙個獲取鎖的超時時間

@override

protected long calclockwaittime(long remaintime)

@override

public void unlock()

}

public boolean trylock(long waittime, long leasetime, timeunit unit) throws interruptedexception  catch (executionexception e) 

long newleasetime = -1;

if (leasetime != -1)

long time = system.currenttimemillis();

long remaintime = -1;

if (waittime != -1)

//lockwittime = 1500ms

long lockwaittime = calclockwaittime(remaintime);

//以前multilock 是預設0,但是對於redlock n- (n/2+1) 假設n=3.計算出來就是1

int failedlockslimit = failedlockslimit();

listacquiredlocks = new arraylist(locks.size());

for (listiteratoriterator = locks.listiterator(); iterator.hasnext();) else

} catch (exception e)

if (lockacquired) else

if (failedlockslimit == 0)

failedlockslimit = failedlockslimit();

acquiredlocks.clear();

// reset iterator

//復位迭代器

while (iterator.hasprevious())

} else

}if (remaintime != -1) }}

if (leasetime != -1)

for (rfuturerfuture : futures)

}return true;

}

那麼釋放鎖呢,其實也就是依次得去呼叫底層redissonlock得釋放鎖得api而已 

Redisson 原始碼初探(四)釋放鎖

override public void unlock catch redi ception e else override public rfutureunlockasync final long threadid boolean opstatus future.getnow if opstatu...

OkHttp原始碼初探

在之前的文章我中我們介紹了okhttp的基本使用方法並簡單說明了原始碼下各個module的功能作用,從這篇開始我們將要開始分析okhttp的原始碼。首先,我們先來回憶一下okhttp的使用過程 1.建立乙個okhttpclient物件 2.建立乙個request物件 3.呼叫okhttpclient...

RequireJS原始碼初探

前兩天跟著葉小釵的部落格,看了下requirejs的原始碼,大體了解了其中的執行過程。不過在何時進行依賴項的載入,以及具體的 在何處執行,還沒有搞透徹,奈何能力不夠,只能先記錄一下了。看原始碼從頭開始看,肯定是不切實際的。按照葉小釵的方法,是從data main開始的,所以我們也從那裡開始把!首先,...