Redis 事務能夠一次執行多個命令, 而且帶有如下三個重要的保證:java
一個事務從開始到執行會經歷如下三個階段: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 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