0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

剖析!Redis事務(wù)實(shí)現(xiàn)原理

張康康 ? 2019-07-29 18:27 ? 次閱讀

作者 | Video++極鏈科后端Team劉聰

整理 | 包包

所謂事務(wù)(Transaction) ,是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作。事務(wù)必須滿足ACID原則(原子性、一致性、隔離性和持久性)。簡單來說事務(wù)其實(shí)就是打包一組操作(或者命令)作為一個(gè)整體,在事務(wù)處理時(shí)將順序執(zhí)行這些操作,并返回結(jié)果,如果其中任何一個(gè)環(huán)節(jié)出錯(cuò),所有的操作將被回滾。

在Redis中實(shí)現(xiàn)事務(wù)主要依靠以下幾個(gè)命令來實(shí)現(xiàn):

剖析!Redis事務(wù)實(shí)現(xiàn)原理


Redis事務(wù)從開始到結(jié)束通常會通過三個(gè)階段:

1.事務(wù)開始

2.命令入隊(duì)

3.事務(wù)執(zhí)行

以下是一個(gè)最簡單的Redis事務(wù)流程:

剖析!Redis事務(wù)實(shí)現(xiàn)原理


第一步跟其他的關(guān)系型數(shù)據(jù)庫類似,也是需要開啟一個(gè)事務(wù),在Redis中的命令如下:

剖析!Redis事務(wù)實(shí)現(xiàn)原理


Redis中使用MULTI命令標(biāo)記事務(wù)的開始,可以理解為在傳統(tǒng)關(guān)系型數(shù)據(jù)庫中的BEGIN TRANCATION語句,Redis將執(zhí)行該命令的客戶端從非事務(wù)狀態(tài)切換成事務(wù)狀態(tài),這一切換是通過在客戶端狀態(tài)的flags屬性中打開REDIS_MULTI標(biāo)識完成, 我們看下Redis中對應(yīng)部分的源碼實(shí)現(xiàn):

剖析!Redis事務(wù)實(shí)現(xiàn)原理


在打開事務(wù)標(biāo)識的客戶端里,這些命令都會被暫存到一個(gè)命令隊(duì)列里,不會因?yàn)橛脩魰妮斎攵⒓磮?zhí)行。

第二步就是執(zhí)行事務(wù)內(nèi)路基,即真正的業(yè)務(wù)邏輯:

剖析!Redis事務(wù)實(shí)現(xiàn)原理


最后一個(gè)階段是提交事務(wù)(或者回滾事務(wù)):

剖析!Redis事務(wù)實(shí)現(xiàn)原理


這兩個(gè)命令可被視為等同于關(guān)系型數(shù)據(jù)庫中的COMMIT/ROLLBACK語句。

這里需要注意的是,在客戶端打開了事務(wù)標(biāo)識后,只有命令:EXEC,DISCARD,WATCH,MULTI命令會被立即執(zhí)行,其它命令服務(wù)器不會立即執(zhí)行,而是將這些命令放入到一個(gè)事務(wù)隊(duì)列里面,然后向客戶端返回一個(gè)QUEUED回復(fù) ;Redis客戶端有自己的事務(wù)狀態(tài),這個(gè)狀態(tài)保存在客戶端狀態(tài)mstate屬性中,mstate的結(jié)構(gòu)體類型是multiState,我們看下multiState的定義:

剖析!Redis事務(wù)實(shí)現(xiàn)原理


我們再看下結(jié)構(gòu)體類型multiCmd的結(jié)構(gòu):

剖析!Redis事務(wù)實(shí)現(xiàn)原理


事務(wù)隊(duì)列以先進(jìn)先出的保存方法,較先入隊(duì)的命令會被放到數(shù)組的前面,而較后入隊(duì)的命令則會被放到數(shù)組的后面。

當(dāng)開啟事務(wù)標(biāo)識的客戶端發(fā)送EXEC命令的時(shí)候,服務(wù)器就會執(zhí)行,客戶端對應(yīng)的事務(wù)隊(duì)列里的命令,我們來看下EXEC 的實(shí)現(xiàn)細(xì)節(jié):

剖析!Redis事務(wù)實(shí)現(xiàn)原理


最后我們再回顧一下事務(wù)本身的特性, 在傳統(tǒng)關(guān)系型數(shù)據(jù)庫中的事務(wù)必須依靠ACID來保證事務(wù)的可靠性和安全性,在Redis中事務(wù)總是具有一致性(Consistency)和隔離性(Isolation),并且當(dāng)Redis運(yùn)行在某種特定的持久化模式下,事務(wù)也具有耐久性(Durability); 但是并不總是能夠保證原子性(Atomicity),在正常狀態(tài)下一個(gè)事務(wù)的所有命令是能按照原子性的原則執(zhí)行的,但是執(zhí)行的中途遇到錯(cuò)誤,不會回滾,而是繼續(xù)執(zhí)行后續(xù)命令, 如下:

剖析!Redis事務(wù)實(shí)現(xiàn)原理


如果在set k2 v2處失敗,set k1已成功不會回滾,set k3還會繼續(xù)執(zhí)行;Redis的事務(wù)和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫事務(wù)的最大區(qū)別在于,Redis不支持事務(wù)的回滾機(jī)制,即使事務(wù)隊(duì)列中的某個(gè)命令在執(zhí)行期間出現(xiàn)錯(cuò)誤,整個(gè)事務(wù)也會繼續(xù)執(zhí)行下去,直到將事務(wù)隊(duì)列中的所有命令都執(zhí)行完畢為止,我們看下面的例子:

剖析!Redis事務(wù)實(shí)現(xiàn)原理


Redis的作者在事務(wù)功能的文檔中解釋說,不支持事務(wù)回滾是因?yàn)檫@種復(fù)雜的功能和Redis追求的簡單高效的設(shè)計(jì)主旨不符合,并且他認(rèn)為,Redis事務(wù)的執(zhí)行時(shí),錯(cuò)誤通常都是編程錯(cuò)誤造成的,這種錯(cuò)誤通常只會出現(xiàn)在開發(fā)環(huán)境中,而很少會在實(shí)際的生產(chǎn)環(huán)境中出現(xiàn),所以他認(rèn)為沒有必要為Redis開發(fā)事務(wù)回滾功能。所以我們在討論Redis事務(wù)回滾的時(shí)候,一定要區(qū)分命令發(fā)生錯(cuò)誤的時(shí)候。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏

    評論

    相關(guān)推薦

    華為云 Flexus X 輕松實(shí)現(xiàn) Redis 一主多從高效部署

    ,F(xiàn)lexus?X 預(yù)裝 Redis 加速鏡像,簡化了 Redis 的安裝和配置流程,降低了技術(shù)門檻,使開發(fā)者能夠更專注于業(yè)務(wù)邏輯的實(shí)現(xiàn)。 ????????本文將詳細(xì)介紹如何在華為云 Flexus?X 上
    的頭像 發(fā)表于 12-27 13:45 ?133次閱讀
    華為云 Flexus X 輕松<b class='flag-5'>實(shí)現(xiàn)</b> <b class='flag-5'>Redis</b> 一主多從高效部署

    Redis緩存與Memcached的比較

    Redis和Memcached都是廣泛使用的內(nèi)存數(shù)據(jù)存儲系統(tǒng),它們主要用于提高應(yīng)用程序的性能,通過減少對數(shù)據(jù)庫的直接訪問來加速數(shù)據(jù)檢索。以下是對Redis和Memcached的比較,涵蓋了它們的一些
    的頭像 發(fā)表于 12-18 09:33 ?148次閱讀

    nginx+lua+redis實(shí)現(xiàn)灰度發(fā)布

    作者:馬仁喜 前言: 授人以魚不如授人以漁 .先學(xué)會用,在學(xué)原理,在學(xué)創(chuàng)造,可能一輩子用不到這種能力,但是不能不具備這種能力。這篇文章主要是沉淀使用nginx+lua+redis實(shí)現(xiàn)灰度,當(dāng)我們具備
    的頭像 發(fā)表于 12-17 10:01 ?70次閱讀

    全新NVIDIA NIM微服務(wù)實(shí)現(xiàn)突破性進(jìn)展

    全新 NVIDIA NIM 微服務(wù)實(shí)現(xiàn)突破性進(jìn)展,可助力氣象技術(shù)公司開發(fā)和部署 AI 模型,實(shí)現(xiàn)對降雪、結(jié)冰和冰雹的預(yù)測。
    的頭像 發(fā)表于 11-21 10:07 ?210次閱讀

    Spring事務(wù)實(shí)現(xiàn)原理

    這些操作。 spring事務(wù)有編程式事務(wù)和聲明式事務(wù)兩種實(shí)現(xiàn)方式。編程式事務(wù)是通過編寫代碼來管理事務(wù)
    的頭像 發(fā)表于 11-08 10:10 ?826次閱讀
    Spring<b class='flag-5'>事務(wù)實(shí)現(xiàn)</b>原理

    恒訊科技分析:云數(shù)據(jù)庫rds和redis區(qū)別是什么如何選擇?

    結(jié)構(gòu)化數(shù)據(jù),使用SQL作為查詢語言,支持ACID事務(wù)和多種復(fù)雜查詢操作。而Redis是一個(gè)基于內(nèi)存的非關(guān)系型數(shù)據(jù)庫,采用鍵值對模型存儲數(shù)據(jù),支持豐富的數(shù)據(jù)結(jié)構(gòu)如字符串、列表、集合、哈希表等。 2、性能:Redis以其超快的速度而
    的頭像 發(fā)表于 08-19 15:31 ?398次閱讀

    Redis 開源協(xié)議調(diào)整,我們怎么辦?

    2 024 年 3 月 20 日, Redis 官方宣布,從 Redis 7.4 版本開始,Redis 將獲得源可用許可證 ( RSALv2 ) 和服務(wù)器端公共許可證 ( SSPLv1 ) 的雙重
    的頭像 發(fā)表于 05-09 22:59 ?436次閱讀
    <b class='flag-5'>Redis</b> 開源協(xié)議調(diào)整,我們怎么辦?

    Redis開源版與Redis企業(yè)版,怎么選用?

    點(diǎn)擊“藍(lán)字”關(guān)注我們數(shù)以千計(jì)的企業(yè)和數(shù)以百萬計(jì)的開發(fā)人員Redis開源版來構(gòu)建應(yīng)用程序。但隨著用戶數(shù)量、數(shù)據(jù)量和地區(qū)性的增加,成本、可擴(kuò)展性、運(yùn)營和可用性等問題也隨之而來。Redis企業(yè)版
    的頭像 發(fā)表于 04-04 08:04 ?1073次閱讀
    <b class='flag-5'>Redis</b>開源版與<b class='flag-5'>Redis</b>企業(yè)版,怎么選用?

    GaussDB(for Redis) 特性揭秘:大 key 治理

    ? 從 DBA 的視角看,大 Key 無疑是引起 Redis 線上問題的常見原因。為了解決大 Key 隱患,業(yè)務(wù)首先要遵守合理的開發(fā)規(guī)范,減少大 Key 的產(chǎn)生和訪問依賴。但有時(shí)大 Key 是在程序
    的頭像 發(fā)表于 03-28 22:06 ?667次閱讀
    GaussDB(for <b class='flag-5'>Redis</b>) 特性揭秘:大 key 治理

    GaussDB(for Redis) 游戲?qū)嵺`:玩家下線行為上報(bào)

    實(shí)現(xiàn)以上功能時(shí),感知用戶下線行為延遲較大,導(dǎo)致上報(bào)時(shí)間不準(zhǔn)確。華為云 GaussDB(for Redis)作為一款企業(yè)級游戲數(shù)據(jù)庫,具備卓越的企業(yè)級能力,能及時(shí)上報(bào)用戶下線行為,并被廣泛應(yīng)用于排行榜等多種業(yè)務(wù)場景。 基于 Redis
    的頭像 發(fā)表于 03-28 22:03 ?522次閱讀

    新版 Redis 不再“開源”,對使用者都有哪些影響?

    2024 年 3 月 20 日,Redis Labs 宣布從 Redis 7.4 開始,將原先比較寬松的 BSD 源碼使用協(xié)議修改為 RSAv2和 SSPLv1協(xié)議。該變化意味著 Redis
    的頭像 發(fā)表于 03-27 22:30 ?494次閱讀
    新版 <b class='flag-5'>Redis</b> 不再“開源”,對使用者都有哪些影響?

    Redis實(shí)現(xiàn)分布式多規(guī)則限流的方式介紹

    市面上很多介紹 Redis 如何實(shí)現(xiàn)限流的,但是大部分都有一個(gè)缺點(diǎn),就是只能實(shí)現(xiàn)單一的限流,比如 1 分鐘訪問 1 次或者 60 分鐘訪問 10 次這種,但是如果想一個(gè)接口兩種規(guī)則都需要滿足呢,我們的項(xiàng)目又是分布式項(xiàng)目,應(yīng)該如何
    的頭像 發(fā)表于 02-26 10:07 ?499次閱讀
    <b class='flag-5'>Redis</b><b class='flag-5'>實(shí)現(xiàn)</b>分布式多規(guī)則限流的方式介紹

    Redis官方搜索引擎來了,性能炸裂!

    RediSearch 是一個(gè) Redis 模塊,為 Redis 提供查詢、二級索引和全文搜索功能。
    的頭像 發(fā)表于 02-21 10:01 ?2365次閱讀
    <b class='flag-5'>Redis</b>官方搜索引擎來了,性能炸裂!

    Redis可以實(shí)現(xiàn)消息中間件MQ的功能

    是一種通信模式:發(fā)送者(PUBLISH)發(fā)送消息,訂閱者(SUBSCRIBE)接收消息,可以實(shí)現(xiàn)進(jìn)程間的消息傳遞   Redis可以實(shí)現(xiàn)消息中間件MQ的功能,通過發(fā)布訂閱實(shí)現(xiàn)消息
    的頭像 發(fā)表于 01-25 14:48 ?942次閱讀
    <b class='flag-5'>Redis</b>可以<b class='flag-5'>實(shí)現(xiàn)</b>消息中間件MQ的功能

    騰訊科技獲區(qū)塊鏈網(wǎng)絡(luò)事務(wù)處理專利

    據(jù)專利摘要介紹,此方法涉及的步驟可概括如下:收集待處理事務(wù)數(shù)據(jù)集的統(tǒng)計(jì)信息,此數(shù)據(jù)集含有多個(gè)接收并待處理的事務(wù)數(shù)據(jù);制定獲取區(qū)塊鏈網(wǎng)絡(luò)對事務(wù)數(shù)據(jù)的打包標(biāo)準(zhǔn);如果統(tǒng)計(jì)信息符合打包要求,將事務(wù)
    的頭像 發(fā)表于 01-08 11:36 ?566次閱讀