0%

Redis (四) - Transaction

Redis Transaction 可以一次執行多條命令,並且具有以下規範以保證執行無誤。

  • 批次的操作在傳送 EXEC 命令前會被放在 Queue
  • 收到 EXEC 命令後就會開始執行 Transaction,Transaction 中的命令若有失敗則不影響其他命令繼續執行,也就是說 Redis Transaction 不保證操作原子性。
  • 在 Transaction 執行過程中,其他客戶端提交的命令不會插入到 Transaction 的命令列中。

Transaction 的多條命令是被一次性的發送給伺服器而不是一條一條的傳送,這樣的方式可以減少客戶端與伺服器之間的網路通訊次數以提升效能。

下面我們就開始介紹實作 Transaction 的指令和方法。

Transaction 指令

Multi

Multi 是用來標記 Transaction 的開始。

1
127.0.0.1:6379> multi

Exec

Exec 是用來執行 Transaction。

1
127.0.0.1:6379> exec

範例 :

1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set tk1 tv1
QUEUED
127.0.0.1:6379> set tk2 tv2
QUEUED
127.0.0.1:6379> set tk3 tv3
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK

Discard

Discard 用於取消 Transaction。

1
127.0.0.1:6379> discard

範例 :

1
2
3
4
5
6
127.0.0.1:6379> set tk1 tv1
QUEUED
127.0.0.1:6379> set tk2 tv2
QUEUED
127.0.0.1:6379> discard
OK

Watch

Watch 用於監視一個或多個 Key,若 Key 已經放進 Transaction Queue 且還未執行時被其他命令改動,則 Transaction 會被中斷。

1
127.0.0.1:6379> watch <key1> <key2> ...

範例 :
先對 key 進行監視。

1
2
3
4
5
6
127.0.0.1:6379> watch tk1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set tk1 5
QUEUED

在此時另外開一個 terminal 並且連線到 Redis。接著將 被監視的 key 進行修改。

1
2
127.0.0.1:6379> set tk1 20
OK

再回到原本的 terminal 完成 Transaction 並輸入 exec,可以發現回傳 nil,代表 Transaction 被中斷失敗了。

1
2
3
4
127.0.0.1:6379> set tk2 10
QUEUED
127.0.0.1:6379> exec
(nil)

Unwatch

Unwatch 用於解除對所有的 Key 的監視。

1
127.0.0.1:6379> unwatch

Summary

這一篇介紹了 Redis Transaction,若命令很多可以使用 Transaction 來減少和伺服器間的網路通訊以提升效能。

下一篇將要介紹如何管理 Redis Server。

參考

[1] Redis 事務
[2] Redis Transaction