redis事務

MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事務的基礎。html

discard命令和 multi命令一塊兒使用 redis

127.0.0.1:6379> discard
(error) ERR DISCARD without MULTI

WATCH命令監控bash

WATCH 使得 EXEC 命令須要有條件地執行: 事務只能在全部被監視鍵都沒有被修改的前提下執行, 若是這個前提不能知足的話,事務就不會被執行。服務器

WATCH 命令能夠被調用屢次。 對鍵的監視從 WATCH 執行以後開始生效, 直到調用 EXEC 爲止。spa

當 EXEC 被調用時, 無論事務是否成功執行, 對全部鍵的監視都會被取消。code

另外, 當客戶端斷開鏈接時, 該客戶端對鍵的監視也會被取消。htm

使用無參數的 UNWATCH 命令能夠手動取消對全部鍵的監視。對於一些須要改動多個鍵的事務, 有時候程序須要同時對多個鍵進行加鎖, 而後檢查這些鍵的當前值是否符合程序的要求。 當值達不到要求時, 就可使用 UNWATCH 命令來取消目前對鍵的監視, 中途放棄這個事務, 並等待事務的下次嘗試。事務

WATCH命令提供的CAS機制,在被watch的鍵被修改後,執行事務失敗ip

WATCH 命令能夠爲 Redis 事務提供 check-and-set (CAS)行爲。get

多客戶端同時對tkey進行事務監控,當watch鍵命令後,鍵存在被修改的操做,則事務放棄執行

# 事務操做一
127.0.0.1:6379> watch tkey
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set tkey 2
QUEUED
127.0.0.1:6379> exec
(nil)

# 事務操做二
127.0.0.1:6379> watch tkey
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set tkey 1
QUEUED
127.0.0.1:6379> exec
(nil)

執行unwatch取消對全部鍵的監控,事務放棄執行

# 事務操做一
127.0.0.1:6379> watch tkey
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set tkey 100
QUEUED
127.0.0.1:6379> unwatch
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get tkey
"10"

# 事務操做二
127.0.0.1:6379> watch tkey
OK
127.0.0.1:6379> set tkey 10
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set tkey 20
QUEUED
127.0.0.1:6379> exec
(nil)

事務執行的原子性

事務是一個單獨的隔離操做:事務中的全部命令都會序列化、按順序地執行。事務在執行的過程當中,不會被其餘客戶端發送來的命令請求所打斷。 

事務是一個原子操做:事務中的命令要麼所有被執行,要麼所有都不執行。

當使用 AOF 方式作持久化的時候, Redis 會使用單個 write(2) 命令將事務寫入到磁盤中。然而,若是 Redis 服務器由於某些緣由被管理員殺死,或者趕上某種硬件故障,那麼可能只有部分事務命令會被成功寫入到磁盤中。

若是 Redis 在從新啓動時發現 AOF 文件出了這樣的問題,那麼它會退出,並彙報一個錯誤。

  • 使用 redis-check-aof 程序能夠修復這一問題:它會移除 AOF 文件中不完整事務的信息,確保服務器能夠順利啓動。

事務發生錯誤redis處理狀況

對於發生在 EXEC 執行以前的錯誤,客戶端之前的作法是檢查命令入隊所得的返回值:若是命令入隊時返回 QUEUED ,那麼入隊成功;不然,就是入隊失敗。若是有命令在入隊時失敗,那麼大部分客戶端都會中止並取消這個事務。

不過,從 Redis 2.6.5 開始,服務器會對命令入隊失敗的狀況進行記錄,並在客戶端調用 EXEC 命令時,拒絕執行並自動放棄這個事務。

在 Redis 2.6.5 之前, Redis 只執行事務中那些入隊成功的命令,而忽略那些入隊失敗的命令。 而新的處理方式則使得在流水線(pipeline)中包含事務變得簡單,由於發送事務和讀取事務的回覆都只須要和服務器進行一次通信。

至於那些在 EXEC 命令執行以後所產生的錯誤, 並無對它們進行特別處理: 即便事務中有某個/某些命令在執行時產生了錯誤, 事務中的其餘命令仍然會繼續執行。

 redis提供的腳本實現方式相對於事務方式要更簡單和快速

從定義上來講, Redis 中的腳本自己就是一種事務, 因此任何在事務裏能夠完成的事, 在腳本里面也能完成。 而且通常來講, 使用腳本要來得更簡單,而且速度更快。

 

參考資料:

http://redisdoc.com/topic/transaction.html

相關文章
相關標籤/搜索