Redis事務
redis是NOSQL數據庫,所以也存務,只是在事此事務和關系型數據庫的事務是有區別的。
事務實例
MULTI 命令
在執行 MULTI 命令之后,此時將進入阻塞狀態。當我們繼續發送命令時,命令不會立即執行,而是會排隊等待。直到輸入 EXEC 命令執行,隊列中的命令才會一一執行
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 111
QUEUED
127.0.0.1:6379> set k2 222
QUEUED
127.0.0.1:6379> set k3 333
QUEUED
127.0.0.1:6379> set k4 444
QUEUED
127.0.0.1:6379> get k3
QUEUED
EXEC 命令
127.0.0.1:6379> EXEC
1) OK
2) OK
3) OK
4) OK
5) "333"
事務異常
1. 進入隊列之前發生錯誤
一般都是命令出現錯誤。Redis 會將進入隊列失敗的事件進行記錄,在執行 EXEC
命令提交事務的時候,不會執行並且會放棄這一條事務。
輸入命令
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name zhang
QUEUED
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> set sex nan haha #故意寫錯
QUEUED
127.0.0.1:6379> set address beijing
QUEUED
執行結果
127.0.0.1:6379> exec
1) OK
2) OK
3) (error) ERR syntax error
4) OK
查詢數據
127.0.0.1:6379> keys *
1) "address"
2) "name"
3) "age"
127.0.0.1:6379> get name
"zhang"
127.0.0.1:6379> get sex
(nil)
Redis 是沒有回滾操作的
Redis 命令只會因為錯誤的語法而失敗(並且這些問題不能在入隊時發現),或是命令用在了錯誤類型的鍵上面:這也就是說,從實用性的角度來說,失敗的命令是由編程錯誤造成的,而這些錯誤應該在開發的過程中被發現,而不應該出現在生產環境中。
因為不需要對回滾進行支持,所以 Redis 的內部可以保持簡單且快速
Watch 命令
watch 命令可以監控一個或多個鍵,一旦有其中一個鍵被修改(被刪除),后面的事務就不會執行了。監控一直持續到 EXEC 命令(事務中的命令是在exec之后才執行的,所以在multi命令后可以修改watch監控的鍵值)
假設我們通過watch命令在事務執行之前監控了多個Keys,倘若在watch之后有任何Key的值發生了變化,exec命令執行的事務都將被放棄,同時返回Null multi-bulk應答以通知調用者事務執行失敗。
執行 watch 命令,不執行 MULTI、exec
這里可以看到保存到數據數據庫的 name = zhang
被修改成了 name = li
127.0.0.1:6379> set name zhang
OK
127.0.0.1:6379> WATCH name
OK
127.0.0.1:6379> set name li
OK
127.0.0.1:6379> get name
"li"
執行 watch 命令,通知執行 MULTI、exec
使用 watch
監聽 age
,在再執行 MULTI
命令,在執行 exec
之前 age
有任何改變,都不會執行此事務
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> WATCH age
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set age 21
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get age
"18"
127.0.0.1:6379>
exec
執行之后,會自動執行 UNWatch
命令,撤銷監聽操作
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> WATCH age
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set age 21
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> get age
"20"
UnWatch 命令
此命令表示撤銷監聽
下面的操作測試可以看到,取消監聽后,exec
提交事務后,address
被修改了
127.0.0.1:6379> set address beijing
OK
127.0.0.1:6379> WATCH address
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> UNWATCH
QUEUED
127.0.0.1:6379> set address nanchang
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
127.0.0.1:6379> get address
"nanchang"