Redis 事務

事務:
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> sadd "user:1:state" 1
QUEUED
127.0.0.1:6379> SADD "user:2:state" 2
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 1
2) (integer) 1

由MULTI發起事務,後面的sadd命令來實現關注和被關注的操作,redis並沒有執行這些命令,而是返回QUEUED表示這兩條命令已經進入等待執行的事務隊列中。
當exec之後告訴redis將等待的食物隊列中的所有命令按照發送順序依次執行。exec的返回值順序和命令的順序相同。


1.語法錯誤:
語法錯誤指命令不存在或者命令的參數個數不對,如下:
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set name Mike
QUEUED
127.0.0.1:6379> errorcommand name
(error) ERR unknown command 'errorcommand'
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
由於存在不正確的命令,redis直接返回錯誤把整個事務discard了。它連語法正確的都不會執行,如下:
127.0.0.1:6379> MGET name
1) (nil)


2.運行錯誤:運行錯誤是命令執行時出現的錯誤,比如使用了錯誤命令操作數據類型。
這種錯誤redis會繼續執行,redis無法發現錯誤。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set name hello
QUEUED
127.0.0.1:6379> SADD name 3
QUEUED
127.0.0.1:6379> SET name "abc"
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 name
"abc"

這種錯誤只能依賴程序員去把握與檢查錯誤。


WATCH命令:監控一個或多個鍵,一但其中某個鍵值被修改,之後的事務就不會執行。監控會一直持續到exec命令。
127.0.0.1:6379> SET key 1
OK
127.0.0.1:6379> WATCH key
OK
127.0.0.1:6379> SET key 2
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET key 3
QUEUED
127.0.0.1:6379> EXEC
(nil)    // 返回nil,說明監視的ticket已經改變了,事務就取消了.
127.0.0.1:6379> GET key
"2"

發佈/訂閱 分別發佈者和訂閱者,訂閱者可以訂閱一個或者若干個頻道,而發佈者可以向指定的頻道發佈消息。所有訂閱此頻道的訂閱者都會受到此消息
發佈消息:
127.0.0.1:6379> PUBLISH newsChannel "good morning news report"
(integer) 0
暫時沒有訂閱者返回爲0

訂閱消息:
127.0.0.1:6379> SUBSCRIBE newsChannel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"    //subscribe 表示訂閱成功的反饋。第二個值是成功訂閱的頻道名,第三個值是當前客戶端訂閱的頻道數量。
如果是message 這個類型回覆是我們關心的,表示接收到的消息,第二個值表示產生消息的頻道名稱。第三個值是消息的內容。
unsubscribe 取消訂閱某個頻道,第二個值是對應的頻道名稱,第三個值是當前客戶端訂閱的頻道數量。
2) "newsChannel"
3) (integer) 1
利用publish 再次發佈消息:
127.0.0.1:6379> PUBLISH newsChannel "News 2"
(integer) 1
訂閱頻道:
127.0.0.1:6379> SUBSCRIBE newsChannel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "newsChannel"
3) (integer) 1
^[[A1) "message"
2) "newsChannel"
3) "News 2"
可以按照正則表達式訂閱多個頻道:
127.0.0.1:6379> PSUBSCRIBE news*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news*"
3) (integer) 1

PSUBSCRIBE去訂閱以news開頭任意字符結尾的頻道.
127.0.0.1:6379> PSUBSCRIBE news*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news*"
3) (integer) 1
1) "pmessage"
2) "news*"
3) "newsChannel"
4) "News 3"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章