在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

剖析!Redis事務實現原理

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

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

整理 | 包包

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

在Redis中實現事務主要依靠以下幾個命令來實現:

剖析!Redis事務實現原理


Redis事務從開始到結束通常會通過三個階段:

1.事務開始

2.命令入隊

3.事務執行

以下是一個最簡單的Redis事務流程:

剖析!Redis事務實現原理


第一步跟其他的關系型數據庫類似,也是需要開啟一個事務,在Redis中的命令如下:

剖析!Redis事務實現原理


Redis中使用MULTI命令標記事務的開始,可以理解為在傳統關系型數據庫中的BEGIN TRANCATION語句,Redis將執行該命令的客戶端從非事務狀態切換成事務狀態,這一切換是通過在客戶端狀態的flags屬性中打開REDIS_MULTI標識完成, 我們看下Redis中對應部分的源碼實現:

剖析!Redis事務實現原理


在打開事務標識的客戶端里,這些命令都會被暫存到一個命令隊列里,不會因為用戶會的輸入而立即執行。

第二步就是執行事務內路基,即真正的業務邏輯:

剖析!Redis事務實現原理


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

剖析!Redis事務實現原理


這兩個命令可被視為等同于關系型數據庫中的COMMIT/ROLLBACK語句。

這里需要注意的是,在客戶端打開了事務標識后,只有命令:EXEC,DISCARD,WATCH,MULTI命令會被立即執行,其它命令服務器不會立即執行,而是將這些命令放入到一個事務隊列里面,然后向客戶端返回一個QUEUED回復 ;Redis客戶端有自己的事務狀態,這個狀態保存在客戶端狀態mstate屬性中,mstate的結構體類型是multiState,我們看下multiState的定義:

剖析!Redis事務實現原理


我們再看下結構體類型multiCmd的結構:

剖析!Redis事務實現原理


事務隊列以先進先出的保存方法,較先入隊的命令會被放到數組的前面,而較后入隊的命令則會被放到數組的后面。

當開啟事務標識的客戶端發送EXEC命令的時候,服務器就會執行,客戶端對應的事務隊列里的命令,我們來看下EXEC 的實現細節:

剖析!Redis事務實現原理


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

剖析!Redis事務實現原理


如果在set k2 v2處失敗,set k1已成功不會回滾,set k3還會繼續執行;Redis的事務和傳統的關系型數據庫事務的最大區別在于,Redis不支持事務的回滾機制,即使事務隊列中的某個命令在執行期間出現錯誤,整個事務也會繼續執行下去,直到將事務隊列中的所有命令都執行完畢為止,我們看下面的例子:

剖析!Redis事務實現原理


Redis的作者在事務功能的文檔中解釋說,不支持事務回滾是因為這種復雜的功能和Redis追求的簡單高效的設計主旨不符合,并且他認為,Redis事務的執行時,錯誤通常都是編程錯誤造成的,這種錯誤通常只會出現在開發環境中,而很少會在實際的生產環境中出現,所以他認為沒有必要為Redis開發事務回滾功能。所以我們在討論Redis事務回滾的時候,一定要區分命令發生錯誤的時候。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    【經驗分享】在Omni3576上編譯Redis-8.0.2源碼,并安裝及性能測試

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

    【幸狐Omni3576邊緣計算套件試用體驗】Redis最新8.0.2版本源碼安裝及性能測試

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

    Redis 再次開源!

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

    redis三種集群方案詳解

    Redis中提供的集群方案總共有三種(一般一個redis節點不超過10G內存)。
    的頭像 發表于 03-31 10:46 ?592次閱讀
    <b class='flag-5'>redis</b>三種集群方案詳解

    Redis實戰筆記

    在目前的技術選型中,Redis 儼然已經成為了系統高性能緩存方案的事實標準,因此現在?Redis 也成為了后端開發的基本技能樹之一。 ? 基于上述情況,今天給大家分享一份?杰哥?親筆撰寫的內部
    的頭像 發表于 02-09 09:12 ?336次閱讀
    <b class='flag-5'>Redis</b>實戰筆記

    華為云 Flexus X 加速 Redis 案例實踐與詳解

    Redis 加速鏡像,更是為開發者提供了極大的便利。本文將詳細介紹如何利用華為云 Flexus X 實例自帶的 Redis 鏡像,快速部署并配置 Redis,以及通過實際案例展示其便捷性和高效性。 一、華為云 Flexus
    的頭像 發表于 01-23 17:52 ?282次閱讀
    華為云 Flexus X 加速 <b class='flag-5'>Redis</b> 案例實踐與詳解

    Redis Cluster之故障轉移

    1. Redis Cluster 簡介 Redis Cluster 是 Redis 官方提供的 Redis 集群功能。 為什么要實現
    的頭像 發表于 01-20 09:21 ?795次閱讀
    <b class='flag-5'>Redis</b> Cluster之故障轉移

    云服務器 Flexus X 實例,Docker 集成搭建 Redis 集群

    Redis 集群是一種分布式的 Redis 解決方案,能夠在多個節點之間分片存儲數據,實現水平擴展和高可用性。與傳統的主從架構不同,Redis 集群支持數據自動分片、主節點故障自動切換
    的頭像 發表于 01-13 13:37 ?325次閱讀
    云服務器 Flexus X 實例,Docker 集成搭建 <b class='flag-5'>Redis</b> 集群

    華為云Flexus X實例,Redis性能加速評測及對比

    隨著云計算技術的飛速發展,Redis 作為一種高性能的內存數據庫,在各種應用場景中發揮著越來越重要的作用。為了滿足不同用戶對 Redis 性能的高要求,華為云推出了 Flexus X 實例,并提供了
    的頭像 發表于 12-29 15:47 ?442次閱讀
    華為云Flexus X實例,<b class='flag-5'>Redis</b>性能加速評測及對比

    華為云 Flexus X 輕松實現 Redis 一主多從高效部署

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

    Redis緩存與Memcached的比較

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

    nginx+lua+redis實現灰度發布

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

    全新NVIDIA NIM微服務實現突破性進展

    全新 NVIDIA NIM 微服務實現突破性進展,可助力氣象技術公司開發和部署 AI 模型,實現對降雪、結冰和冰雹的預測。
    的頭像 發表于 11-21 10:07 ?616次閱讀

    Spring事務實現原理

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

    恒訊科技分析:云數據庫rds和redis區別是什么如何選擇?

    結構化數據,使用SQL作為查詢語言,支持ACID事務和多種復雜查詢操作。而Redis是一個基于內存的非關系型數據庫,采用鍵值對模型存儲數據,支持豐富的數據結構如字符串、列表、集合、哈希表等。 2、性能:Redis以其超快的速度而
    的頭像 發表于 08-19 15:31 ?756次閱讀
    主站蜘蛛池模板: 麻豆三级在线播放 | 日本免费观看完整视频 | 亚洲成色999久久网站 | 中文字幕精品一区 | 91精品国产色综合久久不卡蜜 | 免费高清在线观看a网站 | 天天干天天操天天做 | 久久久久免费 | 婷婷激情电影 | dy天堂| 日本免费一区二区三区视频 | 羞羞色男人的天堂伊人久久 | 国产拳头交一区二区 | 人人舔人人爱 | 四虎影院精品 | 久久综合九色综合网站 | 天天天天射 | 人与牲动交xx| 老湿司午夜爽爽影院榴莲视频 | 欧美一级免费观看 | 欧美xxxxbbbb | 国产精品久久在线观看 | 四虎最新网址 | 狠狠躁夜夜躁人人躁婷婷视频 | 美女黄18以下禁止观看 | 1024 在线观看视频免费 | 中文字幕在线资源 | 欧美黄色片在线 | 国产三级在线免费 | 黄网站在线观看高清免费 | 国产成人精品一区 | 国产视频第一页 | 天天爱夜夜操 | 欧美久操 | 一区二区三区中文字幕 | 日日夜夜狠狠 | 久久网综合 | 欧美黄色片网站 | 四虎影院国产 | 丁香六月婷婷七月激情 | 国产三级日本三级日产三 |