Redis持久化機制(RDB AOF)

1. RDB

????????RDB 持久化是把當前進程數據生成快照保存到硬盤的過程,觸發 RDB 持久化過程分為手動觸發和 自動觸發,存儲的是二進制數據。

1.1 手動觸發

使用 save 和 bgsave 命令觸發:

  • save:Redis服務主進程阻塞式執行持久化操作,直到RDB過程結束,在此期間 Redis 服務端無法執行客戶端的命令,持久化數據量大的情況下,會導致主進程長時間阻塞,使用較少;
  • bgsave:后臺執行持久化操作,Redis主進程使用 fork 創建子進程,RDB持久化過程由子進程負責執行,阻塞時間較短,只發生在fork階段;

1.2 自動觸發

  • 自動觸發在 Redis 配置文件 redis.conf 中進行配置, 比如:如 "save m n" 表示 m 秒內數據集發生了 n 次修改,自動 RDB 持久化。
  • 從節點進行全量復制操作時,主節點?動進行 RDB 持久化,隨后將 RDB ?件內容發送給從結點。
  • 執行?shutdown 命令關閉 Redis 時,也會執行RDB 持久化。

1.3 持久化流程

    RDB 是快照式的數據保存,常見的持久化操作都是在 后臺進行的(bgsave)流程如下:

    1. ?檢查是否已有持久化進程運行?,如果有就直接返回;
    2. Redis 主進程調用?fork()創建子進程,fork 過程會短暫阻塞主線程(阻塞時間取決于內存大小和系統性能),且由于 父進程創建的子進程和父進程共享數據,詳細介紹可見【Linux進程】進程地址空間-CSDN博客
    3. 父進程 fork 完成后,bgsave 命令返回 "Background saving started" 信息并不再阻塞父進程,可以繼續響應其他命令。
    4. 子進程創建 RDB ?件,根據父進程內存生成臨時快照文件,完成后對原有文件進行原子替換。
    5. 進程發送信號給父進程示完成,父進程更新統計信息

    1.4 RDB文件

    RDB 文件默認在 /var/lib/redis/ 下,文件名通過 dbfilename 配置(默認為 dump.rdb)指定;config set dir {newDir} 和 config set dbfilename??{newFilename} 運行期間動態執行,當下次運行時 RDB 文件會保存到新目錄

    Redis 默認采? LZF 算法對生成的 RDB ?件做壓縮處理,壓縮后的?件遠遠小于內存大小,默認開啟,可以通過參數 config set rdbcompression {yes|no} 動態修改。

    注意:如果 Redis 啟動時加載到損壞的 RDB 文件會拒絕啟動。這時可以使用?Redis 提供的 redischeck-dump ?具檢測 RDB 文件并獲取對應的錯誤報告。

    1.5 優缺點

    優點

    • RDB 是?個緊湊壓縮的?進制?件,存儲 Redis 在某個時間點上的數據快照。非常適用于備份,全量復制等場景;
    • 數據恢復速度比 AOF 快;

    缺點:

    • 無法實時持久化(每次都會fork創建子進程,該操作屬于重量級操作,頻繁創建會嚴重影響性能);
    • RDB 文件使用特定?進制格式保存,Redis 版本演進過程中有多個 RDB 版本,兼容性可能有風險。

    2. AOF

    AOF(Append Only File)持久化:以獨立日志的方式記錄每次的寫命令,重啟時再重新執行?AOF?文件中的命令達到恢復數據的目的。AOF 的主要作用是解決了數據持久化的實時性,目前已經是 Redis 持久化的主流方式。

    寫入的數據可讀性也相對較好,比如:set hello world

    那么在文件中就會追加以下文本:

    *3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n

    2.1 配置 AOF

    開啟 AOF 功能需要設置配置:appendonly yes,默認不開啟。AOF 文件名通過?appendfilename 配置(默認是 appendonly.aof)設置。保存目錄同 RDB 持久化方式?致,通過 dir?配置指定;

    2.2 工作流程

    1. 所有的寫入命令會追加到 aof_buf(緩沖區)中。

    2. AOF 緩沖區根據對應的策略向硬盤做同步操作。?

    3. 隨著 AOF文件越來越大,需要定期對 AOF 文件進行重寫,達到壓縮的目的。

    4. 當 Redis 服務器啟動時,可以加載 AOF 文件進行數據恢復。

    2.3 文件同步

    由于存在緩沖區的緣故,對于緩沖區同步到文件主要分為三種策略:

    可配置值

    說明

    數據安全性

    性能影響

    適用場景

    ??always??

    每次寫入命令后立即調用?fsync同步到磁盤,完成后才返回成功響應。

    最高

    性能最低(頻繁磁盤 I/O)

    對數據一致性要求極高的場景(如金融交易)

    ??everysec??

    命令先寫入內存緩沖區(aof_buf),隨后調用?write操作(不立即?fsync)。后臺線程每秒執行一次?fsync

    中等

    性能與安全的平衡(推薦默認值)

    大多數生產環境

    ??no??

    命令寫入?aof_buf后僅調用?write操作,由操作系統決定何時?fsync(通常間隔 30 秒或緩沖區滿)。

    最低

    性能最高(但可能丟失更多數據)

    可容忍少量數據丟失的高吞吐場景

    write 和 fsync說明:

    write:write會觸發操作系統的延遲寫機制,write 操作在寫入系統緩沖區后就會立即返回;同步到硬盤操作依賴于系統調度機制;如果數據在操作系統緩沖區內還沒落盤,此時發生斷電或系統宕機,那么緩沖區數據就會丟失;

    fsync:針對單個文件操作,做強制硬盤同步,fsync 將阻塞直到數據寫入到硬盤;

    2.4 重寫機制

    隨著命令不斷寫入 AOF,文件會越來越大,為了解決這個問題,Redis 引? AOF 重寫機制壓縮? 件體積。

    為什么會越來越大?比如:

    set k1 v1
    set k2 v2
    del k1

    數據實際只存儲了 k2?- v2,但存儲了三條命令;重寫機制可以認為是對 AOF 文件的整理;比如:

    • 進程內已超時的數據不再寫入文件。
    • 舊的 AOF 中的無效命令,例如 del、hdel、srem 等重寫后將會刪除,只需要保留數據的最終版 本。
    • 多條寫操作合并為?條,例如 lpush list a、lpush list b、lpush list c 可以合并為 lpush list a b?c。

    AOF 重寫過程可以手動動觸發和自動觸發:

    • 手動觸發:調用?bgrewriteaof 命令。?
    • 自動觸發:根據 auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage 參數確定?動觸發時機

    auto-aof-rewrite-min-size:表示觸發重寫時 AOF 的閾值,默認為 64MB。

    auto-aof-rewrite-percentage:代表當前 AOF 占用大小相比較上次重寫時增加的比例。

    2.5 重寫流程

    1. 執行重寫請求,如果當前進程正在執行 AOF 重寫,請求不執行。如果當前進程正在執行 bgsave 操作,重寫命令延遲到 bgsave 完成之后再執行。

    2. 父進程執行 fork 創建子進程

    3. 重寫

    ????????3.1 主進程 fork 之后繼續響應其他命令,后續所有修改操作會被記錄到 aof_buf 中,根據策略進行落盤;

    ????????3.2 子進程只有fork之前的所有內存數據,在子進程重寫的期間,父進程需要將修改操作寫入?AOF 重寫緩沖區中;

    4. 子進程根據內存快照,讀取內存中數據,整理后寫入到新的AOF文件中;

    5. 完成重寫,進行AOF文件替換

    ????????5.1 新文件寫入后,子進程發送信號給父進程。

    ????????5.2 父進程把 AOF 重寫緩沖區內臨時保存的命令追加到新 AOF ?件中。

    ????????5.3 用新 AOF 文件替換舊 AOF 文件。

    3. 啟動時數據恢復

    當 Redis 啟動時,會根據 RDB 和 AOF 文件的內容,進行數據恢復;

    ??當 Redis 重啟時,如果 AOF 文件和 RDB 文件同時存在,Redis 會優先使用 AOF 文件進行數據恢復?;

    ??步驟??

    ??行為??

    ??檢查 AOF 是否啟用??

    如果?appendonly yes(AOF 已啟用),則??跳過 RDB??,直接加載 AOF 文件。

    ??AOF 文件不存在/損壞??

    如果 AOF 文件不可用(如文件損壞),則嘗試加載 RDB 文件作為備用恢復。

    ??AOF 和 RDB 均未啟用??

    啟動一個空數據集(無持久化數據)。

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

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

    相關文章

    【css】讓瀏覽器支持小于12px的文字

    【css】讓瀏覽器支持小于12px的文字.demo {display: inline-block;/** 使用Webkit引擎的變換屬性(主要針對舊版Safari/Chrome) **/-webkit-transform: scale(0.8); }注意:display: inline-block; 一定要加上!1.transform: scale(…

    機器學習-基礎入門:從概念到核心方法論

    在人工智能飛速發展的今天,機器學習作為其核心技術,正深刻改變著我們的生活與工作。從 AlphaGo 戰勝圍棋世界冠軍,到日常的智能推薦、人臉識別,機器學習的應用無處不在。本文將從基礎概念出發,帶你系統了解機器學習的核…

    《Leetcode》-面試題-hot100-動態規劃

    題目列表 70. 爬樓梯 簡單難度 leetcode鏈接 118. 楊輝三角 簡單難度 leetcode鏈接 198. 打家劫舍 中等難度 leetcode鏈接 279.完全平方數 中等難度 leetcode鏈接 322.零錢兌換 中等難度 leetcode鏈接 139.單詞拆分 中等難度 leetcode鏈接 300.最長遞增子序列 中等難度 l…

    數巔中標中建科技AI知識庫項目,開啟建筑業數智化新篇章

    AI正以前所未有的迅猛態勢滲透進建筑業的每一處脈絡。在這場數智化轉型浪潮中,AI技術如何與建筑業基因深度融合?如何充分釋放數據價值?近日,數巔成功中標中建科技集團有限公司“企業AI知識庫研發”項目,這一“大語言模…

    想要PDF翻譯保留格式?用對工具是關鍵

    嘿,朋友!最近有沒有被PDF翻譯的事兒搞得焦頭爛額呀?尤其是碰到韓文PDF文件的時候,是不是更頭疼了?別擔心,我最近也遇到了類似的問題,試了不少軟件,發現有五款軟件在處理韓文PDF翻譯時…

    【MySQL?】服務器安裝 MySQL 及配置相關操作

    1. 安裝 MySQL 在安裝 MySQL 時,如果使用官方 RPM 源,會遇到 GPG 密鑰驗證失敗的錯誤,可以按照以下步驟解決: 解決 GPG 密鑰驗證失敗的問題下載 MySQL 官方 GPG 密鑰 使用以下命令下載并安裝 MySQL 的官方 GPG 密鑰: w…

    大數據量返回方案(非分頁)

    一、普通方式返回100萬條數據RestController RequestMapping("/bad") public class BadController {Autowiredprivate UserRepository userRepository;/*** 危險&#xff01;一次性加載 100 萬條到內存*/GetMapping("/all-users")public List<User> …

    基于Casbin的微服務細粒度權限控制方案對比與實踐

    基于Casbin的微服務細粒度權限控制方案對比與實踐 隨著微服務架構在互聯網和企業級應用中的廣泛應用&#xff0c;服務間的安全邊界愈發重要。傳統的集中式權限控制方式已難以滿足微服務的高并發、動態擴展和多語言支持等需求。本文將從主流的三種微服務權限控制方案入手&#x…

    5G毫米波現狀概述(截止2025 年7月)

    5G毫米波現狀概述(截止2025 年7月&#xff09; 原創 modem協議筆記 2025年07月25日 06:01 廣東 聽全文 當你在體育館看球賽時&#xff0c;想發段實時視頻到朋友圈卻總卡成PPT&#xff1b;當郊區的父母抱怨“光纖拉不到家&#xff0c;網速比蝸牛慢”—這些場景背后&#xff…

    thymeleaf 日期格式化顯示

    在Thymeleaf中處理日期格式化顯示主要有以下幾種方式&#xff1a; 1. 使用#dates.format()方法進行基礎格式化&#xff1a; <p th:text"${#dates.format(dateObj, yyyy-MM-dd HH:mm:ss)}"></p>這種方法支持自定義格式模式&#xff0c;如yyyy表示年份、MM…

    【經驗分享】如何在Vscode的Jupyter Notebook中設置默認顯示行號

    【經驗分享】如何在Vscode的Jupyter Notebook中設置默認顯示行號 打開設置&#xff0c;搜索&#xff1a;Notebook: Line Number&#xff0c;然后把這個設置為on

    藍橋杯STL stack

    STL stack 概述棧&#xff08;stack&#xff09;是一種遵循**后進先出&#xff08;LIFO&#xff09;**原則的線性數據結構&#xff0c;僅允許在棧頂進行插入和刪除操作。STL&#xff08;Standard Template Library&#xff09;中的 stack 是一個容器適配器&#xff0c;基于其他…

    從0到1:飛算JavaAI如何用AI魔法重構MCP服務全生命周期?

    摘要 本文詳細介紹了如何利用飛算JavaAI技術實現MCP&#xff08;Model Context Protocol&#xff09;服務的創建及通過的全過程。首先闡述了飛算JavaAI的基本概念、特點和優勢&#xff0c;接著對MCP服務的需求進行分析&#xff0c;然后按照軟件開發流程&#xff0c;從系統設計、…

    Webpack Loader 完全指南:從原理到配置的深度解析

    掌握 Webpack Loader 的核心機制&#xff0c;解鎖前端工程化進階技能前言&#xff1a;為什么需要理解 Loader&#xff1f; 在現代前端工程化體系中&#xff0c;Webpack 已成為構建工具的事實標準。然而面對非標準 JavaScript 文件或自定義語法時&#xff0c;你是否遇到過 Modul…

    讀書筆記:《我看見的世界》

    《我看見的世界.李飛飛自傳》李飛飛 著&#xff0c;趙燦 譯個人理解&#xff1a; 是本自傳&#xff0c;也是AI的發展史 堅持&#xff0c;總會轉機&#xff0c;“一不小心”也許就成了算法、大規模數據、原始算力人工智能似乎一夜之間從一個小眾的學術領域爆發成為推動全球變革的…

    使用純NumPy實現回歸任務:深入理解機器學習本質

    在深度學習框架普及的今天&#xff0c;回歸基礎用NumPy從頭實現機器學習模型具有特殊意義。本文將完整演示如何用純NumPy實現二次函數回歸任務&#xff0c;揭示機器學習底層原理。整個過程不使用任何深度學習框架&#xff0c;每一行代碼都透明可見。1. 環境配置與數據生成 impo…

    java理解

    springboot 打包 mvn install:install-file -Dfile=<path-to-jar> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=jar <path-to-jar> 是你的 JAR 文件的路徑。 <group-id> 是你的項目的組 ID。 <…

    圖論核心算法詳解:從存儲結構到最短路徑(附C++實現)

    目錄 一、圖的基礎概念與術語 二、圖的存儲結構 1. 鄰接矩陣 實現思路&#xff1a; 2. 鄰接表 實現思路&#xff1a; 應用場景&#xff1a; 時間復雜度分析&#xff1a; 三、圖的遍歷算法 1. 廣度優先搜索&#xff08;BFS&#xff09; 核心思想&#xff1a; 應用場…

    力扣top100(day03-02)--圖論

    本文為力扣TOP100刷題筆記 筆者根據數據結構理論加上最近刷題整理了一套 數據結構理論加常用方法以下為該文章&#xff1a; 力扣外傳之數據結構&#xff08;一篇文章搞定數據結構&#xff09; 200. 島嶼數量 class Solution {// DFS輔助方法&#xff0c;用于標記和"淹沒&q…

    建造者模式:從“參數地獄”到優雅構建

    深夜&#xff0c;一條緊急告警刺穿寂靜&#xff1a;核心報表服務因NullPointerException全線崩潰。排查根源&#xff0c;罪魁禍首竟是一個擁有10多個參數的“上帝構造函數”。本文將從這個災難現場出發&#xff0c;引入“鏈式建造者模式”進行重構&#xff0c;并深入Spring AI、…