Redis學習手冊(事務),redis學習手冊事務

來源:互聯網
上載者:User

Redis學習手冊(事務),redis學習手冊事務


一、概述:      和眾多其它資料庫一樣,Redis作為NoSQL資料庫也同樣提供了事務機制。在Redis中,MULTI/EXEC/DISCARD/WATCH這四個命令是我們實現事務的基石。相信對有關係型資料庫開發經驗的開發人員而言這一概念並不陌生,即便如此,我們還是會簡要的列出Redis中事務的實現特徵:      1). 在事務中的所有命令都將會被序列化的順序執行,事務執行期間,Redis不會再為其它用戶端的請求提供任何服務,從而保證了事物中的所有命令被原子的執行。      2). 和關係型資料庫中的事務相比,在Redis事務中如果有某一條命令執行失敗,其後的命令仍然會被繼續執行。      3). 我們可以通過MULTI命令開啟一個事務,有關係型資料庫開發經驗的人可以將其理解為"BEGIN TRANSACTION"語句。在該語句之後執行的命令都將被視為事務之內的操作,最後我們可以通過執行EXEC/DISCARD命令來提交/復原該事務內的所有操作。這兩個Redis命令可被視為等同於關係型資料庫中的COMMIT/ROLLBACK語句。      4). 在事務開啟之前,如果用戶端與伺服器之間出現通訊故障並導致網路斷開,其後所有待執行的語句都將不會被伺服器執行。然而如果網路中斷事件是發生在用戶端執行EXEC命令之後,那麼該事務中的所有命令都會被伺服器執行。       5). 當使用Append-Only模式時,Redis會通過調用系統函數write將該事務內的所有寫操作在本次調用中全部寫入磁碟。然而如果在寫入的過程中出現系統崩潰,如電源故障導致的宕機,那麼此時也許只有部分資料被寫入到磁碟,而另外一部分資料卻已經丟失。Redis伺服器會在重新啟動時執行一系列必要的一致性檢測,一旦發現類似問題,就會立即退出並給出相應的錯誤提示。此時,我們就要充分利用Redis工具包中提供的redis-check-aof工具,該工具可以協助我們定位到資料不一致的錯誤,並將已經寫入的部分資料進行復原。修複之後我們就可以再次重新啟動Redis伺服器了。 二、相關命令列表:命令原型 時間複雜度 命令描述 返回值MULTI 用於標記事務的開始,其後執行的命令都將被存入命令隊列,直到執行EXEC時,這些命令才會被原子的執行。 始終返回OKEXEC 執行在一個事務內命令隊列中的所有命令,同時將當前串連的狀態恢複為正常狀態,即非事務狀態。如果在事務中執行了WATCH命令,那麼只有當WATCH所監控的Keys沒有被修改的前提下,EXEC命令才能執行事務隊列中的所有命令,否則EXEC將放棄當前事務中的所有命令。 原子性的返回事務中各條命令的返回結果。如果在事務中使用了WATCH,一旦事務被放棄,EXEC將返回NULL-multi-bulk回複。DISCARD 復原事務隊列中的所有命令,同時再將當前串連的狀態恢複為正常狀態,即非事務狀態。如果WATCH命令被使用,該命令將UNWATCH所有的Keys。 始終返回OK。WATCH key [key ...] O(1) 在MULTI命令執行之前,可以指定待監控的Keys,然而在執行EXEC之前,如果被監控的Keys發生修改,EXEC將放棄執行該事務隊列中的所有命令。 始終返回OK。UNWATCH O(1) 取消當前事務中指定監控的Keys,如果執行了EXEC或DISCARD命令,則無需再手工執行該命令了,因為在此之後,事務中所有被監控的Keys都將自動取消。 始終返回OK。
三、命令樣本:    1. 事務被正常執行:    #在Shell命令列下執行Redis的用戶端工具。    /> redis-cli    #在當前串連上啟動一個新的事務。    redis 127.0.0.1:6379> multi    OK    #執行事務中的第一條命令,從該命令的返回結果可以看出,該命令並沒有立即執行,而是存於事務的命令隊列。    redis 127.0.0.1:6379> incr t1    QUEUED    #又執行一個新的命令,從結果可以看出,該命令也被存於事務的命令隊列。    redis 127.0.0.1:6379> incr t2    QUEUED    #執行事務命令隊列中的所有命令,從結果可以看出,隊列中命令的結果得到返回。    redis 127.0.0.1:6379> exec    1) (integer) 1    2) (integer) 1           2. 事務中存在失敗的命令:    #開啟一個新的事務。    redis 127.0.0.1:6379> multi    OK    #設定鍵a的值為string類型的3。    redis 127.0.0.1:6379> set a 3    QUEUED    #從鍵a所關聯的值的頭部彈出元素,由於該值是字串類型,而lpop命令僅能用於List類型,因此在執行exec命令時,該命令將會失敗。    redis 127.0.0.1:6379> lpop a    QUEUED    #再次設定鍵a的值為字串4。    redis 127.0.0.1:6379> set a 4    QUEUED    #擷取鍵a的值,以便確認該值是否被事務中的第二個set命令設定成功。    redis 127.0.0.1:6379> get a    QUEUED    #從結果中可以看出,事務中的第二條命令lpop執行失敗,而其後的set和get命令均執行成功,這一點是Redis的事務與關係型資料庫中的事務之間最為重要的差別。    redis 127.0.0.1:6379> exec    1) OK    2) (error) ERR Operation against a key holding the wrong kind of value    3) OK    4) "4"    3. 復原事務:    #為鍵t2設定一個事務執行前的值。    redis 127.0.0.1:6379> set t2 tt    OK    #開啟一個事務。    redis 127.0.0.1:6379> multi    OK    #在事務內為該鍵設定一個新值。    redis 127.0.0.1:6379> set t2 ttnew    QUEUED    #放棄事務。    redis 127.0.0.1:6379> discard    OK    #查看鍵t2的值,從結果中可以看出該鍵的值仍為事務開始之前的值。    redis 127.0.0.1:6379> get t2    "tt"

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.