接上文: Redis 基本命令大全 二(list 、 set、 sorted set)
六 事務(multi、exec、watch、unwatch、discard)
multi
MULTI 命令用於標記一個事務的開始
事務中的多條命令會按照先後順序被放入一個隊列當中,最後由exec命令原子性的執行
exec
EXEC 命令用於執行所有事務塊內的命令
watch
WATCH 命令用於監視一個或多個key ,如果在執行事務之前key被其他命令改動,那麼事務將被打斷
語法:
watch key1 key2 ...
unwatch
UNWATCH 命令用於取消watch對所有key的監視
discard
DISCARD 命令用於取消事務,放棄執行事務內的所有命令
語法:
hset keyName field value
實例:
127.0.0.1:6379[3]> MULTI
OK
127.0.0.1:6379[3]> incr num
QUEUED
127.0.0.1:6379[3]> incr num
QUEUED
127.0.0.1:6379[3]> exec //exec 命令之後開始執行事務中的所有命令,並返回每個命令的返回值
1) (integer) 1 //這裏是執行第一個incr num命令返回的結果
2) (integer) 2 //這裏是執行第二個incr num命令返回的結果
------------------------------------------------------------------------------------
127.0.0.1:6379[3]> multi
OK
127.0.0.1:6379[3]> asdf //在這裏我執行了一個不存在的命令,下面直接報錯了
(error) ERR unknown command `asdf`, with args beginning with:
127.0.0.1:6379[3]> incr num2
QUEUED
127.0.0.1:6379[3]> incr num2
QUEUED
127.0.0.1:6379[3]> exec //exec命令之後返回錯誤,事務中的所有命令都不執行
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379[3]> get num2 //查看num2不存在,說明事務中的兩條incr命令也沒有執行成功
nil
------------------------------------------------------------------------------------
127.0.0.1:6379[3]> MULTI
OK
127.0.0.1:6379[3]> set num3 1.1 //在這裏我們爲num3賦值爲1.1
QUEUED
127.0.0.1:6379[3]> incr num3 //在這裏爲num3做incr命令,我們都知道,浮點數命令只能用incrByfloat這個命令來操作,所以這裏應該返回錯誤。
QUEUED //但這裏並沒有返回錯誤,繼續放入事務隊列中了
127.0.0.1:6379[3]> incr num4
QUEUED
127.0.0.1:6379[3]> incr num4
QUEUED
127.0.0.1:6379[3]> exec //執行事務中的命令
1) OK //這個是執行set num3 1.1 返回的結果
2) (error) ERR value is not an integer or out of range //這裏是執行incr num3返回的錯誤
3) (integer) 1 //這裏是執行incr num4返回的結果
4) (integer) 2 //其他命令正常返回
127.0.0.1:6379[3]> get num4 //事務結束後,num4存在並正確
"2"
------------------------------------------------------------------------------------
127.0.0.1:6379[3]> set name zhangsan
OK
127.0.0.1:6379[3]> watch name //監聽這個name
OK
127.0.0.1:6379[3]> MULTI
OK
127.0.0.1:6379[3]> set age 15
QUEUED
127.0.0.1:6379[3]> set job dev
QUEUED
127.0.0.1:6379[3]> exec
1) OK
2) OK
------------------------------------------------------------------------------------
127.0.0.1:6379[3]> set name1 lisi
OK
127.0.0.1:6379[3]> WATCH name1
OK
127.0.0.1:6379[3]> MULTI
OK
127.0.0.1:6379[3]> set age1 20
QUEUED
127.0.0.1:6379[3]> set job1 docter
QUEUED
127.0.0.1:6379[3]> exec //在沒有執行exec之前,在開啓一個客戶端執行 set name1 wangwu
(nil) //事務沒有執行成功,返回nil
127.0.0.1:6379[3]> get job1 //獲取job1失敗
(nil)
------------------------------------------------------------------------------------
127.0.0.1:6379[3]> multi
OK
127.0.0.1:6379[3]> incr num5
QUEUED
127.0.0.1:6379[3]> incr num5
QUEUED
127.0.0.1:6379[3]> DISCARD //discard 取消事務中所有命令的執行
OK
127.0.0.1:6379[3]> get num5
(nil)
------------------------------------------------------------------------------------