說一下redis事務底層原理

Redis事務

1. 事務的基本流程

Redis 事務通過 MULTIEXECWATCH 等命令實現,底層原理可以分為以下幾個步驟:

(1) MULTI 命令
  • 當客戶端發送 MULTI 命令時,Redis 會將客戶端標記為“事務模式”。
  • 在事務模式下,客戶端發送的所有命令不會立即執行,而是被放入一個隊列(命令隊列)中。
(2) 命令入隊
  • MULTIEXEC 之間,客戶端發送的所有命令都會被追加到事務隊列中。
  • 這些命令不會立即執行,而是等待 EXEC 命令的觸發。
(3) EXEC 命令
  • 當客戶端發送 EXEC 命令時,Redis 會依次執行事務隊列中的所有命令。
  • 執行過程中,所有命令是原子的,不會被其他客戶端的命令打斷。
(4) WATCH 命令
  • WATCH 命令用于實現樂觀鎖。
  • 當客戶端對一個或多個鍵執行 WATCH 后,如果在 EXEC 執行之前,這些鍵被其他客戶端修改,則當前事務會失敗(返回 nil

watch我們可以指定監聽一個鍵和多個鍵,然后exec批量執行

WATCH key [key ...]

2. 事務的原子性

  • Redis 事務的原子性是通過單線程模型實現的。
  • Redis 是單線程的,所有命令都是順序執行的。在 EXEC 執行時,事務隊列中的命令會連續執行,不會被其他客戶端的命令打斷。

3. 事務的一致性

  • Redis 事務的一致性是通過 WATCH 機制實現的。
  • 如果 WATCH 的鍵在事務執行期間被修改,事務會失敗,從而保證數據的一致性。

4. 事務的局限性

  • 不支持回滾:如果事務中的某個命令失敗,其他命令仍然會執行,Redis 不會自動回滾。
  • 部分失敗問題:事務中的命令可能會部分成功、部分失敗。
  • 性能開銷WATCH 機制會增加額外的性能開銷。

Redis 7 對事務的優化

Redis 7 在事務機制上并沒有完全改變底層實現,但引入了一些優化和改進:

1. 性能優化

  • Redis 7 對事務的執行流程進行了優化,減少了事務模式下的性能開銷。
  • 通過改進命令隊列的處理方式,提高了事務的執行效率。

2. Lua 腳本的增強

  • Redis 7 對 Lua 腳本的支持進行了增強,使得 Lua 腳本可以更好地與事務結合使用。
  • Lua 腳本在 Redis 7 中的執行效率更高,同時支持更多的 Redis 命令。

3. 更好的錯誤處理

  • Redis 7 改進了事務中的錯誤處理機制,使得事務失敗時的錯誤信息更加清晰。
  • 如果事務中的某個命令失敗,Redis 7 會返回更詳細的錯誤信息,方便排查問題。

4. 功能增強

  • Redis 7 引入了更多的命令和功能,可以與事務結合使用。
  • 例如,Redis 7 支持更多的數據類型和操作,使得事務可以處理更復雜的場景。

Redis 事務的底層實現細節

1. 命令隊列

  • 在事務模式下,Redis 會為每個客戶端維護一個命令隊列。
  • 所有在 MULTIEXEC 之間發送的命令都會被追加到隊列中。

2. 事務執行

  • EXEC 命令被觸發時,Redis 會依次執行命令隊列中的所有命令。
  • 執行過程中,Redis 會保證命令的原子性,不會被其他客戶端的命令打斷。

3. WATCH 機制

  • WATCH 命令會監視一個或多個鍵。
  • 如果在 EXEC 執行之前,這些鍵被其他客戶端修改,則當前事務會失敗。
  • WATCH 的實現基于 Redis 的鍵空間通知機制。

總結

  • Redis 事務的底層原理 是基于 MULTI/EXEC/WATCH 機制,通過命令隊列和樂觀鎖實現原子性和一致性。
  • Redis 7 在事務機制上進行了性能優化和功能增強,但底層實現并沒有本質變化。
  • Redis 事務的局限性 包括不支持回滾、部分失敗問題和性能開銷。
  • 如果需要更強大的事務支持,可以結合 Lua 腳本或使用支持 ACID 事務的數據庫。

Redis+Lua腳本實現手動回滾補償

我們每一步執行失敗,我們就依次撤銷前面的操作

可惜這個并不是真正的acid,我們的mysql執行事務的時候宕機了,它的事務沒有提交所以數據并不會進到mysql里面

而redis是人為控制的,所以我們執行lua腳本的時候宕機了,我們之前事務中執行的操作數據仍然進去了,這個是我們無法解決的

local key1 = KEYS[1]
local key2 = KEYS[2]
local key3 = KEYS[3]
local value = ARGV[1]-- 記錄原始值
local original_value1 = redis.call('GET', key1)
local original_value2 = redis.call('GET', key2)
local original_value3 = redis.call('GET', key3)-- 第一步操作
redis.call('SET', key1, value)-- 第二步操作
if redis.call('EXISTS', key2) == 0 then-- 手動回滾第一步操作redis.call('SET', key1, original_value1)return "Key2 does not exist"
end
redis.call('SET', key2, value)-- 第三步操作
if redis.call('EXISTS', key3) == 0 then-- 手動回滾前兩步操作redis.call('SET', key1, original_value1)redis.call('SET', key2, original_value2)return "Key3 does not exist"
end
redis.call('SET', key3, value)return "Transaction successful"

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72488.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72488.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72488.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【我的Android進階之旅】如何使用NanoHttpd在Android端快速部署一個HTTP服務器?

文章目錄 開篇:程序員的"摸魚神器"?一、為什么選擇NanoHttpd?二、五分鐘極速上車指南2.1 ? 第一步:引入依賴的哲學2.2 ? 第二步:創建服務器類:繼承大法好2.3 ? 第三步:啟動服務的儀式感三、高級玩法:讓服務器不再單調3.1 ?? 場景1:變身文件服務器3.2 ?…

播放器系列3——解碼

FFmpeg解碼過程詳解 解碼流程 #mermaid-svg-FGu92IEtteOdO2tO {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FGu92IEtteOdO2tO .error-icon{fill:#552222;}#mermaid-svg-FGu92IEtteOdO2tO .error-text{fill:#5522…

SimPO算法-Simple Preference Optimizationwith a Reference-Free Reward

偏好優化(preference optimization )算法大全: 本篇介紹下SimPO SimPO(Simple Preference Optimization)的設計核心在于簡化偏好優化過程,同時提升模型的表現。其設計主要圍繞兩個關鍵點展開:長…

AIGC時代:如何快速搞定Spring Boot+Vue全棧開發

文章目錄 一、Spring Boot基礎二、Vue.js基礎三、Spring Boot與Vue.js集成四、性能優化與最佳實踐《快速搞定Spring BootVue全棧開發》 內容簡介作者簡介目錄前言/序言本書內容本書特點讀者對象 隨著人工智能生成內容(AIGC)技術的迅速發展,…

探秘基帶算法:從原理到5G時代的通信變革【六】CRC 校驗

文章目錄 2.5 CRC 校驗2.5.1 前言2.5.2 CRC算法簡介2.5.3 CRC計算的詳細過程2.5.4 CRC校驗的兩種方法詳解**分離比較法****整體運算法****不同位出錯與余數的關系****總結** 2.5.5 CRC計算的C實現及工具介紹**C實現CRC計算****CRC計算工具推薦** **2.5.6 總結:CRC校…

AUTOSAR微控制器抽象層(MCAL)詳解及綜合實例

目錄 1. 微控制器抽象層(MCAL)概述 1.1 MCAL的核心功能 1.2 MCAL的模塊劃分 1.3 MCAL的工作流程 2. MCAL的詳細功能解析 2.1 微控制器驅動 2.1.1 時鐘配置 2.1.2 電源管理 2.1.3 實例:時鐘配置 2.2 通信驅動 2.2.1 CAN驅動 2.2.2 實例:CAN通信的實現 2.3 I/O驅…

探究高空視頻全景AR技術的實現原理

1. 引言 筆者認為現階段AR技術的應用是還是比較坑爹的,大都是噱頭多但是實用的成分少,拿出來做做DEMO是可以,但是難以在實際的項目中落地產生實際的經濟價值。一方面是很難在業務上難以找到合適的應用場景(可能管線相關的項目算一…

深度解析 | 2025 AI新突破,物理信息神經網絡(PINN):Nature級頂刊的「科研加速器」,70份源碼論文速取!

🔥 為什么全球頂尖實驗室都在押注PINN? 過去一年,物理信息神經網絡(PINN,Physics-Informed Neural Networks)以「現象級」姿態席卷科研圈:不僅在NeurIPS、ICML等頂會橫掃15%相關論文&#xff0c…

0基礎學前端---品優購項目Day14

0基礎學前端—品優購項目Day14 視頻參考:B站Pink老師 本節重點:all 項目鏈接:完整的項目已放到 品優購完整項目 大家可以自行下載 強調內容 這里主要強調兩個知識點: (1) 網站TDK三個標簽SEO優化 (2) logo SEO優化 網站TDK三個…

LeetCode熱題100JS(37/100)第七天|排序鏈表|合并K個升序鏈表|LRU緩存|二叉樹的中序遍歷|二叉樹的最大深度|對稱二叉樹

148. 排序鏈表 題目鏈接:???????148. 排序鏈表 難度:中等 刷題狀態:1刷 新知識: - dic.reduceRight((t,c)>(c.nextt,c),null) 方法從數組的末尾開始執行 解題過程 思考 示例 1: 輸入:head […

課程2. 機器學習方法論

課程2. 機器學習方法論 訓練算法并評估其質量將樣本分成訓練和測試。分層 交叉驗證方法sklearn 接口算法模型訓練模型的應用質量評估 數據預處理標準縮放Violinplot 數據集使用模型Pipeline 在上一講中,我們討論了機器學習專家面臨的挑戰。無論解決的問題類型和解決…

六足仿生機器人地形自適應步態規劃研究

六足仿生機器人地形自適應步態規劃研究 第1章 緒論第2章 機器人系統建模第3章 地形感知與建模第4章 自適應步態生成算法第5章 動力學仿真與實驗第6章 驅動代碼設計與實現源碼&文檔鏈接 第1章 緒論 1.1 研究背景與意義 1.2 國內外研究現狀 1.2.1 多足機器人步態規劃 1.2.2 …

mysql表分區

本文簡述了mysql表分區的作用和特點,又演示了mysql表分區的創建過程,詳細演示了指定不同分區目錄時的處理辦法。由于表分區對crud操作是透明的,對于普通開發同學其實不用過多關注,但是本著學習的態度,在分庫分表等高大…

Nessus安裝

Nessus:https://pan.quark.cn/s/f5fb09b6d4fb 1.軟件安裝 點擊安裝,剩下的下一步即可。 直接下一步安裝即可 2.Web端安裝 會彈出一個web窗口 開始初始化 創建用戶 開始初始化 3.Cracker 會彈一個黑窗口 運行完,回車即可。訪問https://loc…

26-小迪安全-模塊引用,mvc框架,渲染,數據聯動0-rce安全

先創建一個新聞需要的庫 這樣id值可以逐級遞增 然后隨便寫個值,讓他輸出一下看看 模板引入 但是這樣不夠美觀,這就涉及到了引入html模板 模板引入是html有一個的地方值可以通過php代碼去傳入過去,其他的html界面直接調用,這樣頁…

第十三屆藍橋杯大賽軟件賽決賽C/C++ 大學 B 組

A 【2022——暴力DP / 優雅背包】-CSDN博客 B 【鐘表——類日期問題】-CSDN博客 C 【卡牌——二分】-CSDN博客 D 【最大數字——DFS】-CSDN博客 E 【出差——Dijkstra】-CSDN博客 F 【費用報銷——01背包】-CSDN博客 G 【故障——條件概率】-CSDN博客 H 【機房—…

樹莓集團最新現狀更新:南京園區業務的創新與突破

樹莓集團在南京的園區業務呈現出蓬勃發展的態勢,不斷實現創新與突破。 在產業布局方面,南京園區進一步優化了產業結構。除了繼續鞏固數字影像、數字娛樂等傳統優勢領域外,還積極拓展了數字金融、數字教育等新興領域。吸引了一批知名的數字金融…

Linux網絡編程(20250301)

網絡通信:進行不同主機的進程間通信 解決硬件與軟件的互聯互通 主機-->交換機-->路由器-->廣域網-->路由器-->交換機-->主機 IP地址:區分不同主機 MAC地址:計算機硬件地址 端口號:區分主機上的不同進程 1…

【JavaScript】《JavaScript高級程序設計 (第4版) 》筆記-附錄B-嚴格模式

附錄B、嚴格模式 嚴格模式 ECMAScript 5 首次引入嚴格模式的概念。嚴格模式用于選擇以更嚴格的條件檢查 JavaScript 代碼錯誤,可以應用到全局,也可以應用到函數內部。嚴格模式的好處是可以提早發現錯誤,因此可以捕獲某些 ECMAScript 問題導致…

藍橋試題:混境之地(記憶化搜索)

一、問題描述 小藍有一天誤入了一個混境之地。 好消息是:他誤打誤撞拿到了一張地圖,并從中獲取到以下信息: 混境之地是一個n?m 大小的矩陣,其中第 i 行第 j 列的的點 h i j? 表示第 i 行第 j 列的高度。他現在所在位置的坐標…