![redis學(xué)習(xí)手冊(cè)1事務(wù)_第1頁](http://file4.renrendoc.com/view/0a91172f8924a6b1c9218d9eec17deb7/0a91172f8924a6b1c9218d9eec17deb71.gif)
![redis學(xué)習(xí)手冊(cè)1事務(wù)_第2頁](http://file4.renrendoc.com/view/0a91172f8924a6b1c9218d9eec17deb7/0a91172f8924a6b1c9218d9eec17deb72.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一、概述:和眾多其它數(shù)據(jù)庫一樣, Redis 作為 NoSQL 數(shù)據(jù)庫也同樣提供了事務(wù)機(jī)制。在 Redis 中, MULTI/EXEC/DISCARD/WATCH 這四個(gè)命令是實(shí)現(xiàn)事務(wù)的基石。相信對(duì)有關(guān)系型數(shù)據(jù)庫開發(fā)經(jīng)驗(yàn)的開發(fā)者而言這一概念并不陌生,即便如此,還是會(huì)簡(jiǎn)要的列出 Redis 中事務(wù)的實(shí)現(xiàn)特征:1). 在事務(wù)中的所有命令都將會(huì)被串行化的順序執(zhí)行,事務(wù)執(zhí)行期間,Redis 不會(huì)再為其它客戶端的請(qǐng)求提供任何服務(wù),從而保證了事物中的所有命令被原子的執(zhí)行。2). 和關(guān)系型數(shù)據(jù)庫中的事務(wù)相比,在 Redis 事務(wù)中如果有某一條命令執(zhí)行失敗,其后令仍然會(huì)被繼續(xù)執(zhí)行。3). 可以通過 MULTI
2、 命令開啟一個(gè)事務(wù),有關(guān)系型數(shù)據(jù)庫開發(fā)經(jīng)驗(yàn)的人可以將其理解為BEGINTRANION語句。在該語句之后執(zhí)行令都將被視為事務(wù)之內(nèi)的操作,最后可以通過執(zhí)行EXEC/DISCARD 命令來提交/回滾該事務(wù)內(nèi)的所有操作。這兩個(gè) Redis 命令可被視為等同于關(guān)系型數(shù)據(jù)庫中的 COMMIT/ROLLBACK 語句。有命令都會(huì)被服務(wù)器執(zhí)行。 5). 當(dāng)使用 Append-Only 模式時(shí),Redis 會(huì)通過調(diào)用系統(tǒng)函數(shù) write 將該事務(wù)內(nèi)的所有寫操作在本 次調(diào)用中全部寫入磁盤。然而如果在寫入的過程中出現(xiàn)系統(tǒng) ,如電源故障導(dǎo)致的宕機(jī),那么此時(shí)也許只有部分?jǐn)?shù)據(jù)被寫入到磁盤,而另外一部分?jǐn)?shù)據(jù)卻已經(jīng)丟失。Re
3、dis 服務(wù)器會(huì)在重新啟動(dòng)時(shí)執(zhí)行一系列必要的一致性檢測(cè),一旦發(fā)現(xiàn)類似問題,就會(huì)立即退出并給出相應(yīng)的錯(cuò)誤提示。此時(shí), 就要充分利用 Redis 工具包中提供的 redis-check-aof 工具,該工具可以幫助 定位到數(shù)據(jù)不一致的錯(cuò)誤,并將已經(jīng)寫入的部分?jǐn)?shù)據(jù)進(jìn)行回滾。修復(fù)之后 就可以再次重新啟動(dòng) Redis 服務(wù)器了。二、相關(guān)命令列表:命令原型時(shí) 間復(fù) 雜度命令描述返回值MULTI用于標(biāo)記事務(wù)的開始,其后執(zhí)行令都將被存入命令隊(duì)列,直到執(zhí)行 EXEC 時(shí),這些命令才會(huì)被原子的執(zhí)行。始終返回 OKEXEC執(zhí)行在一個(gè)事務(wù)內(nèi)命令隊(duì)列中的所有命令,同時(shí)將當(dāng)前連接的狀態(tài)恢復(fù)為正常狀態(tài),即非事務(wù)狀態(tài)。如果在
4、事務(wù)中執(zhí)行了 WATCH 命令,那么只有當(dāng) WATCH 所 的 Keys 沒有被修改的前提下,EXEC 命令才能執(zhí)行事務(wù)隊(duì)列中的所有命令,否則 EXEC 將放棄當(dāng)前事務(wù)中的所有命令。原子性的返回事務(wù)中各條命令的返回結(jié)果。如果在事務(wù)中使用了 WATCH,一旦事務(wù)被放棄, EXEC 將返回 NULL-multi-bulk 回復(fù)。DISCARD回滾事務(wù)隊(duì)列中的所有命令,同時(shí)再將當(dāng)前連接的狀態(tài)恢復(fù)為正常狀態(tài),即非事務(wù)狀態(tài)。如果 WATCH 命令被使用,該命令將 UNWATCH 所有的 Keys。始終返回 OK。WATCHkey key .O(1)在 MULTI 命令執(zhí)行之前,可以指定待 的 Keys,
5、然而在執(zhí)行 EXEC 之前,如果被 的 Keys 發(fā)生修改, EXEC 將放棄執(zhí)行該事務(wù)隊(duì)列中的所有命令。始終返回 OK。4). 在事務(wù)開啟之前,如果客戶端與服務(wù)器之間出現(xiàn)通訊故障并導(dǎo)致網(wǎng)絡(luò)斷開,其后所有待執(zhí)行的語句都將不會(huì)被服務(wù)器執(zhí)行。然而如果網(wǎng)絡(luò)中斷事件是發(fā)生在客戶端執(zhí)行 EXEC 命令之后,那么該事務(wù)中的所三、命令示例:1. 事務(wù)被正常執(zhí)行:#在 S 命令行下執(zhí)行 Redis 的客戶端工具。/redis-cli#在當(dāng)前連接上啟動(dòng)一個(gè)新的事務(wù)。redis 127.0.0.1:6379multiOK#執(zhí)行事務(wù)中的第一條命令,從該命令的返回結(jié)果可以看出,該命令并沒有立即執(zhí)行,而是存于事務(wù)令隊(duì)列
6、。redis 127.0.0.1:6379incr t1QUEUED#又執(zhí)行一個(gè)新令,從結(jié)果可以看出,該命令也被存于事務(wù)令隊(duì)列。redis 127.0.0.1:6379incr t2QUEUED#執(zhí)行事務(wù)命令隊(duì)列中的所有命令,從結(jié)果可以看出,隊(duì)列中命令的結(jié)果得到返回。redis 127.0.0.1:6379exec1) (2) (eger) 1eger) 12. 事務(wù)中存在失敗令:#開啟一個(gè)新的事務(wù)。redis 127.0.0.1:6379multiOK#設(shè)置鍵 a 的值為 string 類型的 3。redis 127.0.0.1:6379set a 3QUEUED#從鍵 a 所關(guān)聯(lián)的值的頭部
7、彈出元素,由于該值是字符串類型,而 lpop 命令僅能用于 List 類型,因此在執(zhí)行 exec 命令時(shí),該命令將會(huì)失敗。redis 127.0.0.1:6379lpop aQUEUEDUNWATCHO(1)取消當(dāng)前事務(wù)中指定 的 Keys,如果執(zhí)行了 EXEC 或 DISCARD 命令,則無需再手工執(zhí)行該命令了,因?yàn)樵诖酥?,事?wù)中所有被 的 Keys 都將自動(dòng)取消。始終返回 OK。#再次設(shè)置鍵 a 的值為字符串 4。redis 127.0.0.1:6379set a 4QUEUED#獲取鍵 a 的值,以便確認(rèn)該值是否被事務(wù)中的第二個(gè) set 命令設(shè)置成功。redis 127.0.0.1:6
8、379get aQUEUED#從結(jié)果中可以看出,事務(wù)中的第二條命令 lpop 執(zhí)行失敗,而其后的 set 和 get 命令均執(zhí)行成功,這一點(diǎn)是 Redis 的事務(wù)與關(guān)系型數(shù)據(jù)庫中的事務(wù)之間最為重要的差別。redis 127.0.0.1:6379exec1) OK2) (error) ERR Operation against a key holding the wrong kind of value3) OK4) 43. 回滾事務(wù):#為鍵 t2 設(shè)置一個(gè)事務(wù)執(zhí)行前的值。redis 127.0.0.1:6379set t2 ttOK#開啟一個(gè)事務(wù)。redis 127.0.0.1:6379mult
9、iOK#在事務(wù)內(nèi)為該鍵設(shè)置一個(gè)新值。redis 127.0.0.1:6379set t2 ttnewQUEUED#放棄事務(wù)。redis 127.0.0.1:6379discardOK#查看鍵 t2 的值,從結(jié)果中可以看出該鍵的值仍為事務(wù)開始之前的值。redis 127.0.0.1:6379get t2tt在 Redis 的事務(wù)中,WATCH 命令可用于提供 CAS(check-and-set)功能。假設(shè)通過 WATCH 命令在事務(wù)執(zhí)行之前了多個(gè) Keys,倘若在 WATCH 之后有任何 Key 的值發(fā)生了變化,EXEC 命令執(zhí)行的事務(wù)都將被放棄,同時(shí)返回 Null multi-bulk 應(yīng)答以
10、通知調(diào)用者事務(wù)執(zhí)行失敗。例如,再次假設(shè) Redis中并未提供 incr 命令來完成鍵值的原子性遞增,如果要實(shí)現(xiàn)該功能,只能自行編寫相應(yīng)的代碼。其偽碼四、WATCH 命令和基于 CAS 的樂觀鎖:val = GET mykeyval = val + 1SET mykey $val如,客戶端 A 和 B 都在同一時(shí)刻了 mykey 的原有值,假設(shè)該值為 10,此后兩個(gè)客戶端又均將該值加一后 set 回 Redis 服務(wù)器,這樣就會(huì)導(dǎo)致 mykey 的結(jié)果為 11,而不是認(rèn)為的 12。為了解決類似,需要借助 WATCH 命令的幫助,見如下代碼:WATykeyval = GET mykeyval = val + 1MULTISET mykey $valEXEC和此前代碼不同的是,新代碼在獲取 mykey 的值之前先通過 WATCH 命令了該鍵,此后又將 set命令包圍在事務(wù)中,這樣就可以有效的保證每個(gè)連接在執(zhí)行 EXEC 之前,如果當(dāng)前連接獲取的 mykey 的值被其
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙教版數(shù)學(xué)七年級(jí)下冊(cè)3.5《整式的化簡(jiǎn)》聽評(píng)課記錄
- 蘇科版九年級(jí)數(shù)學(xué)聽評(píng)課記錄:第32講 正多邊形的外接圓
- 青島版數(shù)學(xué)七年級(jí)上冊(cè)3.2《有理數(shù)的乘法與除法》聽評(píng)課記錄3
- 一年級(jí)下冊(cè)數(shù)學(xué)聽評(píng)課記錄《看一看(一)》4 北師大版
- 部編版八年級(jí)歷史(上)《第17課 中國工農(nóng)紅軍長征》聽課評(píng)課記錄
- 華師大版數(shù)學(xué)九年級(jí)下冊(cè)《復(fù)習(xí)題》聽評(píng)課記錄4
- 川教版歷史九年級(jí)下冊(cè)第3課《日本明治維新》聽課評(píng)課記錄
- 蘇科版數(shù)學(xué)九年級(jí)下冊(cè)《6.2 黃金分割》聽評(píng)課記錄
- 小學(xué)二年級(jí)數(shù)學(xué)口算訓(xùn)練
- 小學(xué)二年級(jí)上冊(cè)數(shù)學(xué)除法口算題
- 中央2025年交通運(yùn)輸部所屬事業(yè)單位招聘261人筆試歷年參考題庫附帶答案詳解
- 江蘇省蘇州市2024-2025學(xué)年高三上學(xué)期1月期末生物試題(有答案)
- 銷售與銷售目標(biāo)管理制度
- 特殊教育學(xué)校2024-2025學(xué)年度第二學(xué)期教學(xué)工作計(jì)劃
- 2025年技術(shù)員個(gè)人工作計(jì)劃例文(四篇)
- 2025年第一次工地開工會(huì)議主要議程開工大吉模板
- 第16課抗日戰(zhàn)爭(zhēng)課件-人教版高中歷史必修一
- 對(duì)口升學(xué)語文模擬試卷(9)-江西省(解析版)
- 無人機(jī)運(yùn)營方案
- 糖尿病高滲昏迷指南
- 【公開課】同一直線上二力的合成+課件+2024-2025學(xué)年+人教版(2024)初中物理八年級(jí)下冊(cè)+
評(píng)論
0/150
提交評(píng)論