Redis 事務機制

文章目錄

  • 一、什么是事務?
  • 二、事務相關操作
    • 總體認識
    • 基本操作流程
    • watch 操作演示
    • watch 原理

一、什么是事務?

Redis 的事務和 MySQL 的事務概念上是類似的. 都是把?系列操作綁定成?組. 讓這?組能夠批量執?.
Redis 的事務和 MySQL 事務的區別:

  • 弱化的原?性: redis 沒有 “回滾機制”. 只能做到這些操作 “批量執?”. 不能做到 “?個失敗就恢復到初始狀態”.
  • 不保證?致性: 不涉及 “約束”. 也沒有回滾. MySQL 的?致性體現的是運?事務前和運?后結果都是合理有效的, 不會出現中間?法狀態.
  • 不需要隔離性: 也沒有隔離級別, 因為不會并發執?事務 (redis 單線程處理請求) .
  • 不需要持久性: 是保存在內存的. 是否開啟持久化, 是redis-server ??的事情, 和事務?關.

關于 Redis 事務原子性的爭議
爭議點主要在于 原子性 的定義到底是把命令打包一起執行即可還是在此基礎上必須具備 MySQL事務的回滾機制

Redis 事務理解
Redis 事務本質上是把一系列命令插入到 “事務隊列中”。每次客戶端在事務中進??個操作, 都會把命令先發給服務器, 放到 “事務隊列” 中(但是并不會立即執行)。等遇到 EXEC 命令之后,才會按照隊列順序依次執行命令。

Redis 事務的使用場景
秒殺(搶票)

在搶票場景中需要注意的是 “超賣” 問題。就比如我最多只能 500 張票,但我的買票系統讓 501 個人都買到票了,這就是“超賣”問題。這種問題是由于線程競爭資源導致的。傳統的解決方式是加鎖,這里介紹通過 Redis 事務解決方案。

使用 redis 事務機制的話,就可以把 獲取票數、判斷 票數大于 0和票數減一 這三個操作打包成一個事務,再加上 Redis 服務器本身是 單線程模型,這樣就可以保證不會出現競爭資源導致的超賣問題。

二、事務相關操作

總體認識

事務的核心操作就是 MULTI(開啟事務)、EXEC(真正執行事務)、DISCARD(放棄事務)、WATCH(監控 key 的變化)

  • MULTI : 開啟一個事務,執行成功返回 OK
  • EXEC: 執行這條命令后,將真正執行 “事務隊列” 中存放的命令
  • DISCARD: 放棄當前事務,即服務器收到這條命令就會清空隊列。之前的操作都不會執行。
  • WATCH : 監控某個 key 的值的變化,防止數據不一致問題。這條命令后面專門講。

基本操作流程

  1. 開啟事務,執行基本的命令。
  2. 此時,我們可以新開一個客戶端查看一下 key1 key2 ,此時key1 key2 仍然為空。
  3. 執行 exec 命令,逐條得到事務中命令的返回值
  4. 之后進行查詢就能看到值了

discard 操作:

watch 操作演示

問題場景:

  1. 客戶端 1 開啟事務,執行 set k1 111。
  2. 在客戶端 1 執行 exec 之前,客戶端 2 執行 set k1 222
  3. 客戶端1 執行 exec

問,此時的 k1 的值?
答案是:111。這是因為set k1 111 實際在 exec 命令之后才會執行,會覆蓋客戶端2 執行的set k1 222,所以最終的值是 111。

場景示例

  • 客戶端 1 開啟事務,執行 set k1 111。
  • 在客戶端 1 執行 exec 之前,客戶端 2 執行 set k1 222
  1. 客戶端1 執行 exec,查看 k1 的值

這樣就會存在一定的歧義,引入 watch 操作,就能避免上述問題:

WATCH key1 [key2 key3 ...]

原理:

  • 當開啟事務的時候, 如果對 watch 的 key 進?修改, 就會記錄當前 key 的 “版本號”. (版本號是個簡單的整數, 每次修改都會使版本變?. 服務器來維護每個 key 的版本號情況)
  • 在真正提交事務的時候, 如果發現當前服務器上的 key 的版本號已經超過了事務開始時的版本號, 就會讓事務執?失敗. (事務中的所有操作都不執?).

演示

  1. 刪除 k1 防止之前值的干擾,客戶端1 先watch k1 再開啟事務,執行 set k1 111。
  2. 客戶端 2 執行 set k1 222
  3. 客戶端1 執行 exec ,再查看 k1 的值

watch 原理

Redis 的 WATCH 命令是實現樂觀鎖的核心機制,用于在事務執行前監控指定的鍵,確保事務執行的原子性和一致性。其底層原理可以總結為以下幾個關鍵點:

  1. 版本號機制

    • Redis 為每個鍵(key)維護一個版本號(本質是一個整數計數器)。
    • 每當鍵被修改(無論是通過 SETINCR 等命令),其版本號會自動加 1
    • 版本號由 Redis 服務器在底層自動管理,用戶無需手動干預
  2. 監控鍵的版本快照

    • 當執行 WATCH key1 [key2 ...] 時,Redis 會記錄當前被監控鍵的最新版本號,形成一個“版本快照”。
  3. 事務執行的版本校驗

    • 執行 WATCH 后,用戶通過 MULTI 開啟事務,然后編寫一系列命令(如 SET、HSET 等)。
    • 當通過 EXEC 提交事務時,Redis 會做一次版本校驗
    • 檢查所有被 WATCH 的鍵,當前服務器上的版本號是否與 WATCH 時記錄的“版本快照”一致。
      • 如果全部一致:說明事務期間沒有其他客戶端修改這些鍵,事務正常執行,所有命令生效。
      • 如果有任何一個鍵的版本號不一致:說明該鍵被其他客戶端修改過,事務整體取消所有命令都不執行),EXEC 返回 nil 表示事務失敗。
  4. 樂觀鎖的體現

    • WATCH 的設計基于“樂觀鎖”思想:默認認為事務執行期間不會有并發修改,因此不主動加鎖阻塞其他操作。
    • 只有在提交時通過版本號比對發現沖突,才放棄執行,避免了悲觀鎖的性能開銷。

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

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

相關文章

Mybatis學習之自定義映射resultMap(七)

這里寫目錄標題一、準備工作1、新建maven工程2、準備兩張表3、建立mapper、pojo、映射文件mapper接口pojoxxxMapper.xml二、resultMap處理字段和屬性的映射關系1、用起別名的方式保證字段名與屬性名一致2、逐一設置resultMap映射關系3、配置mapUnderscoreToCamelCase三、多對一…

數學學習 | 高數、線代、概率論及數理統計薦書

注:本文為 “數學學習書目推薦” 相關合輯。 略作重排,如有內容異常,請看原文。 高等數學、線性代數及概率論與數理統計領域推薦書目 西湖邊的卡夫卡 編輯于 2023-09-19 13:26 7495 人贊同了該回答 數學具有內在的美學屬性,但并非…

【LLM實戰|langgraph】langgrpah基礎

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 langgraph 基礎 1. Chatbot實現 # !pip install langchain # !pip install langgraphfrom typing import Annotatedfrom typing_extensions import Typ…

大疆無人機使用eport連接Jetson主板實現目標檢測

所需硬件設備如下: 實現原理: 視頻流獲取:從大疆無人機獲取實時視頻流。數據傳輸:將視頻流傳輸至 Jetson 平臺。目標檢測處理:在 Jetson 上運行目標檢測算法對傳入的視頻幀進行分析 EPort開發套件 大疆官網給出了…

Typora激活與使用

Typora下載 下載地址:Typora 官方中文站 Typora(1.9.5及其以前的版本) 工具:待補充 流程 1.解壓工具 2.將license-gen.exe、node_inject.exe兩個文件放于typora安裝目錄下 3.在typora安裝目錄下運行cmd(可以打開…

圖片拆分工具,自定義宮格切割

軟件介紹 今天推薦一款實用的圖像處理工具——lmage Splitter,支持圖像拆分與格式互轉功能,無廣告干擾,操作簡單流暢,滿足多樣化圖片編輯需求。 軟件優勢 該工具為綠色版設計,無需安裝即可直接運行,下載…

23種設計模式解析--創建型模式

創建型模式(造物主的智慧) 單例模式 模式定義 單例模式(Singleton)確保一個類僅有一個實例,并提供該實例的全局訪問點。核心思想是通過私有化構造函數和靜態成員實現受控的對象創建。核心實現要點 私有構造函數&#x…

全面解析軟件工程形式化說明技術

一、形式化說明技術概述:從模糊到精確的跨越 在軟件工程的發展歷程中,需求說明技術始終是確保軟件系統成功開發的關鍵環節。從早期依賴自然語言的非形式化描述,到如今基于數學和邏輯的形式化方法,這一領域經歷了從模糊到精確的深…

百度網盤自動啟動如何關閉,關閉智能看圖

#某度軟件引起的奔潰#在日常辦公中,有時候雙擊圖片,會自動打開了某度的網盤,很奇怪莫名其妙的為什么會關閉網盤后又自動打開了。如何發現是某度的牛虻軟件在搞鬼的?我右鍵圖片,選擇打開方式,發現有“智能看…

疏老師-python訓練營-Day40訓練和測試的規范寫法

浙大疏錦行 知識點回顧: 彩色和灰度圖片測試和訓練的規范寫法:封裝在函數中展平操作:除第一個維度batchsize外全部展平dropout操作:訓練階段隨機丟棄神經元,測試階段eval模式關閉dropout 作業:仔細學習下測…

【重磅發布】flutter_chen_keyboard -專注于鍵盤相關功能

flutter_chen_keyboard 一個功能強大且易于使用的 Flutter 鍵盤增強庫,專為提升移動應用的鍵盤交互體驗而設計。 📖 庫簡介 flutter_chen_keyboard 是一個專注于鍵盤相關功能的 Flutter 工具庫,旨在為開發者提供更流暢、更智能的鍵盤交互解決…

idea設置注釋--帶日期和作者和描述

最終效果 在File Header中添加如下內容: /*** author ${USER}* date ${DATE} ${TIME}* description ${DESCRIPTION}*/${USER}:IDEA 里設置的用戶名 ${DATE}:當前日期 ${TIME}:當前時間 可以加自定義變量,比如 ${DESCRI…

【Linux】Socket編程——UDP版

📝前言: 這篇文章我們來講講Linux——udpsocket 🎬個人簡介:努力學習ing 📋個人專欄:Linux 🎀CSDN主頁 愚潤求學 🌄其他專欄:C學習筆記,C語言入門基礎&#…

RabbitMQ面試精講 Day 14:Federation插件與數據同步

【RabbitMQ面試精講 Day 14】Federation插件與數據同步 開篇 歡迎來到"RabbitMQ面試精講"系列第14天,今天我們將深入探討RabbitMQ Federation插件與跨集群數據同步機制。在分布式系統架構中,如何實現消息隊列集群間的數據同步是確保業務連續…

AI編程工具 | Trae介紹

描述需求就可以自動創建可運行的完整項目了,確實很強! 終端中的報錯信息都可以快速作為上下文輸入,點擊確認就可以自動修改,賊好使! Trae 編程工具詳細介紹 一、產品簡介 Trae 是字節跳動于 2025 年 1 月 19 日推出的…

【第11話:感知算法基礎3】目標檢測:深度學習目標檢測模型介紹入門及常用模型詳解

深度學習目標檢測模型介紹入門及常用模型詳解 目標檢測是計算機視覺的核心任務,需同時完成目標定位(輸出邊界框坐標)和目標分類(識別類別)。深度學習通過端到端訓練顯著提升了檢測精度和效率,主要分為兩類架…

稿定科技:多云架構下的 AI 存儲挑戰與 JuiceFS 實踐

稿定科技(gaoding.com)是一家專注于為企業和個人提供視覺內容創新方案的科技公司,致力于打造全新的設計方式,幫助更多用戶輕松掌控設計,創造價值。 隨著 AI 技術的加速發展,數據存儲和管理成為支撐公司創新…

徘徊識別場景誤報率↓77%:陌訊動態時序建模方案實戰解析

原創聲明本文為原創技術解析,核心技術參數與架構設計參考自《陌訊技術白皮書》,轉載請注明來源。一、行業痛點:徘徊識別的現實困境在安防監控領域,徘徊行為識別是保障公共安全的關鍵技術(如商場防盜竊、園區防闖入等場…

C# 通過第三方庫INIFileParser管理INI配置文件

C# 通過第三方庫INIFileParser管理INI配置文件目錄前言一、添加動態庫二、添加接口類代碼總結前言 很多時候我們是直接調用系統的C庫中的GetPrivateProfileString和WritePrivateProfileString接口來實現管理INI文件的,這個接口最久可以追溯到上個世紀80年代&#x…

政府數字化大屏系統 - Flask實現方案

下面我將設計一個基于Flask的政府數字化大屏系統,包含數據可視化、實時監控和統計分析功能,全套代碼下載看底部。 設計思路 使用Flask作為后端框架提供數據接口 前端采用響應式設計,適配大屏展示 使用ECharts實現多種數據可視化 模擬實時…