你真的懂Redis事務嗎?

MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事務的基礎。
事務能夠一次執行多個命令, 而且帶有如下兩個重要的保證:redis

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

當使用 AOF 方式作持久化的時候, Redis 會使用單個 write(2) 命令將事務寫入到磁盤中。
然而,若是 Redis 服務器由於某些緣由被管理員殺死,或者趕上某種硬件故障,那麼可能只有部分事務命令會被成功寫入到磁盤中。
若是 Redis 在從新啓動時發現 AOF 文件出了這樣的問題,那麼它會退出,並彙報一個錯誤。
使用 redis-check-aof 程序能夠修復這一問題:它會移除 AOF 文件中不完整事務的信息,確保服務器能夠順利啓動。服務器

  • 若是客戶端在使用 MULTI 開啓了一個事務以後,卻由於斷線而沒有成功執行 EXEC ,那麼事務中的全部命令都不會被執行。
  • 另外一方面,若是客戶端成功在開啓事務以後執行 EXEC ,那麼事務中的全部命令都會被執行。

從 2.2 版本開始,Redis 還能夠經過樂觀鎖(optimistic lock)實現 CAS (check-and-set)操做,具體信息請參考文檔的後半部分。spa

用法

MULTI 命令用於開啓一個事務,它老是返回 OK 。
MULTI 執行以後, 客戶端能夠繼續向服務器發送任意多條命令, 這些命令不會當即被執行, 而是被放到一個隊列中, 當 EXEC 命令被調用時, 全部隊列中的命令纔會被執行。
另外一方面, 經過調用 DISCARD , 客戶端能夠清空事務隊列, 並放棄執行事務。
如下是一個事務例子, 它原子地增長了 foo 和 bar 兩個鍵的值:隊列

相關文章
相關標籤/搜索