前言
Redisson 除了提供了分散式鎖之外,還額外提供了同步元件,Semaphore 和 CountDownLatch。
Semaphore
意思就是在分散式場景下,只有 3 個憑證,也就意味著同時只會有三個執行緒執行業務。
設定憑證
引數列表:
- KEYS[1]:指定的 key 這裡叫 semaphore
- KEYS[2]:redisson_sc:{semaphore}
- ARGV[1]:憑證數 3
這塊 lua 指令碼相對簡單,直接設定一個 key 的 value 為 3。
獲取憑證
引數列表:
- KEYS[1]:指定的 key 這裡叫 semaphore
- ARGV[1]:要獲取的憑證數,預設 1
這段 lua 指令碼就是:
- 獲取 key semaphore 的值
- 如果值大於等於 1(要獲取的憑證數),對值進行遞減
- 成功返回 1,失敗返回 0
如果成功獲取憑證,直接返回,沒有獲取到憑證,則自旋等待。
釋放憑證
釋放憑證直接對 Redis key 的值進行自增即可。
CountDownLatch
輸出內容如下:
原始碼分析
設定門閂數量
這塊都大同小異。
減少門閂數量
就是對這個值進行遞減。
而 latch.await()
就是自旋獲取門閂的值,直到為 0 了,然後繼續往下執行。
總結
Redisson 實現分散式的 Semaphore 和 CountDownLatch 基本內容就是如此,僅僅通過在 Redis 維護一個公共的變數,然後進行原子更新即可。