Redis的持久化工具包—RDB AOF

文章目錄

  • 前言

    一、RDB 持久化(快照持久化)

    1. 定義

    2. RDB 觸發機制

    (1)手動觸發

    (2)自動觸發

    3. RDB 持久化流程

    4. RDB 核心配置

    5. RDB 優缺點

    二、AOF 持久化(日志持久化)

    1. 定義

    2. AOF 核心原理

    3. AOF 的?fsync?策略(關鍵配置)

    4. AOF 重寫(解決文件膨脹問題)

    (1)為什么需要重寫?

    (2)重寫觸發方式

    (3)重寫流程

    5. AOF 核心配置

    6. AOF 優缺點

    三、混合持久化(Redis 4.0+)

    1. 定義與目的

    2. 混合持久化原理

    3. 核心配置

    4. 混合持久化優勢

    四、RDB vs AOF vs 混合持久化 對比

    五、持久化方案選擇建議

    六、關鍵注意事項


前言

????????Redis 是一款內存數據庫,所有數據默認存儲在內存中。雖然內存操作速度極快,但一旦 Redis 服務重啟、進程崩潰或服務器斷電,內存中的數據會全部丟失。為解決這一問題,Redis 提供了持久化機制—— 將內存中的數據定期 / 實時寫入磁盤,確保數據在故障后可恢復。

Redis 支持三種核心持久化方式:RDB(Redis Database)AOF(Append Only File)?和?混合持久化(RDB + AOF,Redis 4.0+ 引入)。下面逐一詳解其原理、配置、優缺點及適用場景。


一、RDB 持久化(快照持久化)

1. 定義

RDB 是 Redis 默認的持久化方式,其核心是在指定時間點生成內存中所有數據的 “快照”(二進制壓縮文件),并將快照保存到磁盤(默認文件名為?dump.rdb)。當 Redis 重啟時,可通過加載該快照文件恢復數據。

2. RDB 觸發機制

RDB 觸發分為手動觸發自動觸發兩種方式,核心差異在于是否阻塞 Redis 主進程。

(1)手動觸發

手動觸發需通過 Redis 命令執行,主要有兩個命令:

  • save?命令
    直接由 Redis 主進程執行快照生成,期間會阻塞所有客戶端請求(主進程無法處理其他命令),直到快照完成。

    • 適用場景:僅用于測試或數據量極小的場景,生產環境嚴禁使用(會導致服務不可用)。
  • bgsave?命令
    主進程會先?fork()?一個子進程,由子進程負責生成快照文件,主進程繼續處理客戶端請求(非阻塞)。

    • 核心原理:fork()?子進程時采用?寫時復制(Copy-On-Write, COW)?機制 —— 子進程生成快照期間,主進程若修改數據,會先復制該數據的內存頁(子進程仍使用舊數據頁),確保快照數據的一致性。
    • 適用場景:生產環境推薦的手動觸發方式。
(2)自動觸發

Redis 配置文件(redis.conf)中通過?save?指令定義 “時間窗口 + 寫操作次數” 的觸發條件,滿足條件時自動執行?bgsave

示例配置(默認配置):

# 格式:save <seconds> <changes>
save 900 1    # 900秒內(15分鐘)至少有1次寫操作,觸發bgsave
save 300 10   # 300秒內(5分鐘)至少有10次寫操作,觸發bgsave
save 60 10000 # 60秒內至少有10000次寫操作,觸發bgsave
  • 若需禁用自動 RDB,可刪除所有?save?配置,或添加?save ""

3. RDB 持久化流程

  1. 觸發?bgsave(手動或自動),主進程?fork()?子進程(此時主進程短暫阻塞,時間取決于內存大小,通常毫秒級)。
  2. 子進程遍歷 Redis 內存中的數據,將其寫入臨時快照文件(如?temp-dump.rdb)。
  3. 子進程寫完所有數據后,用臨時文件替換舊的?dump.rdb?文件(原子操作,避免文件損壞)。
  4. 子進程退出,主進程記錄快照完成日志。

4. RDB 核心配置

配置項說明默認值
save <sec> <n>自動觸發 RDB 的條件(可配置多個)見上文示例
dbfilenameRDB 快照文件名稱dump.rdb
dirRDB/AOF 文件的存儲目錄(需指定絕對路徑)./(當前目錄)
rdbcompression是否對 RDB 文件進行 LZF 壓縮(壓縮會消耗 CPU,但減少文件大小)yes
rdbchecksum是否對 RDB 文件進行 CRC64 校驗(校驗會消耗 CPU,但確保文件完整性)yes
stop-writes-on-bgsave-error若?bgsave?失敗,是否停止 Redis 寫操作(防止數據不一致)yes

5. RDB 優缺點

優點缺點
1.?文件小:二進制壓縮格式,占用磁盤空間少。1.?數據丟失風險高:兩次快照間的寫數據會丟失(如配置?save 60 10000,若 60 秒內服務崩潰,10000 次操作前的數據丟)。
2.?恢復速度快:加載二進制文件無需解析,適合大規模數據恢復。2.?fork?開銷bgsave?時?fork?子進程會占用與主進程相同的內存頁(COW 機制下實際僅復制修改頁,但內存峰值仍需關注)。
3.?不影響主進程bgsave?由子進程執行,主進程可正常處理請求。3.?不適用于實時持久化:無法做到 “每寫一次就持久化”,滿足不了高數據安全性需求。

二、AOF 持久化(日志持久化)

1. 定義

AOF(Append Only File)是基于 “寫操作日志” 的持久化方式——Redis 將每一條修改數據的命令(如?SETHSETLPUSH?等)以文本格式(或二進制,Redis 7.0+ 支持)追加到 AOF 文件中,而非記錄數據快照。當 Redis 重啟時,通過 “回放” AOF 文件中的所有命令,重新構建內存數據。

2. AOF 核心原理

AOF 的核心是 “追加(Append)而非修改”:

  • 所有寫命令先寫入?內存緩沖區(aof_buf),再根據配置的?fsync?策略將緩沖區數據刷到磁盤(避免頻繁磁盤 I/O 影響性能)。
  • AOF 文件始終以 “追加” 模式寫入,不會修改已有內容,確保日志文件不會因崩潰而損壞(即使崩潰,僅丟失最后未刷盤的命令)。

3. AOF 的?fsync?策略(關鍵配置)

fsync?是操作系統調用,用于將內存緩沖區的數據強制刷到磁盤(確保數據真正寫入硬件)。AOF 通過?appendfsync?配置控制?fsync?頻率,平衡 “數據安全性” 和 “性能”:

配置值說明安全性性能
always每執行一條寫命令,立即?fsync?刷盤。最高最低
everysec每秒執行一次?fsync(默認配置),緩沖區數據累積 1 秒后刷盤。較高較高
noRedis 不主動?fsync,由操作系統決定何時刷盤(通常依賴系統緩存,默認 30 秒)。最低最高
  • 生產環境推薦?everysec:僅可能丟失 1 秒內的數據,性能接近?no,安全性滿足大部分場景。

4. AOF 重寫(解決文件膨脹問題)

(1)為什么需要重寫?

AOF 文件會不斷追加命令,若頻繁執行?INCR count?這類命令,AOF 文件中會積累大量重復命令(如?INCR count?1000 次,實際只需 1 條?SET count 1000?即可恢復數據),導致文件急劇膨脹,占用磁盤空間且恢復速度變慢。

AOF 重寫的核心是 **“壓縮命令日志”**:不讀取舊 AOF 文件,而是直接遍歷當前內存中的數據,生成 “重建該數據所需的最少命令”,并寫入新的 AOF 文件,替換舊文件。

(2)重寫觸發方式
  • 手動觸發:執行?bgrewriteaof?命令,主進程?fork()?子進程負責重寫,主進程繼續處理請求(非阻塞)。
  • 自動觸發:通過配置兩個參數,滿足條件時自動執行?bgrewriteaof
    auto-aof-rewrite-percentage 100  # AOF 文件大小比上次重寫后增長100%(即翻倍)
    auto-aof-rewrite-min-size 64mb   # AOF 文件最小大小達到64MB(避免小文件頻繁重寫)
    
(3)重寫流程
  1. 主進程?fork()?子進程,子進程開始遍歷內存數據,生成新 AOF 臨時文件。
  2. 主進程繼續處理請求:新的寫命令一方面追加到舊 AOF 文件(確保重寫期間數據不丟失),另一方面寫入?AOF 重寫緩沖區(aof_rewrite_buf)
  3. 子進程完成重寫后,主進程將?aof_rewrite_buf?中的命令追加到新 AOF 文件。
  4. 用新 AOF 文件替換舊文件,重寫完成。

5. AOF 核心配置

配置項說明默認值
appendonly是否開啟 AOF 持久化(默認關閉,需手動設為?yesno
appendfilenameAOF 文件名稱appendonly.aof
dirAOF 文件存儲目錄(與 RDB 共享,需絕對路徑)./
appendfsyncfsync?策略(always/everysec/noeverysec
auto-aof-rewrite-percentage自動重寫的文件大小增長率100
auto-aof-rewrite-min-size自動重寫的文件最小大小64mb
aof-load-truncated若 AOF 文件末尾有損壞(如崩潰導致),是否仍加載可用部分(默認開啟)yes

6. AOF 優缺點

優點缺點
1.?數據安全性高everysec?策略僅丟 1 秒數據,always?可做到不丟數據。1.?文件體積大:文本日志比 RDB 二進制文件大,占用更多磁盤空間。
2.?日志可讀性強:文本格式可直接查看 / 修改(如刪除誤操作的命令)。2.?恢復速度慢:加載時需解析并執行所有命令,大規模數據恢復比 RDB 慢。
3.?無數據丟失風險:適合對數據安全性要求高的場景。3.?fsync?開銷always?策略會頻繁觸發磁盤 I/O,性能損耗較大。
4.?重寫機制優化:通過重寫解決文件膨脹問題。4.?兼容性問題:舊版本 Redis 可能不支持新版本 AOF 文件的某些命令格式。

三、混合持久化(Redis 4.0+)

1. 定義與目的

單獨使用 RDB 或 AOF 都有明顯缺陷:

  • RDB 恢復快但數據丟失多;
  • AOF 數據全但恢復慢(尤其文件大時)。

混合持久化(RDB + AOF)是?Redis 4.0 引入的解決方案:將 AOF 文件分為兩部分:

  • 開頭部分:RDB 二進制快照(記錄某一時間點的全量數據);
  • 末尾部分:增量 AOF 日志(記錄 RDB 快照之后的所有寫命令)。

重啟時,Redis 先加載 RDB 快照(快速恢復全量數據),再回放末尾的 AOF 日志(恢復增量數據),兼顧 “恢復速度” 和 “數據完整性”。

2. 混合持久化原理

  • 開啟混合持久化后,執行?bgrewriteaof(手動或自動)時,子進程會先生成 RDB 二進制數據,寫入新 AOF 文件開頭;
  • 然后將重寫期間的增量命令(aof_rewrite_buf)以 AOF 格式追加到新文件末尾;
  • 最終新 AOF 文件同時包含 RDB 快照和 AOF 日志,替換舊 AOF 文件。

3. 核心配置

Redis 4.0+ 需手動開啟,Redis 5.0+ 默認為開啟:

aof-use-rdb-preamble yes  # yes:開啟混合持久化;no:純 AOF 模式

4. 混合持久化優勢

  1. 恢復速度快:加載 RDB 快照比純 AOF 回放命令快一個數量級;
  2. 數據完整性高:增量 AOF 日志確保 RDB 之后的數據不丟失;
  3. 文件體積適中:RDB 壓縮 + AOF 增量,比純 AOF 文件小。

四、RDB vs AOF vs 混合持久化 對比

對比維度RDBAOF(純)混合持久化(RDB+AOF)
持久化方式二進制快照寫命令日志(追加)RDB 快照 + AOF 增量日志
數據完整性低(丟失兩次快照間數據)高(最多丟 1 秒數據)高(同 AOF)
文件大小小(壓縮)大(文本 / 二進制)中(RDB 壓縮 + AOF 增量)
恢復速度快(接近 RDB)
性能影響低(bgsave?子進程)中(fsync?策略)中(同 AOF)
適用場景大規模數據備份、恢復高數據安全性需求生產環境默認推薦

五、持久化方案選擇建議

  1. 生產環境首選:混合持久化
    兼顧 RDB 的 “快速恢復” 和 AOF 的 “高數據完整性”,是 Redis 5.0+ 推薦的默認方案,適合 90% 以上的業務場景。

  2. 僅用 RDB 的場景

    • 數據允許丟失幾分鐘(如非核心緩存數據);
    • 需頻繁備份 / 恢復大規模數據(如每日全量備份);
    • 對 Redis 性能要求極高,無法接受 AOF 的?fsync?開銷。
  3. 僅用 AOF 的場景

    • 數據絕對不允許丟失(如金融交易數據),需配置?appendfsync always
    • 需通過 AOF 日志排查歷史操作(如定位誤刪數據的命令)。
  4. 禁用持久化的場景

    • Redis 僅作為純緩存(數據可從后端數據庫重建);
    • 測試環境,無需保留數據。

六、關鍵注意事項

  1. 持久化文件備份

    • 定期將?dump.rdb?和?appendonly.aof?復制到異地存儲(如云存儲、另一臺服務器),防止單磁盤故障導致文件丟失。
    • 備份時建議先執行?bgsave/bgrewriteaof,確保備份的是完整文件。
  2. 避免持久化文件與 Redis 同磁盤

    • 若 Redis 數據和持久化文件存于同一磁盤,磁盤滿時會導致 Redis 無法寫入數據,建議分開存儲。
  3. 定期測試恢復流程

    • 模擬故障場景(如刪除內存數據后重啟 Redis),驗證持久化文件能否正常加載,避免文件損壞或配置錯誤導致恢復失敗。
  4. 內存與持久化配合

    • 若 Redis 內存過大(如 10GB+),bgsave?時?fork?子進程可能導致內存峰值過高,需配置?vm.overcommit_memory = 1(允許操作系統超分配內存),避免?fork?失敗。

總結

Redis 持久化用于內存數據落盤防丟失,核心有三種方案:

  1. RDB:默認快照式,文件小、恢復快,但兩次快照間數據易丟失;
  2. AOF:需手動開啟,記錄寫命令,數據安全(最多丟 1 秒),但文件大、恢復慢;
  3. 混合持久化(4.0+):結合 RDB 快恢復與 AOF 高安全,生產環境首選。

選擇:生產優先混合,數據允許丟失用 RDB,絕對不丟用 AOF;需定期備份文件、測試恢復。

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

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

相關文章

【Web安全】XXL-JOB框架SRC高頻漏洞分析總結

文章目錄前言一、核心漏洞分類與技術細節二、漏洞關聯利用與攻擊路徑三、版本演進與修復策略四、安全運維建議五、典型漏洞復現環境搭建六、總結前言 XXL-JOB是國內主流的開源分布式任務調度框架&#xff0c;由徐雪里開發維護&#xff0c;以輕量易用、高可用、適配分布式場景等…

Capacitor 打包后接口訪問不到的排查經歷

我最近在用 Quasar Capacitor 6 做一個 Android App&#xff0c;前端用的是 Vue3 Quasar&#xff0c;打包交給 Capacitor 去跑在手機的 WebView 里&#xff0c;后端是 FastAPI 提供接口。開發模式下一切順利&#xff0c;瀏覽器里訪問接口沒有任何問題&#xff0c;我甚至覺得打…

【正點原子】Linux應用編程入門~概念及環境介紹

應用編程概念 應用編程&#xff08;也可稱為系統編程&#xff09;與驅動編程、裸機編程有何不同&#xff1f;系統調用&#xff1b;何為庫函數&#xff1b;應用程序的 main()函數&#xff1b;應用程序開發環境的介紹&#xff1b;系統調用 定義系統調用&#xff08;system call&a…

一、HTML 完全指南:從零開始構建網頁

文章目錄前言一、 HTML 結構認識 HTML 標簽HTML 文件基本結構標簽層次結構快速生成代碼框架二、 HTML 常見標簽詳解2.1 注釋標簽2.2 標題標簽 (h1 - h6)2.3 段落標簽 (p)2.4 換行標簽 (br)2.5 格式化標簽2.6 圖片標簽 (img)2.7 超鏈接標簽 (a)2.8 表格標簽基本使用合并單元格2.…

基于POI-TL實現動態Word模板的數據填充:【散點圖】特殊處理方案

基于POI-TL實現動態Word模板的數據填充:散點圖特殊處理方案 在使用POI-TL進行Word模板動態數據填充時,圖表生成是一個常見需求。最近在項目中使用POI-TL處理散點圖時遇到了一個特殊問題,經過研究后找到了解決方案,特此記錄分享。 問題背景 POI-TL作為一款優秀的Java Wor…

使用node-Express框架寫一個學校宿舍管理系統練習項目-前后端分離

今天繼續分享一個新的練習項目&#xff0c;是使用node做為后端語言&#xff0c;來寫的一個前后端分離項目&#xff1a;學校宿舍管理系統。我們如果想掌握一門編程語言&#xff0c;就是需要大量的練習。所以當我們學習到了一些知識&#xff0c;自己想一下 可以拿學到的知識&…

Kafka 運維實戰基本操作含命令與最佳實踐

1. 基礎概覽與工具入口 Kafka 發行包的所有 CLI 工具均在 bin/ 目錄下。任何工具不帶參數運行都會顯示所有可用選項。本文命令默認&#xff1a;--bootstrap-server localhost:9092&#xff1b;生產請替換為你的控制面或內網 VIP。 2. 主題管理&#xff08;創建 / 修改 / 刪除 /…

貪心算法應用:航班起降問題詳解

Java中的貪心算法應用&#xff1a;航班起降問題詳解 貪心算法是一種在每一步選擇中都采取當前狀態下最優的選擇&#xff0c;從而希望導致全局最優解的算法策略。在航班起降問題中&#xff0c;貪心算法可以有效地解決機場跑道調度問題&#xff0c;即如何安排航班的起降順序以最大…

uniapp scroll-view 設置scrollTop無效

當我們使用 scroll-view的scroll-top的時候 默認想讓它回到頂部&#xff0c;當我們設置值為0的時候會不生效&#xff0c;在實際運用過程中&#xff0c;發現設置了scroll-top無效&#xff0c;滾動條位置并沒有發生變化&#xff0c;是因為微信小程序的官方框架處于性能考慮&#…

網絡與通信

1.TCP協議與UDP協議TCP&#xff08;Transmission Control Protocol&#xff0c;傳輸控制協議&#xff09;和 UDP&#xff08;User Datagram Protocol&#xff0c;用戶數據報協議&#xff09;是 TCP/IP 協議族中兩種核心的傳輸層協議&#xff0c;它們在數據傳輸方式、可靠性、適…

Node.js中package.json詳解

1. name&#xff08;名稱&#xff09; 如果你計劃發布你的包&#xff0c;package.json 中最重要的字段是 name 和 version&#xff0c;因為它們是必需的。name 和 version 共同組成一個假定完全唯一的標識符。包的更改應伴隨版本號的更新。如果你不打算發布包&#xff0c;那么…

代碼隨想錄第14天| 翻轉、對稱與深度

226.翻轉二叉樹 &#xff08;優先掌握遞歸&#xff09; 題目鏈接/文章講解/視頻講解&#xff1a;翻轉二叉樹 交換的是指針&#xff0c;而不是數值&#xff0c;如果用數值做交換&#xff0c;需要交換的節點下面無法很好的操作。 使用遞歸來實現&#xff0c;但要提前清除是什么順…

DNS-Windows上使用DNS

DNS-Windows上使用DNS一、查看與修改DNS配置1.1、查看當前DNS服務器設置1.2、臨時修改 DNS 服務器&#xff08;命令行&#xff09;二、DNS緩存相關操作2.1、查看DNS緩存內容2.2、 刷新 DNS 緩存&#xff08;清除過期記錄&#xff09;三、測試域名解析&#xff08;nslookup 工具…

3dsMax 2026 .NET Core 8 轉型下的Maxscript腳本開發:動態編譯模塊的重構策略與兼容性升級路徑

3ds Max 長期以來一直提供出色的 .NET 集成,使 Maxscript 能夠無縫利用任何 .NET 庫的強大功能。部分開發者在工具中廣泛使用了 .NET 功能。 之前,3ds Max 依賴于 .NET Framework 4.8 并且最近更新到了 4.8.1,用于 2025 版本的發布。然而,隨著 3ds Max 2026 的推出,Autod…

golang 做webrtc開發核心

在Golang中進行WebRTC開發&#xff0c;核心在于理解WebRTC協議的工作原理以及如何利用Go生態中的庫來實現關鍵功能。以下是Golang WebRTC開發的核心要點&#xff1a; WebRTC基礎概念 了解ICE&#xff08;Interactive Connectivity Establishment&#xff09;協議用于NAT穿越掌握…

RabbitMQ 異步化抗洪實戰

說明&#xff1a;本文僅展示架構思路與安全片段&#xff0c;所有敏感字段已用占位符&#xff1b;不含可直接復刻的生產細節。數據與接口均為演示/虛擬。0. 背景與目標長耗時/不確定接口&#xff08;如對接第三方機器人平臺&#xff09;的同步阻塞&#xff0c;容易造成請求堆積與…

接口返回 2 萬條數據,easy-trans導致多了20s耗時排查過程

內網訪問排版核料詳情功能&#xff0c;用戶反饋要等十幾秒排查 sql&#xff1a;sql 比較簡單排查內存計算&#xff1a;arthus trace 類名 方法名 總耗時2s排查頁面渲染是否緩慢&#xff1a;F12 查看接口 等待服務器響應 20s 下載時間 30s, 故不考慮渲染問題排查請求響應日志打…

AIGC入門,手搓大模型客戶端與MCP交互

概述 在現代應用開發中&#xff0c;將大語言模型&#xff08;LLM&#xff09;與專用工具服務相結合&#xff0c;可以構建出既能理解自然語言&#xff0c;又能準確執行專業任務的智能代理。本文介紹一個基于 MCP&#xff08;Model Context Protocol&#xff09;協議和 Ollama 本…

深度學習:從預備知識到未來展望

在當今數字化時代&#xff0c;深度學習正以前所未有的速度改變著我們的生活和工作方式。從智能語音助手到自動駕駛汽車&#xff0c;從精準醫療到個性化推薦系統&#xff0c;深度學習的應用無處不在。本文將從深度學習的預備知識入手&#xff0c;探討其發展歷程、關鍵技術和未來…

軟考高級系統架構設計師之構件與中間件技術篇

一、構件的定義 定義1:軟件構件是一種組裝單元&#xff0c;它具有規范的接口規約和顯式的語境依賴。軟件構件可以被獨立地部署并由第三方任意地組裝。 定義2:構件是某系統中有價值的、幾乎獨立的并可替換的一個部分&#xff0c;它在良好定義的體系結構語境內滿足某清晰的功能。…