亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

Redis教程(八):事務詳解

2020-03-17 12:42:48
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Redis教程(八):事務詳解,本文講解了,本文講解了事務概述、相關命令列表、命令使用示例、WATCH命令和基于CAS的樂觀鎖等內容,需要的朋友可以參考下
 

一、概述:

      和眾多其它數據庫一樣,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時,這些命令才會被原子的執行。 始終返回OK
EXEC   執行在一個事務內命令隊列中的所有命令,同時將當前連接的狀態恢復為正常狀態,即非事務狀態。如果在事務中執行了WATCH命令,那么只有當WATCH所監控的Keys沒有被修改的前提下,EXEC命令才能執行事務隊列中的所有命令,否則EXEC將放棄當前事務中的所有命令。 原子性的返回事務中各條命令的返回結果。如果在事務中使用了WATCH,一旦事務被放棄,EXEC將返回NULL-multi-bulk回復。
DISCARD   回滾事務隊列中的所有命令,同時再將當前連接的狀態恢復為正常狀態,即非事務狀態。如果WATCH命令被使用,該命令將UNWATCH所有的Keys。 始終返回OK。
WATCHkey [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"

四、WATCH命令和基于CAS的樂觀鎖:

 

      在Redis的事務中,WATCH命令可用于提供CAS(check-and-set)功能。假設我們通過WATCH命令在事務執行之前監控了多個Keys,倘若在WATCH之后有任何Key的值發生了變化,EXEC命令執行的事務都將被放棄,同時返回Null multi-bulk應答以通知調用者事務執行失敗。例如,我們再次假設Redis中并未提供incr命令來完成鍵值的原子性遞增,如果要實現該功能,我們只能自行編寫相應的代碼。其偽碼如下:
  

復制代碼代碼如下:

      val = GET mykey
      val = val + 1
      SET mykey $val
  

      以上代碼只有在單連接的情況下才可以保證執行結果是正確的,因為如果在同一時刻有多個客戶端在同時執行該段代碼,那么就會出現多線程程序中經常出現的一種錯誤場景--競態爭用(race condition)。比如,客戶端A和B都在同一時刻讀取了mykey的原有值,假設該值為10,此后兩個客戶端又均將該值加一后set回Redis服務器,這樣就會導致mykey的結果為11,而不是我們認為的12。為了解決類似的問題,我們需要借助WATCH命令的幫助,見如下代碼:
  
復制代碼代碼如下:

      WATCH mykey
      val = GET mykey
      val = val + 1
      MULTI
      SET mykey $val
      EXEC
  

      和此前代碼不同的是,新代碼在獲取mykey的值之前先通過WATCH命令監控了該鍵,此后又將set命令包圍在事務中,這樣就可以有效的保證每個連接在執行EXEC之前,如果當前連接獲取的mykey的值被其它連接的客戶端修改,那么當前連接的EXEC命令將執行失敗。這樣調用者在判斷返回值后就可以獲悉val是否被重新設置成功。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产999| 久久99精品久久久久久青青91| 亚洲一区制服诱惑| 日韩国产精品亚洲а∨天堂免| 92看片淫黄大片看国产片| 国产精品激情av电影在线观看| 欧美最猛性xxxxx免费| 亚洲色图15p| 7777kkkk成人观看| 亚洲91av视频| 日韩一区视频在线| 色天天综合狠狠色| 亚洲人成在线播放| 中文字幕亚洲欧美一区二区三区| 国产婷婷色综合av蜜臀av| 国产精品户外野外| 日韩在线观看精品| 久久夜精品va视频免费观看| 国产视频综合在线| 亚洲国产高清高潮精品美女| 亚洲国产中文字幕在线观看| 中文字幕久久久| 欧美最猛性xxxxx免费| 久久视频精品在线| 国产精品美女主播在线观看纯欲| 国产成人精品一区| 91成品人片a无限观看| 久久97精品久久久久久久不卡| 正在播放国产一区| 国产福利精品av综合导导航| 欧美国产日产韩国视频| 亚洲女人天堂色在线7777| 欧美日韩高清在线观看| 日韩欧美在线国产| 中文字幕亚洲专区| 91精品国产自产在线观看永久| 俺去啦;欧美日韩| 久久精品国产亚洲7777| 国产精品亚洲自拍| 欧美亚洲国产视频小说| 欧美精品激情视频| 国产精品扒开腿做爽爽爽的视频| www.亚洲成人| 欧美黑人极品猛少妇色xxxxx| 超碰精品一区二区三区乱码| 一区二区三区亚洲| 亚洲自拍另类欧美丝袜| 91久久嫩草影院一区二区| 欧美日韩亚洲系列| 精品无人区太爽高潮在线播放| 国产精品久久久久77777| 久久精品国产69国产精品亚洲| 日韩免费在线播放| 亚洲wwwav| 欧美日韩福利视频| 日本韩国欧美精品大片卡二| 国产精品久久91| 久久综合伊人77777蜜臀| 国产精品∨欧美精品v日韩精品| 亚洲成人精品视频在线观看| 欧美色另类天堂2015| 欧美激情亚洲综合一区| 美女999久久久精品视频| 色哟哟网站入口亚洲精品| 亚洲精品电影网在线观看| 日韩a**中文字幕| 18久久久久久| 成人亚洲激情网| 国产亚洲成av人片在线观看桃| 亚洲毛片在线观看.| 一区二区三区在线播放欧美| 茄子视频成人在线| 国产亚洲精品综合一区91| 久久精品国产精品亚洲| 色偷偷噜噜噜亚洲男人| 中文国产成人精品久久一| 久久久久久久成人| 亚洲精品国产精品乱码不99按摩| 日韩精品免费电影| 日韩第一页在线| 8x海外华人永久免费日韩内陆视频| 午夜欧美不卡精品aaaaa| 亚洲精品电影久久久| 国产热re99久久6国产精品| 成人性生交大片免费看小说| 欧美激情亚洲国产| 日韩av在线网站| 亚洲天堂视频在线观看| 亚洲天堂av电影| 国产成人小视频在线观看| 欧美日韩国产在线播放| 欧美在线视频在线播放完整版免费观看| 亚洲在线第一页| 九九热这里只有在线精品视| 日韩欧美综合在线视频| 国产噜噜噜噜久久久久久久久| 96精品视频在线| 色偷偷888欧美精品久久久| 91成品人片a无限观看| 最新国产成人av网站网址麻豆| 欧美性xxxxxx| 国产精品电影在线观看| 91tv亚洲精品香蕉国产一区7ujn| 欧美丰满少妇xxxxx| 九九热视频这里只有精品| 久久久久久噜噜噜久久久精品| 日韩精品中文字幕有码专区| 成人精品一区二区三区| 日韩精品中文字幕视频在线| 国产精品久久久久久久久久三级| 一区二区三区黄色| 最新中文字幕亚洲| 欧美日韩中文字幕日韩欧美| 欧美性受xxxx黑人猛交| 九九视频直播综合网| 日韩在线www| 国产精品自拍网| 中文字幕免费精品一区| 俺也去精品视频在线观看| 久久久久一本一区二区青青蜜月| 九九综合九九综合| 欧美日韩一区二区免费视频| 久久久国产精品一区| 久久久久久亚洲精品中文字幕| 2020国产精品视频| 亚洲欧美国产高清va在线播| 97久久久免费福利网址| 亚洲自拍高清视频网站| 国产精品久久久久久久午夜| 亚洲视频axxx| 久久精视频免费在线久久完整在线看| 久久久久久久久久国产精品| 中文国产成人精品| 欧美午夜影院在线视频| 中文字幕日韩av| 欧美天堂在线观看| 欧美日韩午夜激情| 欧美性jizz18性欧美| 亚洲视频欧洲视频| 国产精品入口日韩视频大尺度| 国产剧情日韩欧美| 91欧美日韩一区| 这里只有视频精品| 欧美亚洲伦理www| 久久久伊人欧美| 91在线观看欧美日韩| 亚洲精品视频久久| 高清一区二区三区日本久| 亚洲国模精品一区| 日韩欧美在线中文字幕| 久久视频在线直播| 91精品中文在线| 成人激情视频小说免费下载| 国产亚洲视频中文字幕视频| 久久精品91久久久久久再现| 国产精品wwwwww| 国产精品亚洲视频在线观看| 亚洲国产日韩欧美在线99| 国产视频在线观看一区二区| 日韩高清电影免费观看完整版| 97人洗澡人人免费公开视频碰碰碰| 日本一区二三区好的精华液| 日韩av电影手机在线观看| 欧美另类xxx|