Redis AOF 持久化:銀行的 “交易流水單” 管理邏輯

目錄

一、AOF 的核心邏輯:“每筆交易都記流水”

二、AOF 的三個步驟:從 “臨時記錄” 到 “正式歸檔”

1. 命令追加:記到 “臨時小本本”

2. 寫入與同步:抄到 “正式流水冊”

3. AOF 還原:拿 “流水冊” 重放交易

三、AOF 重寫:給 “流水冊” 瘦身(解決文件膨脹)

重寫邏輯:派 “實習生(子進程)” 寫 “精簡流水冊”

四、銜接之前的結構知識


如果把 Redis 比作銀行的核心交易系統(處理存款、取款、轉賬等 “寫操作”),那么 AOF 持久化就像銀行的 “交易流水單”—— 通過記錄 “每一筆交易命令”,確保系統故障后能還原所有賬戶的最終狀態。

一、AOF 的核心邏輯:“每筆交易都記流水”

與 RDB“定期拍紙質賬本快照(全量備份)” 不同,AOF 是 “實時記錄交易命令(增量備份)”:

  • RDB 像 “每月拍一次金庫賬本的照片”;
  • AOF 像 “每筆交易都記在流水單上”。

二、AOF 的三個步驟:從 “臨時記錄” 到 “正式歸檔”

1. 命令追加:記到 “臨時小本本”

struct redisServer {// ...// AOF緩沖區,每次追加到 aof_buf 末尾sds aof_buf;// ...
};

銀行柜員每完成一筆交易(如 “給用戶 A 存 100 元”,對應 Redis 的SET user:A 100命令),會立刻把交易內容按固定格式(Redis 協議)寫進 “臨時小本本”(aof_buf緩沖區)

  • ?類比:Redis 執行完寫命令后,把命令丟進aof_buf臨時存著,等后續統一歸檔。

2. 寫入與同步:抄到 “正式流水冊”

銀行有個 “歸檔員”(flushAppendOnlyFile函數),負責把 “臨時小本本” 的內容抄到 “正式流水冊(AOF 文件)”。抄的嚴格程度appendfsync選項決定,對應三種策略:

appendfsync選項銀行場景類比(歸檔規則)技術特點
always每筆交易后,立刻抄到流水冊并強制存進保險箱最安全(最多丟 1 筆交易),但最慢(柜員總在等歸檔)
everysec每秒抄一次流水冊,用小助手(子線程)每秒強制存保險箱平衡安全與性能(最多丟 1 秒交易),Redis 默認選擇
no只抄到流水冊,啥時候存保險箱交給銀行后臺(操作系統)最快,但最不安全(后臺可能延遲很久存,停電丟多筆)

3. AOF 還原:拿 “流水冊” 重放交易

如果銀行核心系統故障,要恢復數據,就把 “正式流水冊(AOF 文件)” 里的交易,從頭到尾再做一遍

  • 銀行找個 “模擬柜員”(偽客戶端,無網絡連接但能執行命令),照著流水冊的記錄,重新執行每一筆交易(如 “給用戶 A 存 100 元”“給用戶 B 轉 50 元”),最終還原所有賬戶的余額。

三、AOF 重寫:給 “流水冊” 瘦身(解決文件膨脹)

問題:流水冊會越來越厚

比如反復操作同一個賬戶:

RPUSH list "A" "B"   # list變成["A","B"]
RPUSH list "C"       # list變成["A","B","C"]
LPOP list            # list變成["B","C"]
RPUSH list "D" "E"   # list變成["B","C","D","E"]

流水冊里會記 4 條命令,但最終 list 是["B","C","D","E"]

  • 顯然,用? 一條RPUSH list "B" "C" "D" "E"?就能代替這 4 條,卻能達到同樣效果。

重寫邏輯:派 “實習生(子進程)” 寫 “精簡流水冊”

為了讓流水冊變薄,銀行會做 “流水冊重寫”:

  1. 派實習生(子進程):子進程先看當前所有賬戶的最終狀態(比如直接查 list 的最終元素是["B","C","D","E"])。

  2. 生成最簡命令:用一條RPUSH list "B" "C" "D" "E"代替原來的 4 條命令,寫一本 “精簡流水冊”。

  3. 處理重寫期間的新交易:重寫時,新交易(如RPUSH list "F")會同時記到 “原來的流水冊” 和 “重寫小緩沖區”。

  4. 最終替換:實習生寫完 “精簡流水冊” 后,銀行把 “重寫小緩沖區” 里的新交易(RPUSH list "F")追加到新流水冊末尾,然后用新流水冊替換舊的 —— 這樣新流水冊既包含所有最終狀態,又沒有冗余命令。

四、銜接之前的結構知識

  • 與 RDB 互補:RDB 是 “定期全量備份(像每月拍賬本照片)”,恢復快但實時性差;AOF 是 “增量交易記錄(像流水單)”,實時性好但恢復慢、文件易膨脹。Redis 通常結合兩者:用 RDB 做基礎全量備份,用 AOF 做增量補充,保障數據安全。

  • 與內存對象關聯:AOF 記錄的 “寫命令”,操作的是 Redis 內存中的字符串、列表、哈希等對象;重寫時,子進程直接讀取內存中對象的最終狀態(如列表的最終元素),再生成最簡命令,避免解析舊 AOF 的冗余命令。

這樣,AOF 就像銀行 “既實時記流水,又定期給流水瘦身” 的策略 —— 既保證交易可追溯,又避免流水冊無限膨脹。

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

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

相關文章

代碼隨想錄訓練營第三十天|LeetCode452.用最少數量的箭引爆氣球、LeetCode435.無重疊空間、LeetCode763.劃分字母空間

452.用最少數量的箭引爆氣球 貪心算法 重合最多的氣球射一箭,就是局部用箭數量最少的,全局的用箭數量就是最少的。 首先對二維數組進行排序,這樣就可以讓氣球更加緊湊。 思路:當前氣球是否和上一個氣球區間重合,如…

數據庫事務隔離級別與 MVCC 機制詳解

最近在準備面試,正把平時積累的筆記、項目中遇到的問題與解決方案、對核心原理的理解,以及高頻業務場景的應對策略系統梳理一遍,既能加深記憶,也能讓知識體系更扎實,供大家參考,歡迎討論。在數據庫并發操作…

【Cursor-Gpt-5-high】StackCube-v1 任務訓練結果不穩定性的分析

1. Prompt 我是機器人RL方向的博士生正在學習ManiSkill,在學習時我嘗試使用相同命令訓練同一個任務,但是我發現最終的 success_once 指標并不是相同的,我感到十分焦慮, 我使用的命令如下: python sac.py --env_id"…

文檔權限設置不合理會帶來哪些問題

文檔權限設置不合理會導致信息泄露、合規風險、協作效率下降、責任難以追溯、知識資產流失、員工信任受損、管理成本增加、企業戰略受阻。這些問題不僅影響日常運營,更會對企業的長遠發展構成威脅。根據IBM《2024數據泄露成本報告》,全球企業因數據泄露的…

Linux網絡服務——基礎設置

網絡服務命令1.ping命令作用:測試網絡連通性(使用icmp協議)常見選項:-c:指定ping的次數,默認無限次-I:指定發送請求的網卡[rootlocalhost ~]# ping 192.168.77.78 -c 4 -I ens160 PING 192.168.…

【multisim汽車尾燈設計】2022-12-1

緣由multisim汽車尾燈設計-學習和成長-CSDN問答 為什么模仿別人做的運行沒啥效果,啥也看不明白,數字電子技術要做的任務。

Langchain在調用 LLM 時統計 Token 消耗

關鍵點解析使用上下文管理器with get_openai_callback() as cb:這一行是核心。cb 會自動收集本次調用的 prompt tokens、completion tokens 以及 total tokens。自動統計在上下文退出時,cb 中已經包含了這次調用的消耗情況,無需額外手動計算。累加到全局…

漫談《數字圖像處理》之實時美顏技術

隨著移動拍攝、直播、短視頻等場景的普及,用戶對 “自然、流暢、可控” 的美顏效果需求日益提升 —— 既要消除皮膚瑕疵、優化面部形態,又需避免 “過度磨皮顯假”“變形失真”“實時卡頓” 等問題。實時美顏技術的核心并非單一算法的堆砌,而…

MATLAB基于PSO(粒子群算法)優化BP神經網絡和NSGA-II(非支配排序遺傳算法)多目標優化

代碼實現了一個智能算法優化BP神經網絡并進行多目標優化的完整流程,結合了PSO(粒子群算法)優化BP神經網絡和NSGA-II(非支配排序遺傳算法)多目標優化,用于多輸入多輸出的回歸預測問題。 ? 一、主要功能 數…

白平衡分塊統計數據為什么需要向下采樣?

在白平衡處理中,分塊統計數據時引入**向下采樣(Downsampling)**,核心目標是在保證統計有效性的前提下,解決“計算效率”與“統計魯棒性”的矛盾,同時避免局部噪聲對白平衡判斷的干擾。要理解這一設計的必要…

Deathnote: 1靶場滲透

Deathnote: 1 來自 <Deathnote: 1 ~ VulnHub> 1&#xff0c;將兩臺虛擬機網絡連接都改為NAT模式 2&#xff0c;攻擊機上做namp局域網掃描發現靶機 nmap -sn 192.168.23.0/24 那么攻擊機IP為192.168.23.128&#xff0c;靶場IP192.168.23.129 3&#xff0c;對靶機進行端口…

windows系統服務器測試部署springboot+vue+mysql項目

1. 后端Java應用啟動 直接使用命令行啟動&#xff08;推薦用于測試&#xff09;&#xff1a; cd C:\Users\Administrator\Desktop\toolset\backed java -jar -Dspring.profiles.activeprod -Dserver.port8083 admin.jar2. 前端靜態文件服務 由于你已經有了dist目錄&#xff0c;…

Java 與 Docker 的最佳實踐

在云原生時代&#xff0c;Docker 已成為應用交付和運行的事實標準。Java 作為企業級開發的主力語言&#xff0c;也需要與容器技術深度結合。然而&#xff0c;Java 程序天然有 JVM 內存管理、啟動速度、鏡像體積 等特點&#xff0c;如果不做優化&#xff0c;可能導致性能下降甚至…

大數據工程師認證推薦項目:基于Spark+Django的學生創業分析可視化系統技術價值解析

&#x1f496;&#x1f496;作者&#xff1a;計算機編程小央姐 &#x1f499;&#x1f499;個人簡介&#xff1a;曾長期從事計算機專業培訓教學&#xff0c;本人也熱愛上課教學&#xff0c;語言擅長Java、微信小程序、Python、Golang、安卓Android等&#xff0c;開發項目包括大…

【MySQL自學】SQL主鍵使用誤區:你必須知道的關鍵細節

在日常數據庫操作中&#xff0c;主鍵&#xff08;Primary Key&#xff09;是我們最常打交道的概念之一。然而&#xff0c;許多開發者&#xff0c;尤其是初學者&#xff0c;常常對其存在一些誤解。一個非常經典的問題是&#xff1a;“在SQL中&#xff0c;只要用到主鍵&#xff0…

Electron 執行python腳本

1 需求背景 有個需求需要Electron執行在本地執行python腳本。希望通過Electron調用python服務并且實現雙向通信。 2 解決思路 使用Electon 的{ exec, spawn, execFile, fork } from "child_process"; 能力來執行python腳本&#xff0c;使用spawn可以實現持續交互&…

Leetcode高頻 SQL 50 題(基礎版)題目記錄

Leetcode sql題目記錄 文章目錄Leetcode sql題目記錄570. 至少有5名直接下屬的經理1934. 確認率1193. 每月交易I1174. 即時食物配送II176. 第二高的薪水&#xff08;1&#xff09; 子查詢為空但外層用了聚合函數&#xff08;2&#xff09;子查詢為空而外層沒有聚合函數550. 游戲…

RAGFlow切分方法詳解

RAGFlow 各切分方法的含義如下,結合文檔結構、場景特點等設計,以適配不同類型的知識源: 1. General(通用分塊) 邏輯:結合文本排版、格式、語義關聯等因素確定分割點,再根據“建議文本塊大小(Token 數)”,將文本切分為合適的塊。 支持格式:DOCX、EXCEL、PPT、IMAGE、…

支付域——支付與交易概念

摘要本文詳細闡述了支付域中支付與交易的核心概念及其相互關系。交易是商品或服務交換的過程&#xff0c;包含多個要素并產生訂單或合同。支付則是資金流轉的過程&#xff0c;是交易的資金結算環節。支付交易結合了兩者&#xff0c;根據不同場景提供多樣化的支付產品和服務。文…

(自用)cmd常用命令自查文檔

&#xff08;自用&#xff09;cmd常用命令自查文檔 Windows CMD 常用命令自查1. 文件與目錄操作命令說明示例?cd?顯示或切換目錄?cd?&#xff1b;cd C:\Windows??dir?列出目錄內容?dir?&#xff1b;dir /a?(含隱藏文件)?md?或mkdir?創建目錄?md test?&#xff1…