Redis事物
redis中的事物(transaction)是一組命令的集合洼畅。事物同命令都是redis的最小執(zhí)行單位盔粹。一個事物中的命令要么都被執(zhí)行要么都不被執(zhí)行荚板。事物的應用最常見的例子就是轉賬刀诬,A出賬究抓,B入賬蜘欲,要么全執(zhí)行益眉,要么都不被執(zhí)行。
事物的原理是先將屬于一個事物的命令發(fā)送給redis,然后再讓redis依次執(zhí)行這些命令郭脂。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SADD setA -1 0
QUEUED
127.0.0.1:6379> SADD setB 5 6
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 2
2) (integer) 2
127.0.0.1:6379> SMEMBERS setA
1) "-1"
2) "0"
3) "1"
4) "2"
5) "3"
127.0.0.1:6379> SMEMBERS setB
1) "2"
2) "3"
3) "4"
4) "5"
5) "6"
首先年碘,使用MULTI命令告訴redis,接下來的數(shù)條命令屬于同一個事物展鸡。redis會將這幾條命令暫時緩存起來屿衅,并返回OK。接下來輸入命令莹弊,redis會返回QUEUE表示已將命令放到緩存隊列中涤久。當把所有要執(zhí)行的命令發(fā)送給redis之后,使用EXEC命令告訴Redis將等待執(zhí)行的事物隊列中的全部命令按照順序執(zhí)行忍弛。
Redis保證了一個事務中要么都執(zhí)行响迂,要么都不執(zhí)行。如果在發(fā)送EXEC命令之前客戶端斷線了细疚,那么Redis會清空事物隊列蔗彤,事務中所有的命令都不會執(zhí)行。Redis事物還能保證一個事務內命令依次執(zhí)行而不被其他的命令插入疯兼。
錯誤處理
語法錯誤
語法錯誤指命令錯誤或者命令不存在幕与。
只要有一個命令有語法錯誤,執(zhí)行EXEC命令后Redis就會直接返回錯誤镇防,連正確的命令也不會被執(zhí)行啦鸣。
運行錯誤
運行錯誤指在命令執(zhí)行時出現(xiàn)的錯誤,比如使用散列類型的命令操作集合類型的key来氧。這種錯誤在實際執(zhí)行之前redis是不會發(fā)現(xiàn)的诫给,所以在事物里這樣的命令是會被redis接受并執(zhí)行的。
如果事務里有一條命令出現(xiàn)了錯誤啦扬,事務里其他的命令依然會被執(zhí)行(包括出錯命令之后的命令)中狂。
++redis的事務并沒有關系數(shù)據(jù)庫提供的rollback功能,為此務必避免運行錯誤扑毡。++
WATCH 命令介紹
WATCH命令可以監(jiān)控一個或者多個鍵胃榕,一旦其中有一個鍵被修改(或刪除),之后的事務就不會執(zhí)行瞄摊。
127.0.0.1:6379> watch key
OK
127.0.0.1:6379> set key 2
OK
127.0.0.1:6379> set hi 3
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set hi 2 //不會被執(zhí)行
QUEUED
127.0.0.1:6379> set key 3 //不會被執(zhí)行
QUEUED
127.0.0.1:6379> set hi 4 // 不會被執(zhí)行
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get key
"2"
127.0.0.1:6379> get hi
"3"