redis 事務

Redis 事務

redis 事務是一組指令的集合。

redis 事務主要由multi, exec, discard, watch 命令組成。事務允許一組操作命令,一鍵執行;redis事務執行有兩個重要保證。

  1. 事務中所有的命令都被序列化然後順序執行。如果另外一個客戶端發起一個請求,也不會穿插到redis事務執行命令中。redis事務是被獨立被執行的。

  2. redis事務保證所有的命令要麼都執行,要麼都不執行,所以說redis事務是原子操作。Exec命令就是觸發了事務去執行;當一個客戶端開啓事務後,exec命令執行前就與服務器斷開連接,任何操作都不會執行,redis服務器會清空消息隊列,相反斷開前執行了exec命令,所有的操作都會執行。 當開啓AOF 日誌備份時,redis會調用系統write操作將事務寫到硬盤上, 然而如果redis服務器崩潰,或者被系統管理員強制終止了,redis很有可能只有一部分操作被寫到硬盤。redis 拒絕以這種方式啓動,將會以報錯的方式退出; 通過使用AOF檢測工作可以定位到AOF文件,並將部分事務操作刪除,就可以正常啓動.

使用

multi命令是進入reids 事務的爲唯一方式。 執行multi命令的返回值總是”OK”.
當進入redis事務,用戶可以發佈多條redis命令,redis服務器收到這些命令,不會立即執行它們,而是將它們排隊.所有的緩存排隊的命令都是通過調用exec 命令一次性執行的。

調用discard 可以將客戶端事務清空,並且退出事務。

Exec 將返回一組應答,每一個應答對應事務中一個請求結果。

當redis一個連接中開啓了事務請求,所有的指令將會以QUEUED 狀態字符返回。排隊的指令在調用exec命令後才安排執行.

總結:

1.multi :開啓redis 事務

2.exec : 提交事務請求,並退出事務

3.discard: 取消事務中的命名請求,並退出事務。

事務中錯誤

在redis 事務中,有可能引發兩種錯誤:

1. 在執行exec命令之前的錯誤,命令緩存失敗。例如:語法錯誤,未知命令,錯誤數值,或者邊界過界,內存溢出等。

2. 調用exec後,redis服務器執行指令的錯誤,例如使用錯誤的值進行操作。

redis客戶端只能檢測出第一種錯誤,發生在exec命令之前的錯誤, 通過檢測返回的指令,正常返回“QUEUED”,其他返回的都是錯誤。發生錯誤後,redis自動丟棄事務中的名了,但不會退出事務;在exec之前的任何命令都將丟棄。

對於第二種錯誤,是redis服務器運行錯誤,事務中有一個命令執行錯誤,不會影響其他命令的執行。

redis 事務中沒有回滾

如果你使用過關係型數據庫,看到redis 開啓一個事務中,發生錯誤後,不會回滾數據,會感到奇怪; 正因爲這樣redis保持內部的簡介和快速。

watch 命令

watch 命令在事務中提供了一種CAS行爲。watch 可以監聽多個鍵,一旦其中一個鍵被修改或者刪除,之後的事務都將不會執行。監控持續到exec的執行。它可以用在具有競爭的環境下; 例如:兩個客戶端都試圖修改一個鍵的值10, 都試圖自增到11,最後提交後的結果就是11q,而不是12,所以watch命令可以很好的處理這種問題。

當開啓watch後,有另外更改了監聽的鍵,自身開啓的事務修改就會失敗,我們可以監聽到返回結果,然後重複操作,直到成功。就像java中的樂觀鎖,也是基於CAS機制。

參考文獻:http://redis.io/topics/transactions

發佈了49 篇原創文章 · 獲贊 13 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章