目錄
- Redis是如何實(shí)現(xiàn)事務(wù)的?
- 事務(wù)中執(zhí)行的命令出現(xiàn)錯(cuò)誤,會(huì)回滾事務(wù)嗎?
- 同一個(gè)連接可以重復(fù)開啟事務(wù)嗎?
- 多個(gè)客戶端同時(shí)開啟事務(wù)會(huì)怎樣?
- 使用Redis事務(wù)只用MULTI和EXEC嗎?
- Redis中的WATCH機(jī)制是怎么實(shí)現(xiàn)的?
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)。
參考
概要
- Redis通過四個(gè)命令實(shí)現(xiàn)事務(wù):
WATCH,MULTI,EXEC,DISCARD- Redis事務(wù)以
MULTI命令開始,EXEC/DISCARD命令結(jié)束。EXEC用于提交事務(wù),DISCARD用于取消事務(wù)。- 在開啟事務(wù)時(shí),Redis操作命令并不會(huì)立即執(zhí)行,而是會(huì)先進(jìn)入事務(wù)隊(duì)列。Redis事務(wù)隊(duì)列是一個(gè)FIFO隊(duì)列
- 當(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í)行嗎?
參考
概要
- 首先,Redis事務(wù)時(shí)不支持回滾的。也就是說,如果事務(wù)中的命令執(zhí)行出錯(cuò),已經(jīng)執(zhí)行的命令不會(huì)撤回,后續(xù)的命令也會(huì)繼續(xù)執(zhí)行。
- 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ù)嵌套。
參考
概要
- Redis事務(wù)不能嵌套。如果再收到
MULTI命令開啟事務(wù),會(huì)返回錯(cuò)誤(redis-cli會(huì)返回(error) ERR MULTI calls can not be nested這樣的錯(cuò)誤)- 遇到嵌套事務(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ù)嵌套嗎?
參考
- Redis設(shè)計(jì)與實(shí)現(xiàn)-事務(wù)
- 剖析!Redis事務(wù)實(shí)現(xiàn)原理
- Sping Data Redis 使用事務(wù)時(shí),不關(guān)閉連接的問題
概要
- Redis事務(wù)隊(duì)列是與連接綁定的,不同的連接中允許同時(shí)開啟事務(wù),不會(huì)相互影響
- 合理的事務(wù)管理器中,會(huì)在開啟事務(wù)時(shí)綁定連接,防止連接被其他請(qǐng)求復(fù)用。不過應(yīng)用不當(dāng),會(huì)出現(xiàn)連接不能被歸還的問題。(由此可見,一個(gè)優(yōu)秀的事務(wù)管理器是多么重要)
使用Redis事務(wù)只用MULTI和EXEC嗎?
解讀
使用Redis事務(wù),不能單純只用MULTI和EXEC,因?yàn)槟承﹌ey在事務(wù)執(zhí)行時(shí)已經(jīng)變了。正確的Redis事務(wù)需要保證事務(wù)執(zhí)行時(shí),事務(wù)涉及的數(shù)據(jù)沒有被修改。
參考
概要
- 在開啟事務(wù)前,使用
WATCH命令監(jiān)視指定的key,形成樂觀鎖- 事務(wù)執(zhí)行時(shí),如果被
WATCH的key發(fā)生了變化,則事務(wù)失效,不能執(zhí)行。
Redis中的WATCH機(jī)制是怎么實(shí)現(xiàn)的?
解讀
無他,只是為了了解底層實(shí)現(xiàn)原理
參考
概要
- 每個(gè)被
WATCH的key都會(huì)維護(hù)一個(gè)WATCH這個(gè)key的所有client列表- 當(dāng)被
WATCH的key發(fā)生修改時(shí)(執(zhí)行任意修改命令),所有WATCH該key的client的REDIS_DIRTY_CAS字段會(huì)被修改為打開狀態(tài)。- 當(dāng)執(zhí)行事務(wù)時(shí),如果這個(gè)client的
REDIS_DIRTY_CAS字段被打開,說明有至少一個(gè)數(shù)據(jù)被修改,事務(wù)不能執(zhí)行。