之前在某個公眾號下看到老錢的一篇文章,題目是《十個常見的Redis面試“刁難”問題》,感覺寫的很好,不過里面的解答對于我這種小白來說并不是很全面,所以在這里實際操作、思考一番,并把自己的所得簡單記錄下來。
原文參考:https://mp.weixin.qq.com/s/Z4a8wbWvPDGFTkKJH0X9VQ
Redis的事務了解嗎?
MULTI,EXEC操作:事務的開始和結束標記
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 1
QUEUED
127.0.0.1:6379> set k2 1
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
127.0.0.1:6379> get k1
"1"
127.0.0.1:6379> get k2
"1"
127.0.0.1:6379>
執(zhí)行Multi命令,redis反饋ok表示開始事務;執(zhí)行EXEC命令,結束事務,開始順序執(zhí)行事務中的操作。
錯誤處理
語法錯誤:執(zhí)行命令不存在或參數(shù)不對,都是語法錯誤,只有事務中有一處錯誤,redis執(zhí)行exec命令后,會直接返回錯誤,正確的命令也不會被執(zhí)行。 — 下面例子是輸錯命令了,所以全部都不執(zhí)行
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name zhangsan
QUEUED
127.0.0.1:6379> set sex nan
QUEUED
127.0.0.1:6379> ssas aget 1
(error) ERR unknown command 'ssas'
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379>
運行錯誤:此類錯誤執(zhí)行命令沒錯,但是操作對應的鍵有誤,會造成運行時才會發(fā)現(xiàn)的錯誤,但是不影響其它正確命令的執(zhí)行。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k 10
QUEUED
127.0.0.1:6379> sadd k 20
QUEUED
127.0.0.1:6379> set k 200
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
127.0.0.1:6379> get k
"200"
127.0.0.1:6379>
這種運行時錯誤,可以看到,不影響整體的執(zhí)行
WATCH命令
監(jiān)控指定鍵,若被監(jiān)控的鍵在以下事務執(zhí)行前被修改,則包含對此鍵有操作動作的事務不執(zhí)行,返回nil。
127.0.0.1:6379> set k 30
OK
127.0.0.1:6379> get k
"30"
127.0.0.1:6379>
127.0.0.1:6379> watch k
OK
127.0.0.1:6379> set k 40
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k 50
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get k
"40"
127.0.0.1:6379>
可以看到,如果watch的key在事務執(zhí)行前被修改了,事務就不會執(zhí)行,exec返回的是nil,key對應的value也不修改,依然是事務之外設置的值。