網頁

2024/5/7

Redis 交易的樂觀鎖 transaction optimistic locking

Redis的Transaction(交易/事務)可將多個命令視為一個動作執行,並透過check-and-set(CAS)來實現樂觀鎖(optimistic locking)。


Redis的交易範圍始於MULTI、終於EXEC,而在範圍內的多個命令會依序列一次執行。

MULTI
command1
command2
..
EXEC

例如下面在一次交易中執行了兩個SET命令。

redis> MULTI
OK
redis(TX)> SET foo 1
QUEUED
redis(TX)> SET bar 1
QUEUED
redis(TX)>EXEC
1) OK
2) OK

而Redis提供一個WATCH命令來實現樂觀鎖,參數為要監看的key,如果監看的key在交易期間被異動過,例如被另一個程序修改,則執行EXEC時交易不會被執行並回傳nil。

例如開啟兩個redis-cli(redis1, redis2)進行以下操作來觀察樂觀鎖的效果。先在redis1執行以下命令,使用WATCH監看兩個key 'foo', 'bar',然後使用MULTI開始交易,在交易中設定foo、bar的值。

redis1

redis> WATCH foo bar
OK
redis1> MULTI
OK
redis1(TX)> SET foo 1
QUEUED
redis1(TX)> SET bar 1
QUEUED

然後在redis2執行以下命令,即在redis1的EXEC執行前,即交易結束前,對foo的值進行異動。

redis2

redis2> SET foo 2
OK

接著回到redis1執行EXEC完成交易;由於在交易過程中WATCH監看的foo在redis2被異動了,所以交易未被執行。

redis1

redis1(TX)> EXEC
(nil)
redis1> GET foo
"2"
redis1> GET bar
(nil)

EXEC被調用後,原本被WATCH監看的key就不被監看了;或是用UNWATCH命令也可取消監看所有被監看的key。

沒有留言:

張貼留言