Redis - 深入理解Redis事務(wù)

目錄

Redis是如何實(shí)現(xiàn)事務(wù)的?

解讀
事務(wù)要滿足ACID四個(gè)原則。了解Redis實(shí)現(xiàn)事務(wù)的機(jī)制,就能了解Redis是如何分別保證ACID的。同時(shí),了解了事務(wù)實(shí)現(xiàn)機(jī)制,也能清楚知道Redis事務(wù)有何優(yōu)劣,在使用時(shí)如何避免Redis事務(wù)缺點(diǎn)。

參考

概要

  1. Redis通過四個(gè)命令實(shí)現(xiàn)事務(wù): WATCH, MULTI, EXEC, DISCARD
  2. Redis事務(wù)以MULTI命令開始,EXEC/DISCARD命令結(jié)束。EXEC用于提交事務(wù),DISCARD用于取消事務(wù)。
  3. 在開啟事務(wù)時(shí),Redis操作命令并不會(huì)立即執(zhí)行,而是會(huì)先進(jìn)入事務(wù)隊(duì)列。Redis事務(wù)隊(duì)列是一個(gè)FIFO隊(duì)列
  4. 當(dāng)執(zhí)行EXEC命令時(shí),會(huì)把事務(wù)隊(duì)列中的命令逐個(gè)執(zhí)行,不會(huì)被任何命令中斷。
事務(wù)中執(zhí)行的命令出現(xiàn)錯(cuò)誤,會(huì)回滾事務(wù)嗎?

解讀
通常,一個(gè)事務(wù)中會(huì)有不止一個(gè)Redis操作,任何一個(gè)操作都有失敗的可能。在有操作出錯(cuò)的情況下,會(huì)影響事務(wù)的執(zhí)行嗎?

參考

概要

  1. 首先,Redis事務(wù)時(shí)不支持回滾的。也就是說,如果事務(wù)中的命令執(zhí)行出錯(cuò),已經(jīng)執(zhí)行的命令不會(huì)撤回,后續(xù)的命令也會(huì)繼續(xù)執(zhí)行。
  2. Redis事務(wù)的命令分為入隊(duì)和執(zhí)行兩個(gè)階段。在入隊(duì)(進(jìn)入事務(wù)隊(duì)列)時(shí)出錯(cuò),Redis會(huì)忽略入隊(duì)出錯(cuò)的命令,不會(huì)影響后續(xù)命令入隊(duì)。執(zhí)行時(shí)出錯(cuò),出錯(cuò)命令會(huì)被Redis忽略,其他沒有出錯(cuò)的命令均會(huì)執(zhí)行。
同一個(gè)連接可以重復(fù)開啟事務(wù)嗎?

解讀
本質(zhì)問題是是否允許事務(wù)嵌套。

參考

概要

  1. Redis事務(wù)不能嵌套。如果再收到MULTI命令開啟事務(wù),會(huì)返回錯(cuò)誤(redis-cli會(huì)返回(error) ERR MULTI calls can not be nested這樣的錯(cuò)誤)
  2. 遇到嵌套事務(wù)返回錯(cuò)誤后,并不會(huì)影響事務(wù)隊(duì)列繼續(xù)接收命令,也不會(huì)修改事務(wù)隊(duì)列中的任何數(shù)據(jù)。
多個(gè)客戶端同時(shí)開啟事務(wù)會(huì)怎樣?

解讀
在并發(fā)情況,很容易出現(xiàn)多個(gè)客戶端同時(shí)開啟事務(wù)的情況。這時(shí)Redis會(huì)區(qū)分客戶端維護(hù)事務(wù)隊(duì)列嗎?另外,實(shí)際工程中為了提升性能,通常會(huì)用Redis連接池復(fù)用連接,這種情況下,會(huì)出現(xiàn)連接復(fù)用導(dǎo)致事務(wù)嵌套嗎?

參考

概要

  1. Redis事務(wù)隊(duì)列是與連接綁定的,不同的連接中允許同時(shí)開啟事務(wù),不會(huì)相互影響
  2. 合理的事務(wù)管理器中,會(huì)在開啟事務(wù)時(shí)綁定連接,防止連接被其他請(qǐng)求復(fù)用。不過應(yīng)用不當(dāng),會(huì)出現(xiàn)連接不能被歸還的問題。(由此可見,一個(gè)優(yōu)秀的事務(wù)管理器是多么重要)
使用Redis事務(wù)只用MULTIEXEC嗎?

解讀
使用Redis事務(wù),不能單純只用MULTIEXEC,因?yàn)槟承﹌ey在事務(wù)執(zhí)行時(shí)已經(jīng)變了。正確的Redis事務(wù)需要保證事務(wù)執(zhí)行時(shí),事務(wù)涉及的數(shù)據(jù)沒有被修改。

參考

概要

  1. 在開啟事務(wù)前,使用WATCH命令監(jiān)視指定的key,形成樂觀鎖
  2. 事務(wù)執(zhí)行時(shí),如果被WATCH的key發(fā)生了變化,則事務(wù)失效,不能執(zhí)行。
Redis中的WATCH機(jī)制是怎么實(shí)現(xiàn)的?

解讀
無他,只是為了了解底層實(shí)現(xiàn)原理

參考

概要

  1. 每個(gè)被WATCH的key都會(huì)維護(hù)一個(gè)WATCH這個(gè)key的所有client列表
  2. 當(dāng)被WATCH的key發(fā)生修改時(shí)(執(zhí)行任意修改命令),所有WATCH該key的client的REDIS_DIRTY_CAS字段會(huì)被修改為打開狀態(tài)。
  3. 當(dāng)執(zhí)行事務(wù)時(shí),如果這個(gè)client的REDIS_DIRTY_CAS字段被打開,說明有至少一個(gè)數(shù)據(jù)被修改,事務(wù)不能執(zhí)行。

參考
Redis官方文檔-Transactions

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容