【Redis】Redis 事務

Redis 事務介紹

  Redis 事務能夠一次執行多個命令, 而且帶有如下三個重要的保證:java

  • 批量操做在發送 EXEC 命令前被放入隊列緩存。
  • 收到 EXEC 命令後進入事務執行,事務中任意命令執行失敗,其他的命令依然被執行。
  • 在事務執行過程,其餘客戶端提交的命令請求不會插入到事務執行命令序列中。

  一個事務從開始到執行會經歷如下三個階段:redis

  • 開始事務。
  • 命令入隊。
  • 執行事務。

實例

  如下是一個事務的例子, 它先以 MULTI 開始一個事務, 而後將多個命令入隊到事務中, 最後由 EXEC 命令觸發事務, 一併執行事務中的全部命令:緩存

 1 127.0.0.1:6379> MULTI
 2 OK
 3 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
 4 QUEUED
 5 127.0.0.1:6379> GET book-name
 6 QUEUED
 7 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
 8 QUEUED
 9 127.0.0.1:6379> SMEMBERS tag
10 QUEUED
11 127.0.0.1:6379> EXEC
12 1) OK
13 2) "Mastering C++ in 21 days"
14 3) (integer) 3
15 4) 1) "Mastering Series"
16    2) "Programming"
17    3) "C++"

  a、單個 Redis 命令的執行是原子性的,但 Redis 沒有在事務上增長任何維持原子性的機制,因此 Redis 事務的執行並非原子性的。atom

  事務能夠理解爲一個打包的批量執行腳本,但批量指令並不是原子化的操做,中間某條指令的失敗(相似於java的1/0的運行時異常)不會致使前面已作指令的回滾,也不會形成後續的指令不作。spa

  這是官網上的說明 From redis docs on transactions:code

It's important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.

  好比:blog

 1 127.0.0.1:6379> multi
 2 OK
 3 127.0.0.1:6379> set a aaa
 4 QUEUED
 5 127.0.0.1:6379> incr a
 6 QUEUED
 7 127.0.0.1:6379> set b bbb
 8 QUEUED
 9 127.0.0.1:6379> exec
10 1) OK
11 2) (error) ERR value is not an integer or out of range
12 3) OK
13 127.0.0.1:6379> get a 
14 "aaa"
15 127.0.0.1:6379> get b
16 "bbb"

  若是在 incr a 處失敗,set a 已成功不會回滾,set b 還會繼續執行。隊列

  b、若在事務隊列中存在命令性錯誤(相似於java編譯性錯誤),則執行EXEC命令時,全部命令都不會執行事務

 1 127.0.0.1:6379> multi
 2 OK
 3 127.0.0.1:6379> set a aaa
 4 QUEUED
 5 127.0.0.1:6379> sett b bbb
 6 (error) ERR unknown command `sett`, with args beginning with: `b`, `bbb`, 
 7 127.0.0.1:6379> set c ccc
 8 QUEUED
 9 127.0.0.1:6379> exec
10 (error) EXECABORT Transaction discarded because of previous errors.
11 127.0.0.1:6379> get a
12 (nil)

Redis 事務命令

  一、Redis Discard 命令用於取消事務,放棄執行事務塊內的全部命令。get

    語法:DISCARD

1 redis 127.0.0.1:6379> MULTI
2 OK
3 redis 127.0.0.1:6379> PING
4 QUEUED
5 redis 127.0.0.1:6379> SET greeting "hello"
6 QUEUED
7 redis 127.0.0.1:6379> DISCARD
8 OK

  二、Redis Exec 命令用於執行全部事務塊內的命令。

    語法:Exec

    用法如上實例

  三、Redis Multi 命令用於標記一個事務塊的開始。

    事務塊內的多條命令會按照前後順序被放進一個隊列當中,最後由 EXEC 命令原子性(atomic)地執行。

    語法:Multi

    用法如上實例

  四、Redis Unwatch 命令用於取消 WATCH 命令對全部 key 的監視。

    語法:UNWATCH 

1 127.0.0.1:6379> WATCH lock lock_times
2 OK
3 127.0.0.1:6379> UNWATCH
4 OK

  五、Redis Watch 命令用於監視一個(或多個) key ,若是在事務執行以前這個(或這些) key 被其餘命令所改動,那麼事務將被打斷

    語法:WATCH key [key ...]

1 127.0.0.1:6379> WATCH lock lock_times
2 OK
相關文章
相關標籤/搜索