91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

張康康 ? 2019-07-29 18:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

整理 | 包包

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

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

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


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

1.事務(wù)開始

2.命令入隊(duì)

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

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

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


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

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


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

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


在打開事務(wù)標(biāo)識(shí)的客戶端里,這些命令都會(huì)被暫存到一個(gè)命令隊(duì)列里,不會(huì)因?yàn)橛脩魰?huì)的輸入而立即執(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ù)庫(kù)中的COMMIT/ROLLBACK語(yǔ)句。

這里需要注意的是,在客戶端打開了事務(wù)標(biāo)識(shí)后,只有命令:EXEC,DISCARD,WATCH,MULTI命令會(huì)被立即執(zhí)行,其它命令服務(wù)器不會(huì)立即執(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)原理


我們?cè)倏聪陆Y(jié)構(gòu)體類型multiCmd的結(jié)構(gòu):

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


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

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

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


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

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


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

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


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


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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Redis哨兵模式的自動(dòng)故障檢測(cè)與主從切換實(shí)戰(zhàn)

    Redis 主從復(fù)制解決了讀擴(kuò)展和數(shù)據(jù)冗余問(wèn)題,但主節(jié)點(diǎn)故障時(shí)需要人工介入切換,這在生產(chǎn)環(huán)境中是不可接受的。Sentinel(哨兵)模式在主從架構(gòu)之上增加了自動(dòng)故障檢測(cè)和故障轉(zhuǎn)移能力,是 Redis 高可用的標(biāo)準(zhǔn)方案之一。
    的頭像 發(fā)表于 02-27 11:05 ?120次閱讀

    Redis內(nèi)存管理、持久化策略與慢查詢排查分析

    Redis 在生產(chǎn)環(huán)境中承擔(dān)著緩存、會(huì)話存儲(chǔ)、消息隊(duì)列、分布式鎖等多種角色。隨著數(shù)據(jù)量增長(zhǎng)和并發(fā)壓力上升,內(nèi)存碎片、持久化 I/O 抖動(dòng)、慢查詢堆積這三類問(wèn)題會(huì)逐漸顯現(xiàn),直接影響服務(wù)延遲和穩(wěn)定性。Redis 8.x 在內(nèi)存管理和持久化機(jī)制上做了若干改進(jìn),但核心調(diào)優(yōu)思路與
    的頭像 發(fā)表于 02-27 11:00 ?120次閱讀

    并發(fā)丟數(shù)據(jù)深度剖析:MySQL鎖機(jī)制與事務(wù)實(shí)戰(zhàn)踩坑及解決方案

    1、理論來(lái)源于實(shí)踐 現(xiàn)象 :于2025-08-13 21:45:35,事實(shí)邏輯表將自身的指標(biāo)與維度同步到原子服務(wù)的實(shí)現(xiàn)時(shí),出現(xiàn)同步過(guò)來(lái)的指標(biāo)與維度丟失。 核心原因 :兩次重復(fù)的事實(shí)邏輯表同步時(shí)間非常
    的頭像 發(fā)表于 11-10 19:00 ?588次閱讀
    并發(fā)丟數(shù)據(jù)深度<b class='flag-5'>剖析</b>:MySQL鎖機(jī)制與<b class='flag-5'>事務(wù)實(shí)</b>戰(zhàn)踩坑及解決方案

    NVMe高速傳輸之?dāng)[脫XDMA設(shè)計(jì)28: TLP 事務(wù)處理程序的執(zhí)行流程

    最小橋設(shè)備模型的每個(gè)端口的輸入端對(duì)接一個(gè) TLP事務(wù)處理程序, 該程序負(fù)責(zé)將接收到的 TLP 事務(wù)進(jìn)行解析和路由轉(zhuǎn)發(fā)。
    的頭像 發(fā)表于 09-23 09:13 ?1065次閱讀
    NVMe高速傳輸之?dāng)[脫XDMA設(shè)計(jì)28: TLP <b class='flag-5'>事務(wù)</b>處理程序的執(zhí)行流程

    NVMe高速傳輸之?dāng)[脫XDMA設(shè)計(jì)28: TLP 事務(wù)處 理程序的執(zhí)行流程

    的上游端口時(shí), 該響應(yīng)類型事務(wù)需要根據(jù)事務(wù)中的請(qǐng)求 ID字段與配置空間封裝類中的相關(guān)字段進(jìn)行比較, 實(shí)現(xiàn)基于 ID 的路由; 如果對(duì)應(yīng)接收端口號(hào)不為 0, 表示該響應(yīng)類型事務(wù)來(lái)自下游端
    發(fā)表于 09-21 08:51

    深度剖析Redis的兩大持久化機(jī)制

    凌晨3點(diǎn),我被一通緊急電話驚醒。線上Redis集群崩潰,6GB的緩存數(shù)據(jù)全部丟失,導(dǎo)致MySQL瞬間承壓暴增,整個(gè)交易系統(tǒng)陷入癱瘓。事后復(fù)盤發(fā)現(xiàn),問(wèn)題的根源竟是一個(gè)被忽視的持久化配置細(xì)節(jié)。
    的頭像 發(fā)表于 09-17 16:22 ?542次閱讀

    Redis Sentinel和Cluster模式如何選擇

    在我十年的運(yùn)維生涯中,見過(guò)太多團(tuán)隊(duì)在Redis集群方案選擇上踩坑。有的團(tuán)隊(duì)盲目追求"高大上"的Cluster模式,結(jié)果運(yùn)維復(fù)雜度爆表;有的團(tuán)隊(duì)死守Sentinel不放,最后擴(kuò)展性成了瓶頸。今天,我想通過(guò)這篇萬(wàn)字長(zhǎng)文,把我在生產(chǎn)環(huán)境中積累的經(jīng)驗(yàn)全部分享給你。
    的頭像 發(fā)表于 09-08 09:31 ?577次閱讀

    Redis集群部署配置詳解

    Redis集群是一種分布式Redis解決方案,通過(guò)數(shù)據(jù)分片和主從復(fù)制實(shí)現(xiàn)高可用性和橫向擴(kuò)展。集群將整個(gè)數(shù)據(jù)集分割成16384個(gè)哈希槽(hash slots),每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分槽位。
    的頭像 發(fā)表于 07-17 11:04 ?972次閱讀

    Redis集群部署與性能優(yōu)化實(shí)戰(zhàn)

    Redis作為高性能的內(nèi)存數(shù)據(jù)庫(kù),在現(xiàn)代互聯(lián)網(wǎng)架構(gòu)中扮演著關(guān)鍵角色。作為運(yùn)維工程師,掌握Redis的部署、配置和優(yōu)化技能至關(guān)重要。本文將從實(shí)戰(zhàn)角度出發(fā),詳細(xì)介紹Redis集群的搭建、性能優(yōu)化以及監(jiān)控運(yùn)維的核心技術(shù)。
    的頭像 發(fā)表于 07-08 17:56 ?847次閱讀

    如何部署流媒體服務(wù)實(shí)現(xiàn)監(jiān)控功能--基于米爾TI AM62x開發(fā)板

    本文將介紹基于米爾電子MYD-YM62X開發(fā)板(米爾基于TIAM62開發(fā)板)的部署流媒體服務(wù)實(shí)現(xiàn)監(jiān)控功能方案的開發(fā)測(cè)試。摘自優(yōu)秀創(chuàng)作者-HonestQiao米爾-TIAM62x開發(fā)板除了可以用官方
    的頭像 發(fā)表于 07-03 08:03 ?2914次閱讀
    如何部署流媒體服<b class='flag-5'>務(wù)實(shí)現(xiàn)</b>監(jiān)控功能--基于米爾TI AM62x開發(fā)板

    【經(jīng)驗(yàn)分享】在Omni3576上編譯Redis-8.0.2源碼,并安裝及性能測(cè)試

    本文首先介紹Redis是什么,然后介紹如何在Omni3576上編譯Redis-8.0.2源碼,以及從源碼編譯、安裝Redis,最后介紹如何在Omni3576上運(yùn)行Redis性能測(cè)試,并
    的頭像 發(fā)表于 06-05 08:05 ?973次閱讀
    【經(jīng)驗(yàn)分享】在Omni3576上編譯<b class='flag-5'>Redis</b>-8.0.2源碼,并安裝及性能測(cè)試

    【幸狐Omni3576邊緣計(jì)算套件試用體驗(yàn)】Redis最新8.0.2版本源碼安裝及性能測(cè)試

    本文首先介紹Redis是什么,然后介紹如何在Omni3576上編譯Redis-8.0.2源碼,以及從源碼編譯、安裝Redis,最后介紹如何在Omni3576上運(yùn)行Redis性能測(cè)試,并
    發(fā)表于 06-03 01:28

    Redis 再次開源!

    “ ?Redis 現(xiàn)已采用 AGPLv3 開源許可證。? ” Redis CEO 的 Blog 以下是 Redis CEO Rowan Trollope 的 Blog: 像 AWS 和 GCP 這樣
    的頭像 發(fā)表于 05-06 18:26 ?927次閱讀

    電機(jī)故障診斷常見誤區(qū)的剖析

    純分享帖,需要者可點(diǎn)擊附件獲取完整資料~~~*附件:電機(jī)故障診斷常見誤區(qū)的剖析.pdf (免責(zé)聲明:本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)第一時(shí)間告知,刪除內(nèi)容?。?
    發(fā)表于 04-07 17:35

    redis三種集群方案詳解

    Redis中提供的集群方案總共有三種(一般一個(gè)redis節(jié)點(diǎn)不超過(guò)10G內(nèi)存)。
    的頭像 發(fā)表于 03-31 10:46 ?1526次閱讀
    <b class='flag-5'>redis</b>三種集群方案詳解