1. 程式人生 > >Redis自學筆記:4.1進階-事務

Redis自學筆記:4.1進階-事務

第4章:進階

4.1事務

4.1.1概述

redis中的事務是一組命令的集合
事務同命令一樣都是redis的最小執行單位,一個事務中的命令要麼都執行,
要麼都不執行

事務的原理是先將一個事務的命令傳送給redis,然後再讓redis依次執行
這些命令,例如:

127.0.0.1:6379> multi 
OK
127.0.0.1:6379> sadd 'user:1:following' 2
QUEUED
127.0.0.1:6379> sadd 'user:2:following' 1
QUEUED
127.0.0.1:6379> exec
1
1

事務的使用方式:

  1. 首先使用 multi 命令,宣告下面的命令屬於同一個事務
  2. 傳送操作命令.redis不會執行命令,而是把它們暫存起來.
    返回值 queued 表示這兩條命令已進入等待執行事務的佇列.
  3. 最後使用 exec 命令結束暫存命令,同時redis將事務佇列中的
    所有命令按照發送順序依次執行. exec 返回值是暫存命令執
    行的返回值組成的列表,返回順序和命令順序相同.

redis保證一個事務中的所有命令要麼都執行,要麼都不執行.如果在發
送exec命令前客戶端斷線,redis會清空事務佇列.一旦傳送了redis命令,
所有命令就會被執行,即使客戶端斷線也沒有關係.

redis的事務還能保證一個事務內的命令依次執行而不被其他命令插入.
4.1.2錯誤處理

導致事務執行出錯的原因:

  1. 語法錯誤.
    命令不存在或者命令引數的個數不對.
    127.0.0.1:6379> multi OK 127.0.0.1:6379> set foo 1 QUEUED 127.0.0.1:6379> set foo ERR wrong number of arguments for 'set' command 127.0.0.1:6379> errorcommand foo ERR unknown command 'errorcommand' 127.0.0.1:6379> exec EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379> keys *
    • 事務中的命令都沒有執行
  2. 執行錯誤
    命令執行時出現的錯誤.比如使用雜湊型別的命令操作集合型別的鍵,這
    種錯誤在實際執行之前redis是無法發現的.如果事務裡一條命令出現了
    執行錯誤,事務裡其他的命令依然會執行(包括出錯命令之後的命令).
    127.0.0.1:6379> multi OK 127.0.0.1:6379> set foo 1 QUEUED 127.0.0.1:6379> sadd foo 2 QUEUED 127.0.0.1:6379> set foo 3 QUEUED 127.0.0.1:6379> exec OK WRONGTYPE Operation against a key holding the wrong kind of value OK 127.0.0.1:6379> keys * foo 127.0.0.1:6379> get foo 3
    redis的事務沒有關係資料庫提供的回滾(rollback)功能.也使得redis在事務
    上可以保持簡潔和快速.

    4.1.3 watch命令介紹

    watch命令可以監控一個或多個鍵,一旦其中有一個鍵被修改(或刪除),之後的
    事務就不會執行。監控一直持續到exec命令(事務中的命令是在exec之後才執行
    的,所以在multi命令後可以修改watch監控的鍵值)
127.0.0.1:6379> set qux 1
OK
127.0.0.1:6379> watch qux
OK
127.0.0.1:6379> set qux 2
OK
127.0.0.1:6379> get qux
2
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set qux 3
QUEUED
127.0.0.1:6379> exec
127.0.0.1:6379> get qux
2
127.0.0.1:6379> set thud 1
OK
127.0.0.1:6379> watch thud
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set thud 2
QUEUED
127.0.0.1:6379> exec
OK
127.0.0.1:6379> get thud
2

由於watch命令的作用只是當被監控的鍵值被修改後阻止之後一個事務的執行,而
不能保證其他客戶端不修改這一鍵值,所以在一般的情況下我們需要在exec執行失
敗後重新執行整個函式。

執行exec命令後會取消對所有鍵的監控,如果不想執行事務中的命令也可以使用
unwatch命令來取消監控。