日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Redisson分布式鎖源碼之八:MultiLock加鎖與鎖釋放

Redisson 分布式鎖源碼之八:MultiLock 加鎖與鎖釋放

作者:程序員小航 2021-07-03 17:45:57

開發(fā)

前端

分布式

Redis 基于 Redis 的 Redisson 分布式聯(lián)鎖 RedissonMultiLock 對象可以將多個 RLock 對象關(guān)聯(lián)為一個聯(lián)鎖,每個 RLock 對象實例可以來自于不同的 Redisson 實例。

目前創(chuàng)新互聯(lián)已為成百上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站運營、企業(yè)網(wǎng)站設(shè)計、五大連池網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

[[409055]]

前言

基于 Redis 的 Redisson 分布式聯(lián)鎖 RedissonMultiLock 對象可以將多個 RLock 對象關(guān)聯(lián)為一個聯(lián)鎖,每個 RLock 對象實例可以來自于不同的 Redisson 實例。

當(dāng)然,這是官網(wǎng)的介紹,具體是什么?一起看看聯(lián)鎖 MultiLock 使用以及源碼吧!

1MultiLock 使用

按照官方文檔的說法,這里 Redisson 客戶端可以不是同一個。當(dāng)然,一般工作中也不會說不用一個客戶端吧。

2加鎖

在閱讀 MultiLock 加鎖之前,小伙伴應(yīng)該已經(jīng)閱讀過普通加鎖的相關(guān)文章。

源碼入口:org.redisson.RedissonMultiLock#lock()

默認(rèn)超時時間 leaseTime 沒有設(shè)置,所以為 -1。

這塊方法太長,咱們拆分進行閱讀。

  1. 基礎(chǔ)等待時間 baseWaitTime = 鎖數(shù)量 * 1500,在這里就是 4500 毫秒;
  2. leaseTime == -1 所以 waitTime = baseWaitTime,也就是 4500;
  3. while (true) 調(diào)用 tryLock 加鎖,直到成功。

調(diào)用 tryLock 方法,其中參數(shù) waitTime = 4500,leaseTime = -1,unit = MILLISECONDS。

下面看一下 tryLock 里面有什么邏輯?

leaseTime != -1 不滿足,這部分直接跳過。

waitTime != -1 條件滿足,remainTime = 4500,lockWaitTime = 4500。

所以,failedLocksLimit() 這個方法直接返回 0,就是必須全部加鎖成功。

這里才是重點:

遍歷所有的鎖,依次加鎖。

加鎖邏輯就和可重入鎖加鎖并無區(qū)別了。所以 Lua 腳本就不進行分析了。

上面就是 tryLock 加鎖之后的結(jié)果。

加鎖成功,則將成功的鎖放進 acquiredLocks 集合中;

加鎖失敗,需要判斷 failedLocksLimit,因為這里是 0,所以會直接對成功加鎖集合 acquiredLocks 中的所有鎖執(zhí)行鎖釋放,同時清空成功集合,恢復(fù)迭代器。

每次加鎖之后,會更新鎖剩余時間 remainTime,如果 remainTime 小于等于 0 了,則說明加鎖超時,直接返回 false。

這樣就會執(zhí)行外部的 while (true) 邏輯,然后重新再走一遍 RedissonMultiLock#tryLock。

3鎖釋放

看完加鎖邏輯,鎖釋放就更容易理解了。

直接遍歷釋放鎖即可,lock.unlockAsync() 是調(diào)用的 RedissonBaseLock#unlockAsync() 方法。

4總結(jié)

根據(jù)我的理解,畫圖如下:

 

總體而言,就是將 key1、key2、key3 …… keyN 放到一個 List 集合中,然后迭代循環(huán)加鎖,直到所有的都成功。解鎖的時候就是再遍歷鎖進行釋放鎖。

本文轉(zhuǎn)載自微信公眾號「程序員小航」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系程序員小航公眾號。


網(wǎng)頁題目:Redisson分布式鎖源碼之八:MultiLock加鎖與鎖釋放
標(biāo)題鏈接:http://www.5511xx.com/article/dpjecce.html