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。
沒有留言:
張貼留言