Redis 持久化機制詳解:RDB、AOF 原理與面試最佳實踐(AOF篇)

在上一章我們深入學習了 Redis 中重要的數據持久化機制 ——RDB(Redis Database),了解了其通過周期性快照將數據以二進制文件形式保存到磁盤的原理,包括觸發條件、文件結構以及優缺點等核心內容。

Redis 持久化機制詳解:RDB、AOF 原理與面試最佳實踐(RDB篇)

目錄

🎯什么是 AOF 持久化?

🎯AOF 的基本工作原理

🚀命令追加(Append)

🚀文件寫入(Write)

🚀文件同步(Fsync)

🚀文件重寫(Rewrite)

🚀重啟加載(Load)

🎯AOF 持久化方式詳解?

🚀三種 AOF 持久化方式對比

🚀三種方式的工作原理解析

always?方式:實時同步

everysec?方式:每秒同步(默認)

no?方式:系統控制同步

🚀AOF 持久化配置與最佳實踐

📊配置方式

📊最佳實踐

🎯總結


而在本章,我們將延續對 Redis 持久化機制的探索,聚焦于另一種關鍵方案 ——AOF(Append Only File)

🎯什么是 AOF 持久化?

AOF(Append-Only File)持久化 是 Redis 提供的另一種持久化機制,其核心思想是:將 Redis 的所有寫操作命令(如 SETHSETDEL 等)以協議格式(RESP)追加寫入到一個日志文件中。 與 RDB 的“快照”方式不同,AOF 更像一個 操作日志,記錄了數據從創建到修改的完整過程。 默認情況下,AOF 的文件名是 appendonly.aof,可以通過 redis.conf 配置文件自定義。

🎯AOF 的基本工作原理

AOF(Append Only File)是 Redis 實現數據持久化的核心機制之一,通過記錄寫命令日志實現數據恢復。其工作流程可拆解為以下 5 個關鍵階段:

🚀命令追加(Append)

  • Redis 執行寫命令(如?SET,?HSET,?LPUSH)后,將命令轉換為 Redis 協議格式(如?*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n)。

  • 命令會立即追加到?AOF 緩沖區(內存區域),而非直接寫入磁盤,避免每次寫操作都觸發磁盤 I/O。

🚀文件寫入(Write)

  • Redis 定期(由系統調度)將 AOF 緩沖區數據寫入?AOF 文件(位于磁盤)。

  • 此步驟調用 Linux 系統函數?write(),將數據寫入內核緩沖區(Kernel Buffer)后立即返回,數據尚未真正落盤(延遲寫)。

  • 數據丟失風險:若系統崩潰,內核緩沖區的數據可能丟失(默認由操作系統每 30 秒同步一次,或根據緩沖區狀態決定)。

🚀文件同步(Fsync)

  • 通過?appendfsync?配置控制同步策略,決定何時將內核緩沖區數據強制刷盤:

    • always:每條命令寫入后立即調用?fsync(),數據安全性最高(最多丟失當前命令),但性能開銷大。

    • everysec(默認):每秒調用一次?fsync(),最多丟失 1 秒數據,兼顧性能與安全。

    • no:由操作系統控制同步時機,性能最優但風險最大(可能丟失大量數據)。

  • fsync()?是關鍵系統調用,會阻塞直到數據真正寫入磁盤后返回。

🚀文件重寫(Rewrite)

  • 觸發條件:AOF 文件體積過大時(如超過上次重寫后大小的 100% 且文件超過 64MB),自動觸發重寫。

  • 核心邏輯

    • 從當前內存數據生成最小命令集(如合并多次?INCR?為單次?SET),無需讀取舊 AOF 文件。

    • 主進程 fork 子進程執行重寫,期間新命令繼續寫入舊 AOF 文件并緩存到?重寫緩沖區

    • 子進程完成后,主進程將重寫緩沖區的增量命令追加到新文件,替換舊文件。

🚀重啟加載(Load)

  • Redis 啟動時,優先加載 AOF 文件(若存在)。

  • 按順序執行 AOF 文件中的所有命令,重建內存數據狀態。

Linux 系統直接提供了一些函數用于對文件和設備進行訪問和控制,這些函數被稱為?系統調用(syscall)。下圖為關鍵系統調用對比

系統調用功能描述數據落盤時機性能影響數據安全風險
write()將數據寫入內核緩沖區由操作系統調度(默認約 30 秒)低(非阻塞)高(可能丟失緩沖區數據)
fsync()強制內核緩沖區數據同步到磁盤調用完成后高(阻塞直到完成)低(數據已落盤)

🎯AOF 持久化方式詳解?

AOF(Append Only File)持久化通過記錄 Redis 寫命令來實現數據持久化,其核心是控制命令同步到磁盤的策略。根據不同的同步時機,AOF 支持以下三種持久化方式:

🚀三種 AOF 持久化方式對比
持久化方式同步策略數據安全性性能影響適用場景
always每條寫命令執行后立即調用?fsync()?強制同步到磁盤。最高(幾乎不丟數據)性能最低金融交易、訂單系統等強一致性場景
everysec每秒調用一次?fsync()?同步磁盤(默認策略)。較高(最多丟 1 秒數據)性能適中大多數業務場景(兼顧安全與性能)
no不主動調用?fsync(),由操作系統決定同步時機(通常內核緩沖區滿或超時)。最低(可能丟大量數據)性能最高對數據安全性要求極低的場景
🚀三種方式的工作原理解析
  1. always?方式:實時同步
    • 流程:寫命令 → 追加到 AOF 緩沖區 → 立即調用?fsync()?落盤 → 返回客戶端。

    • 特點

      • 每次寫操作都阻塞等待磁盤寫入完成,確保數據不丟失。

      • 磁盤 I/O 頻繁,Redis 吞吐量可能下降(尤其寫入密集場景)。

  2. everysec?方式:每秒同步(默認)
    • 流程:寫命令 → 追加到 AOF 緩沖區 → 寫入系統內核緩沖區(未落盤)→ 每秒觸發一次?fsync()?落盤。

    • 特點

      • 利用操作系統緩沖機制,減少磁盤 I/O 次數,性能較好。

      • 若 Redis 宕機或系統崩潰,最多丟失 1 秒內的命令(因為最后一秒的命令可能在緩沖區未落盤)。

  3. no?方式:系統控制同步
    • 流程:寫命令 → 追加到 AOF 緩沖區 → 寫入系統內核緩沖區 → 由 Linux 內核決定何時同步(如緩沖區滿或 30 秒超時)。

    • 特點

      • Redis 完全不控制磁盤同步,性能最優(無?fsync()?阻塞)。

      • 數據安全性最差,若系統崩潰,可能丟失大量未同步的命令。

🚀AOF 持久化配置與最佳實踐
📊配置方式

在 Redis 配置文件(redis.conf)中通過?appendfsync?參數設置:

# 示例配置
appendfsync always       # 實時同步(強安全,低性能)
# appendfsync everysec   # 每秒同步(默認,平衡方案)
# appendfsync no         # 系統控制(高性能,低安全)
📊最佳實踐
  • 優先選擇?everysec:兼顧數據安全性和性能,是 Redis 官方推薦的默認策略。

  • always?謹慎使用:僅在對數據一致性要求極高(如金融交易)且硬件磁盤性能極佳時使用。

  • no?極少使用:除非業務允許丟失大量數據(如臨時緩存),否則不建議配置。

🎯總結

AOF持久化作為Redis數據安全的重要保障,通過記錄寫命令的方式提供了高可靠性的持久化方案。合理配置同步策略和重寫機制,結合混合持久化等新特性,可以在保證數據安全的同時兼顧系統性能。生產環境中應根據業務特點和數據重要性選擇合適的持久化策略,并建立完善的監控和備份機制。?

您的支持是我持續創作的動力:🎯📊🚀?

?? 點贊:如果這個項目對您有所啟發,請多多點點贊支持一下
📌 收藏:完整項目源碼已開源,有需要收藏自取
👀 關注:訂閱我的專欄,不錯過后續更多優質內容

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

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

相關文章

【GateWay】和權限驗證

【GateWay】網關詳解和權限驗證 一、Gateway 核心概念與架構二、路由斷言(Route Predicates)詳解三、過濾器(Filters)機制四、權限認證的核心理論模型五、Spring Cloud Gateway Security OAuth2 集成方案六、OAuth2.0 集成 一、…

QSqlDatabase: QSQLITE driver not loaded

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言可能的原因解決辦法1. 確認 SQLite 驅動插件文件2. 拷貝插件文件到應用程序目錄3. 設置插件搜索路徑4. 安裝 SQLite 依賴庫5. 解決 QCoreApplication 實例問題 …

20250619在榮品的PRO-RK3566開發板的Android13下解決海羅光電有限公司HL070T58C-05屏在啟動的時候出現白色條紋的問題【時序】

20250619在榮品的PRO-RK3566開發板的Android13下解決海羅光電有限公司HL070T58C-05屏在啟動的時候出現白色條紋的問題 2025/6/19 20:39 緣起:榮品的PRO-RK3566開發板的Android13下,點亮海羅光電有限公司HL070T58C-05屏。 在啟動的時候會出現花屏/白色條紋…

docker使用Volume對Nginx進行掛載

需求: 需要將Nginx的歡迎頁面也就是index.html文件進行修改。 原始方法:由于docker會為每一個容器創建其對應的文件信息,但是創建的信息內容只有其最基礎的運行信息,所以想要直接去訪問其index.html就無法做到。 使用volume&am…

基于springboot的寵物服務預約系統

博主介紹:java高級開發,從事互聯網行業六年,熟悉各種主流語言,精通java、python、php、爬蟲、web開發,已經做了六年的畢業設計程序開發,開發過上千套畢業設計程序,沒有什么華麗的語言&#xff0…

idea 2025會在用戶目錄創建IdeaSnapshots文件夾

推薦一個api管理測試工具 一個簡單的API測試和編寫文檔的工具 idea 2025會在用戶目錄創建IdeaSnapshots文件夾 解決方案 打開 Profiler 點擊 setting 參考 https://youtrack.jetbrains.com/articles/SUPPORT-A-1086/How-to-change-or-turn-off-the-IdeaSnapshots-folder-…

【Mini-F5265-OB開發板試用測評】2、PWM驅動遙控車RX2接收解碼帶馬達驅動控制IC

手頭有帶轉向電機和動力電機小車底盤,買了很久一直在吃灰。 最近查了一下小車的驅動IC是富滿微的8D420L,是一款傳統的RX2接收解碼芯片,帶馬達驅動。 手頭沒有TX2發送芯片,所以考慮用MCU直接發送PWM直接接入RX2,可能可以驅動。 一…

Tcpdump網絡抓包工具詳解!

一、簡介 tcpdump就是:dump the traffic on a network,根據使用者的定義對網絡上的數據包進行截獲的包分析工具。 tcpdump是一個用于截取網絡分組,并輸出分組內容的工具。憑借強大的功能和靈活的截取策略,使其成為類UNIX系統下用…

Spring Boot的Security安全控制——應用SpringSecurity!

應用Spring Security 前面介紹了在項目開發時為什么選擇Spring Security,還介紹了它的原理。本節開始動手實踐Spring Security的相關技術。 實戰:Spring Security入門 現在開始搭建一個新項目,實踐一個Spring Security的入門程序。 &…

FPGA基礎 -- Verilog行為級建模之alawys語句

Verilog 中的 always 語句塊,這是行為級建模的核心結構之一,在 RTL 級設計中廣泛用于時序邏輯和組合邏輯的建模。 一、什么是 always 語句? ? 定義: always 語句用于描述可綜合的硬件行為邏輯,表示一個**“事件驅動…

【力扣 簡單 C】704. 二分查找

目錄 題目 解法一&#xff1a;二分查找 題目 解法一&#xff1a;二分查找 int find(const int* nums, int size, int target) {int left 0, right size - 1;while (left < right){int mid (left right) / 2;if (nums[mid] < target)left left 1;else if (nums[m…

Java并發編程實戰 Day 30:并發編程未來展望與最佳實踐總結

【Java并發編程實戰 Day 30】并發編程未來展望與最佳實踐總結 文章簡述 經過30天的系統學習&#xff0c;我們從Java并發編程的基礎知識逐步深入到高并發系統的架構設計與性能優化。本文作為“Java并發編程實戰”系列的收官之作&#xff0c;將全面回顧整個系列的核心內容&#…

量化面試綠皮書:23. 醉酒乘客

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 23. 醉酒乘客 100名乘客排隊登機&#xff0c;每人持有一張對應座位的機票&#xff08;第n位乘客的座位號為n&#xff09;。 第一位乘客喝醉后…

AntV G6入門教程

以下教程聚焦于 AntV?G6 的 數據操作 API,詳細介紹各個方法的用途、參數以及完整的使用示例,幫助你在圖實例上精細地讀取、修改和管理節點/邊/組合等數據。文中示例代碼均基于 G6 v5.0.47 官方文檔 ([g6.antv.antgroup.com][1])。 一、獲取完整圖數據 1.1 graph.getData() …

67、數據訪問-crud實驗-分頁數據展示

67、數據訪問-crud實驗-分頁數據展示 分頁數據展示是數據訪問中常見的功能&#xff0c;用于將大量數據分割成多個頁面顯示&#xff0c;提升用戶體驗和系統性能。以下是分頁數據展示的相關介紹&#xff1a; #### 基本原理 1. **確定每頁顯示數量**&#xff1a;設定每頁顯示的數…

常見 Web 服務器

Web 服務器有很多種&#xff0c;功能和用途略有不同&#xff0c;下面我會分類介紹主流的 Web 服務器&#xff08;包含靜態/動態/反向代理支持&#xff09;并重點說明類似 Tomcat 的 Java 支持型。 常見 Web 服務器分類 類型名稱描述與特點&#x1f310; 靜態資源服務器Nginx高…

【MacOS】M3 Pro芯片MacBook極速搭建Kubernetes

M3 Pro 芯片 MacBook 2023上使用 Colima 安裝 Kubernetes。 Colima 輕量、高效&#xff0c;并且在 Apple Silicon 架構上表現出色。 下面是詳細的、一步一步的安裝和配置指南。 核心思路 我們將通過以下步驟完成整個過程&#xff1a; 準備工作: 安裝必要的工具&#xff0c;…

import { Add, Dongdong, UserAdd } from ‘@nutui/icons-react‘ 使用圖標導入庫報錯

import { Add } from "nutui/icons-react-taro"; 官網的導入的庫名字不全&#xff0c;后面要加-taro&#xff0c;就行了

猿人學js逆向比賽第一屆第七題

分析響應 看到響應體里面的data是個字體加密&#xff0c;于是這里可以看到woff文件也給返回了&#xff0c;這里現分析這個文件。 打開可以看到這里a351對應的是3和頁面中的3是對應的&#xff0c;于是用ddddocr動態識別字體文件中的字體&#xff0c;然后對應對應的字體替換是不…

股票心理學習篇:交易的人性弱點 - 頻繁交易

以下內容為學習時的筆記整理&#xff0c;視頻作者來自B站&#xff1a;老貓與指標 視頻鏈接&#xff1a;頻繁交易必死&#xff1f;底層邏輯深度剖析&#xff0c;老貓的的破局心法與實戰策略分享 交易的人性弱點 - 頻繁交易 主講人&#xff1a; 老貓 1. 引言&#xff1a;問題的…