Redis 事務的目的是方便用戶一次執行多個命令。執行 Redis 事務可分為三個階段:
- 開始事務
- 命令入隊
- 執行事務
Redis事務特性
Redis 事務具有兩個重要特性:
1) 單獨的隔離操作
事務中的所有命令都會被序列化,它們將按照順序執行,并且在執行過的程中,不會被其他客戶端發送來的命令打斷。
2) 不保證原子性
在 Redis 的事務中,如果存在命令執行失敗的情況,那么其他命令依然會被執行,不支持事務回滾機制。
注意:Redis 不支持事務回滾,原因在于 Redis 是一款基于內存的存儲系統,其內部結構比較簡單,若支持回滾機制,則讓其變得冗余,并且損耗性能,這與 Redis 簡單、快速的理念不相符合。
Redis事務命令
命令 | 說明 |
---|---|
MULTI | 開啟一個事務 |
EXEC | 執行事務中的所有命令 |
WATCH key [key ...] | 在開啟事務之前用來監視一個或多個key 。如果事務執行時這些 key 被改動過,那么事務將被打斷。 |
DISCARD | 取消事務。 |
UNWATCH | 取消 WATCH 命令對?key 的監控。 |
Redis事務應用
您可以把事務可以理解為一個批量執行 Redis 命令的腳本,但這個操作并非原子性操作,也就是說,如果中間某條命令執行失敗,并不會導致前面已執行命令的回滾,同時不會中斷后續命令的執行(不包含監聽 key 的情況)。示例如下:
開啟事務
127.0.0.1:6379>?MULTI
OK
127.0.0.1:6379>?INCR?1
QUEUED?#命令入隊成功
127.0.0.1:6379>?SET?num?10
QUEUED
#批量執行命令
127.0.0.1:6379>?EXEC
1)?(integer)?1
2)?OK
若在事務開啟之前監聽了某個 key,那么不應該在事務中嘗試修改它,否則會導致事務中斷。
開啟事務之前設置key/value,并監聽
127.0.0.1:6379>?set?www.biancheng.net?hello
OK
127.0.0.1:6379>?WATCH?www.biancheng.net
OK
127.0.0.1:6379>?get?www.biancheng.net
"hello"
#開啟事務
127.0.0.1:6379>?MULTI
OK
#更改key的value值
127.0.0.1:6379>?set?www.biancheng.net?HELLO
QUEUED
127.0.0.1:6379>?GET?www.biancheng.net
QUEUED
#命令執行失敗
127.0.0.1:6379>?EXEC
(error)?EXECABORT?Transaction?discarded?because?of?previous?errors.
#取消監聽key
127.0.0.1:6379>?UNWATCH?
OK??