Redis的持久化機制RDB和AOF詳解

本文為您介紹redis的持久化機制以及持久化的選型。

目錄

持久化策略

RDB(RedisDatabase)快照

AOF(Append Only File)

混合持久化策略

RDB與AOF對比

持久化策略使用建議

Redis數據備份策略建議

補充知識

save與bgsave對比

bgsave的寫時復制(COW)機制


持久化策略

Redis提供了很多跟數據持久化相關的配置,大體上,可以組成以下幾種策略:

  • 無持久化:完全關閉數據持久化,不保證數據安全。相當于將Redis完全當做緩存。
  • RDB(RedisDatabase)快照:按照一定的時間間隔緩存Redis所有數據快照。
  • AOF(Append Only File):記錄Redis收到的每一次寫操作。這樣可以通過操作重演的方式恢Redis的數據。
  • RDB+AOF:同時保存Redis的數據和操作。

更多內容,請參見https://redis.io/docs/latest/operate/oss_and_stack/management/persistence/

RDB(RedisDatabase)快照

  • 定義:RDB可以在指定的時間間隔,備份當前時間點的內存中的全部數據集,并保存到餐盤文件當中。在恢復時,再將磁盤中的快照文件直接都會到內存里。
  • 特點:RDB存的是全量數據,你甚至可以直接用RDB來傳遞數據。例如如果需要從一個Redis服務中將數據同步到另一個Redis服務(最好是同版本),就可以直接復制最近的RDB文件。
  • 儲存位置:通常是dump.rdb文件。
  • 觸發時機
    • 滿足配置文件中默認的快照配置時,會自動觸發RDB快照。
    • 手動執行save或者bgsave指令時,會觸發RDB快照。
      • 其中save方法會在備份期間阻塞主線程。
      • bgsve則不會阻塞主線程。但是他會fork一個子線程進行持久化,這個過程中會要將數據復制一份,因此會占用更多內存和CPU。
    • 主從復制時會觸發RDB備份。
      LASTSAVE指令查看最后一次成功執行快照的時間。時間是一個代表毫秒的LONG數字,在linux中可以使用date -d @{timestamp} 快速格式化。
  • 核心配置參數
    這些配置直接影響 RDB 持久化的安全性、性能和存儲效率,實際配置時需根據業務對數據一致性的要求、服務器資源(CPU / 磁盤)情況綜合權衡。
    配置參數含義默認值配置建議
    dir指定 RDB 文件和 AOF 文件的存儲目錄無默認值,需手動配置建議設置為獨立的持久化目錄,如/var/lib/redis
    dbfilename指定 RDB 快照文件的名稱dump.rdb保持默認即可,如需區分不同實例可修改,如dump-6379.rdb
    rdbcompression是否啟用 RDB 文件壓縮(使用 LZF 算法)yes1. 建議保持默認yes,節省磁盤空間
    2. 若 CPU 資源緊張且磁盤充足,可設為no提升性能
    stop-writes-on-bgsave-error當 bgsave 快照寫入失敗時,是否停止接受新的寫入請求stop-writes-oin-bgsave-error 。yes1. 生產環境建議保持默認yes,避免數據不一致
    2. 若有其他數據一致性保障機制,可設為no
    rdbchecksum是否對 RDB 文件啟用 CRC64 校驗yes1. 建議保持默認yes,確保數據完整性
    2. 若追求極致性能且能接受一定數據風險,可設為no(約提升 10% 性能)

AOF(Append Only File)

  • 定義:以日志的形式記錄每個寫操作(讀操作不記錄)。
  • 特點:只允許追加文件而不允許改寫文件。
  • 觸發時機:每次寫操作后。
  • 核心參數配置
    配置參數含義默認值配置建議
    appendonly是否開啟 AOF 持久化功能no1. 需持久化時設為yes
    2. 與 RDB 配合使用時建議開啟
    appendfilename指定 AOF 文件的名稱appendonly.aof保持默認即可,多實例可區分命名(如appendonly-6379.aof
    appendfsyncAOF 同步策略
    -?no:由操作系統決定何時同步
    -?everysecond:每秒同步一次
    -?always:每次操作都同步
    everysecond1. 推薦默認everysecond(平衡安全性和性能)
    2. 極高安全性需求用always(性能損耗大)
    3. 性能優先且可容忍數據丟失用no
    appenddirnameAOF 文件存儲子目錄
    實際路徑為{dir}/{appenddirname}
    無默認值Redis 7 + 新增參數,建議設置單獨子目錄(如aof)便于管理
    auto-aof-rewrite-percentageAOF 重寫觸發的增長率閾值100(%)auto-aof-rewrite-min-size配合使用,默認值可滿足多數場景
    auto-aof-rewrite-min-sizeAOF 重寫的最小文件大小閾值64mb避免小文件頻繁重寫,可根據業務量調整(如 128mb)
    no-appendfsync-on-rewriteAOF 重寫期間是否暫停appendfsync操作no1. 設為yes可提高重寫速度,但可能增加數據丟失風險
    2. 追求安全性保持默認no(重寫期間仍按策略同步)

    補充說明

    • AOF 重寫可通過BGREWRITEAOF命令手動觸發,用于緊急優化 AOF 文件。
    • Redis 7 + 的 AOF 重寫會生成base.rdb(基礎快照)和incr.aof(增量操作),結合了 RDB 和 AOF 的優勢。
    • 同步策略和重寫參數需根據業務對 "數據安全性" 和 "性能" 的要求綜合調整。

混合持久化策略

  • 定義:RDB和AOF兩種持久化策略各有優劣,所以在使用Redis時,是支持同時開啟兩種持久化策略的。
  • 開啟方式:在redis.conf配置文件中,有一個aof-use-rdb-preamble參數可以同時打開RDB和AOF兩種持久化策略。但此策略,必須先開啟aof。
  • 寫入過程:如果開啟了混合持久化,AOF在重寫時,不再是單純將內存數據轉換為RESP命令寫入AOF文件,而是將重寫這一刻之前的內存做RDB快照處理,并且將RDB快照內容和增量的AOF修改內存數據的命令存在一起,都寫入新的AOF文件,新的文件一開始不叫appendonly.aof,等到重寫完新的AOF文件才會進行改名,覆蓋原有的AOF文件,完成新舊兩個AOF文件的替換。
    于是在 Redis 重啟的時候,可以先加載 RDB 的內容,然后再重放增量 AOF 日志就可以完代替替代之前的AOF 全量文件重放,因此重啟效率大幅得到提升。混合持久化AOF文件結構如下:

RDB與AOF對比

對比維度RDB(Redis DataBase)AOF(Append Only File)
核心優點1. 文件緊湊,占用存儲空間小,適合定期備份
2. 災難恢復場景中,全量數據恢復效率高
3. 備份時僅 fork 子線程處理,對主線程 IO 性能幾乎無影響
4. 大數據量重啟時,加載速度遠快于 AOF
1. 安全性更高,默認每秒同步(最多丟失 1 秒數據),支持實時同步(always
2. 采用 “追加寫入” 模式,無記錄不完整問題,可通過redis-check-aof工具修復
3. 自動觸發日志重寫,避免單個文件過大
4. 日志為可讀的操作指令,可手動編輯(如刪除誤操作FLUSHALL)實現數據恢復
核心缺點1. 僅定期快照,無法實時備份,宕機時可能丟失快照間隔內的所有數據
2. fork 子線程時需克隆內存數據,數據量大 / CPU 性能差時,會導致 Redis 短暫服務停頓
1. 相同數據集下,AOF 文件體積通常遠大于 RDB 文件
2. 寫操作頻繁時,IO 開銷更高,備份性能弱于 RDB
適用場景1. Redis 作為緩存使用,對數據丟失容忍度較高
2. 需定期全量備份、快速恢復的場景
3. 非核心業務數據,優先保障 Redis 運行性能
1. 對數據安全性要求高,僅能容忍秒級數據丟失的場景
2. 需避免誤操作導致數據丟失,需手動修復日志的場景

持久化策略使用建議

  • 如果您只是把Redis當做一個緩存來用,可以直接關閉持久化。
  • 如果您更關注數據安全性,并且可以接受服務異常宕機時的小部分數據損失,那么可以簡單的使用RDB策略。這樣性能是比較高的。
  • 不建議單獨使用AOF。RDB配合AOF,可以讓數據恢復的過程更快。

Redis數據備份策略建議

  • 寫crontab定時調度腳本,每小時都copy一份rdb或aof的備份到一個目錄中去,僅僅保留最近48小時的備份。

  • 每天都保留一份當日的數據備份到一個目錄中去,可以保留最近1個月的備份。

  • 每次copy備份的時候,都把太舊的備份給刪了。

  • 每天晚上將當前機器上的備份復制一份到其他機器上,以防機器損壞。

補充知識

save與bgsave對比

save和bgsave都能生成RDB快照,那么他么有什么區別呢?
他們最大的區別就是save?法會在備份期間阻塞主線程。bgsve則不會阻塞主線程。但是它會fork?個?線程進?持久化,這個過程中會要將數據復制?份,因此會占?更多內存和CPU。具體對比如下:

配置自動生成rdb文件后臺使用的是bgsave方式。

bgsave的寫時復制(COW)機制

Redis 借助操作系統提供的寫時復制技術(Copy-On-Write, COW),在生成快照的同時,依然可以正常處理寫命令。

簡單來說,bgsave 子進程是由主線程 fork 生成的,可以共享主線程的所有內存數據。

bgsave 子進程運行后,開始讀取主線程的內存數據,并把它們寫入 RDB 文件。此時,如果主線程對這些數據也都是讀操作,那么,主線程和 bgsave 子進程相互不影響。但是,如果主線程要修改一塊數據,那么,這塊數據就會被復制一份,生成該數據的副本。然后,bgsave 子進程會把這個副本數據寫入 RDB 文件,而在這個過程中,主線程仍然可以直接修改原來的數據。

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

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

相關文章

Vue 3 實戰:從零到一用 vue-pdf-embed 打造功能齊全的 PDF 查看器

你好&#xff0c;Vue 開發者們&#xff01; 在 Web 開發中&#xff0c;我們經常會遇到需要在頁面中直接展示 PDF 文件的需求&#xff0c;例如預覽合同、顯示報告或在線閱讀文檔。你可能會想到用 <iframe> 或者一些重量級的庫&#xff0c;但它們往往不夠靈活或過于臃腫。…

adb的常用命令

adb devices 用USB數據線連接電腦&#xff0c;查看連接上的設備 adb tcpip 5555 切換計算機的adb為wifi連接模式 adb connect 192.168.2.250:5555 連接手機的ip地址&#xff0c;如果連接成功&#xff0c;則可拔掉數據線 adb 查看adb的相關信息&#xff0c;包括版本號&#xff0…

穩態太陽光模擬器 | 多源分布式設計的要點有哪些?

穩態太陽模擬器的多源分布式設計&#xff0c;是一種通過多組獨立光源單元分布式排布、結合穩態光學調控技術&#xff0c;實現對太陽光譜、輻照強度及輻照均勻性精準復現的高端光模擬技術。其核心優勢在于突破傳統模擬光源在長期工作穩定性、大面積輻照均勻性及能量傳遞效率上的…

代碼隨想錄 day 35 動態規劃

第九章 動態規劃part03 正式開始背包問題&#xff0c;背包問題還是挺難的&#xff0c;雖然大家可能看了很多背包問題模板代碼&#xff0c;感覺挺簡單&#xff0c;但基本理解的都不夠深入。 如果是直接從來沒聽過背包問題&#xff0c;可以先看文字講解慢慢了解 這是干什么的。 …

大數據探索性分析——抽樣技術應用

2.3 概率抽樣 一、簡單隨機抽樣 # 數據預處理 LoanStats3c read.csv("D:/OneDrive - stu.fynu.edu.cn/大四上學期/ysq-大數據探索性分析/data/2數據集二&#xff1a;Loan Data--Lending Club/LoanStats3c/LoanStats3c.csv", header TRUE, fill TRUE, comment.char…

20 webUI應用中Controlnet精講(06)-結構理解與其它

前面的篇章已經詳細講解了線條約束、三維關系與空間深度、人體姿態等幾類controlnet的功能與應用&#xff0c;本節內容將對通過controlnet對圖像的結構理解及控圖效果。 序號 分類 Controlnet名稱 備注 1 線條約束 Canny&#xff08;硬邊緣&#xff09; 約束性強&#x…

【MFC】對話框屬性:Center(居中)

前言 本文介紹對話框屬性中的Center(居中)&#xff0c;同時給出相關示例便于理解。 目錄1 位置2 詳解3 示例1 位置 首先介紹一下這個屬性在哪里。 在資源視圖中雙擊對話框節點&#xff0c;打開該對話框&#xff1b; 鼠標右鍵工作區空白處&#xff0c;單擊屬性&#xff1b; 此時…

SciKit-Learn 全面分析分類任務 breast_cancer 數據集

背景 乳腺癌數據集&#xff0c;569個樣本&#xff0c;30個特征&#xff0c;2個類別&#xff08;良性/惡性&#xff09; 步驟 加載數據集拆分訓練集、測試集數據預處理&#xff08;標準化&#xff09;選擇模型模型訓練&#xff08;擬合&#xff09;測試模型效果評估模型 分析方法…

【開題答辯全過程】以 _基于SpringBoot技術的“樹洞”心理咨詢服務平臺的設計與實現為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

R 語法高亮為什么沒有,是需要安裝專用的編輯軟件,R語言自帶的R-gui 功能還是比較簡單

R 語法高亮為什么沒有&#xff0c;是需要安裝專用的編輯軟件&#xff0c;R語言自帶的R-gui 功能還是比較簡單 以下是一些主流的 R 編輯軟件&#xff08;IDE / 編輯器&#xff09;&#xff0c;適用于不同需求的用戶&#xff1a; ? 最推薦&#xff1a;RStudio&#xff08;免費/…

使用UniApp實現下拉框和表格組件頁面

使用UniApp實現下拉框和表格組件頁面UniApp提供了一套完整的跨平臺開發框架&#xff0c;支持在多個平臺上運行。下拉框和表格是常見的UI組件&#xff0c;可以通過UniApp內置組件或第三方插件實現。下拉框組件的實現UniApp內置的<picker>組件可以實現下拉選擇功能。以下是…

JavaScript 對象說明

JavaScript 對象說明 1. 對象的基本概念 在 JavaScript 中&#xff0c;對象是一種復合數據類型&#xff0c;用于存儲相關聯的屬性和方法。對象可以看作是屬性的集合&#xff0c;其中每個屬性都由一個鍵&#xff08;key&#xff09;和一個值&#xff08;value&#xff09;組成。…

【競賽系列】機器學習實操項目04——客戶信用評估模型開發全流程(baseline)

上一章&#xff1a;機器學習實操項目03——Scikit-learn介紹及簡單分類案例 下一章&#xff1a; 機器學習核心知識點目錄&#xff1a;機器學習核心知識點目錄 機器學習實戰項目目錄&#xff1a;【從 0 到 1 落地】機器學習實操項目目錄&#xff1a;覆蓋入門到進階&#xff0c;大…

C++中的單例模式的實現

1 什么是單例模式單例模式 是一種創建型設計模式&#xff0c;確保一個類在整個程序生命周期中只有一個實例&#xff0c;并提供一個全局訪問點。核心要求&#xff1a;類不能被外部隨意創建&#xff08;禁止 public 構造函數或限制實例數量&#xff09;。不能被復制或移動。提供一…

匯編基礎1

1.格式偽操作&#xff1a;它們不是ARM處理器實際的指令&#xff08;如MOV&#xff0c; ADD等&#xff09;&#xff0c;而是寫給匯編器看的命令&#xff0c;用于指導匯編器如何工作area reset, code, readonlycode32entry內容 endarea: 這是最重要的一個偽操作&#xff0c;用…

設計模式(C++)詳解—單例模式(2)

<摘要> 單例模式是創建型設計模式中最簡單但應用最廣泛的模式之一&#xff0c;它確保一個類只有一個實例并提供全局訪問點。本文從歷史背景和核心概念出發&#xff0c;系統闡述了單例模式的產生緣由和演進脈絡&#xff0c;深入剖析了其在資源管理、狀態一致性和訪問控制方…

kafka如何保證消息的順序性

kafka如何保證消息的順序性 Kafka只能在分區&#xff08;Partition&#xff09;級別保證消息的順序性&#xff0c;而不能在主題&#xff08;Topic&#xff09;級別保證全局順序。 核心原理&#xff1a;分區和偏移量分區&#xff08;Partition&#xff09;是順序性的基礎&#x…

傳輸層:UDP/TCP協議

網絡協議圖 一.UDP 特點: 無連接&#xff0c;不可靠&#xff0c;面向數據報&#xff0c;全雙工&#xff08;前面網絡編程中介紹過&#xff09; 格式: 服務器的端口號一般都是程序員指定的(這樣你才能訪問到),客戶端的端口號是系統自動分配的(如果提前指定好, 可能會與其他程…

A/B測試全解析:原理、流程與實戰案例

A/B測試&#xff08;AB Testing&#xff09;原理與實踐全解析 在數據驅動的時代&#xff0c;A/B測試幾乎是每一個互聯網公司都會使用的實驗方法。無論是電商平臺優化轉化率&#xff0c;還是內容平臺提升點擊率&#xff0c;抑或是游戲公司提升留存&#xff0c;A/B測試都是最常見…

循環神經網絡(三):小練習

RNN小練習 要求&#xff1a; 假設有 4 個字 吃 了 沒 &#xff1f;&#xff0c;請使用 torch.nn.RNN 完成以下任務 將每個進行 one-hot 編碼請使用 吃 了 沒 作為輸入序列&#xff0c;了 沒 &#xff1f; 作為輸出序列RNN 的 hidden_size 64請將 RNN 的輸出使用全連接轉換成 4…