核心資料協調

分散式鎖

確保同一時間只有一個工作者執行某項工作,鎖會自行到期,並由持有者安全地釋放。

個指令取得鎖
1
個指令安全釋放
1
個 Lua 腳本
0
步驟 1 / 5
工作者 A 取得鎖

NX 只有在沒有人持有時才取得。PX 30000 讓鎖在 A 停止運作時於 30 秒後到期。

範例工作階段playing
# 工作者 A 取得鎖
hotkv> SET lock:billing-run tok-a81f NX PX 30000
OK

以真實 HotKV 指令與範例回覆呈現的動畫導覽。點擊任一步驟即可跳到該步驟。 指令與回覆維持英文,與您在 HotKV 中輸入及看到的完全一致。

問題

跨多台機器的 cron 工作、付款請款與快取重建,絕不能同時執行兩次。沒有到期時間的鎖,在持有者當機時會被永遠持有,而以單純的 DEL 釋放鎖,可能在您的鎖已到期之後,刪掉別人的鎖。

HotKV 如何處理

SET 搭配 NX 與 PX 只有在沒有人持有時才取得鎖,並為它設定到期時間,讓當機的持有者無法永遠占著。每位持有者以隨機權杖作為值儲存。DELEX 搭配 IFEQ 只有在鎖仍持有您的權杖時才會刪除,這就是過去需要 Lua 腳本才能做到的安全釋放。

逐步說明

逐個指令看看發生了什麼事

  1. 01

    工作者 A 取得鎖

    NX 只有在沒有人持有時才取得。PX 30000 讓鎖在 A 停止運作時於 30 秒後到期。

    SET lock:billing-run tok-a81f NX PX 30000
  2. 02

    工作者 B 被擋下

    鎖已被持有,所以 B 得到 nil,並略過這次執行。

    SET lock:billing-run tok-b22c NX PX 30000
  3. 03

    A 執行工作

    只有一個工作者執行帳單作業。

    PTTL lock:billing-run
  4. 04

    只釋放自己的鎖

    DELEX 只有在值仍是 A 的權杖時才會刪除鍵。

    DELEX lock:billing-run IFEQ tok-a81f
  5. 05

    權杖不符則什麼都不做

    如果 A 太慢,而 B 現在持有這把鎖,A 的釋放動作不會動到 B 的鎖。

    DELEX lock:billing-run IFEQ tok-stale
適用之處

真實世界的情境

排程工作

每個執行個體上都執行同一個 cron,而鎖確保其中只有一個真正執行工作。

付款

同一筆訂單的請款與退款操作會被序列化,因此絕不會重疊。

防止快取雪崩

只有一個請求重建昂貴的快取項目,其他請求則等待或提供過期的值。

內建

您能獲得什麼

取得時附帶到期時間

SET NX PX 只有在鎖空閒時才取得,並附帶逾時。

SETNXPX

安全釋放

DELEX IFEQ 只有在值與您的權杖相符時才刪除。

DELEX

工作期間延長

檢查剩餘時間,並為長時間的工作延長。

PTTLPEXPIRE

以摘要比對

對於較大的值,DELEX IFDEQ 比對的是摘要,而不是完整的值。

DIGESTIFDEQ

常見問題

為什麼不直接 DEL 這把鎖?

如果您的鎖已到期,而另一個工作者拿到了它,單純的 DEL 會刪掉他們的鎖。DELEX IFEQ 只有在鎖仍持有您的權杖時才會刪除。

到期時間該設多長?

比工作通常需要的時間更長。對於長時間的工作,請在仍持有鎖的期間定期延長到期時間。

安全釋放需要 Lua 嗎?

不需要。DELEX 以一個指令完成比對與刪除。

相關使用情境

在您自己的工作負載上試試看

HotKV 支援 Redis 協定,因此您可以將現有的用戶端指向它,並執行這些相同的指令。