redis數據結構-11(了解 Redis 持久性選項:RDB 和 AOF)

了解 Redis 持久性選項:RDB 和 AOF

Redis 提供了多個持久性選項,以確保數據持久性并防止在服務器發生故障或重啟時丟失數據。了解這些選項對于為您的特定使用案例選擇正確的策略、平衡性能和數據安全至關重要。本章節將深入探討 Redis 中的兩種主要持久性機制:Redis 數據庫 (RDB) 快照和僅附加文件 (AOF)。我們將探討它們的工作原理、優點和缺點以及如何配置它們。

了解 RDB 快照

RDB(Redis 數據庫)持久性按指定的時間間隔執行數據集的時間點快照。這些快照表示 Redis 數據庫在特定時刻的整個狀態。

RDB 的工作原理

當指示 Redis 創建 RDB 快照時,它會執行以下步驟:

  1. **分 叉:**Redis 使用 fork() 系統調用創建子進程。此子進程是父進程(Redis 服務器)的精確副本。
  2. 數據轉儲: 然后,子進程遍歷內存中的整個數據集,并將其寫入磁盤上的臨時文件。
  3. 文件壓縮(可選): 默認情況下,Redis 使用 LZF 壓縮來壓縮 RDB 文件以減小其大小。這可以進行配置。
  4. 原子替換: 子進程完成 RDB 文件的寫入后,它會以原子方式將舊的 RDB 文件(如果存在)替換為新的 RDB 文件。這可確保 RDB 文件始終處于一致狀態。
  5. 子進程終止: 然后,子進程將退出,從而釋放系統資源。

在整個過程中,父進程繼續為客戶端請求提供服務,從而最大限度地減少停機時間。但是,fork() 作可能會占用大量資源,尤其是對于大型數據集,因為它暫時需要雙倍的內存。

配置 RDB 快照

您可以使用 redis.conf 文件中的 save 指令配置 RDB 快照。save 指令采用兩個參數:秒數和在這些秒內必須發生的更改數才能觸發快照。

例如:

save 900 1       # Save the DB if at least 1 key changed in 900 seconds
save 300 10      # Save the DB if at least 10 keys changed in 300 seconds
save 60 10000    # Save the DB if at least 10000 keys changed in 60 seconds

redis.conf 中的這些行定義了三個不同的保存點。如果滿足_這些條件中的任何一個_ ,Redis 將觸發 RDB 快照。您可以通過注釋掉所有保存行來完全禁用 RDB 快照。

您還可以使用 redis-cli 中的 SAVEBGSAVE 命令手動觸發 RDB 快照。

  • SAVE: 此命令執行同步保存,阻止 Redis 服務器,直到快照完成。通常不建議將其用于生產環境。
  • BGSAVE: 此命令使用上述相同的分叉機制執行異步保存。它允許 Redis 服務器在創建快照時繼續為客戶端請求提供服務。

RDB 的優勢

  • **壓 實 度:**RDB 文件非常緊湊,非常適合用于備份和災難恢復。
  • **性能:**RDB 快照的創建(尤其是壓縮)和還原速度相對較快。
  • **災難恢復:**RDB 非常適合災難恢復,因為單個文件代表整個數據集。
  • **數據可移植性:**RDB 文件易于移植,可以傳輸到其他服務器或存檔以進行長期存儲。

RDB 的缺點

  • **數據丟失可能性:**RDB 快照是時間點備份,因此在快照之間寫入的任何數據在服務器發生故障時都將丟失。可能的數據丟失量取決于配置的存儲間隔。
  • 分叉開銷:fork() 作可能會占用大量資源,尤其是對于大型數據集,這可能會導致暫時的性能下降。

RDB 配置選項

除了 save 指令之外,redis.conf 中其他與 RDB 相關的配置選項還包括:

  • stop-writes-on-bgsave-error:如果設置為 yes(默認值),則當 BGSAVE 命令失敗時,Redis 將停止接受寫入作。這可以防止在出現磁盤錯誤或磁盤空間不足時損壞數據。
  • rdbcompression:如果設置為 yes(默認值),Redis 將使用 LZF 壓縮 RDB 文件。將其設置為 no 可以提高 CPU 性能,但會導致 RDB 文件變大。
  • rdbchecksum:如果設置為 yes(默認值),Redis 將在 RDB 文件中包含一個校驗和,以檢測數據損壞。將其設置為 no 可以提高性能,但會降低數據完整性。
  • dbfilename:指定 RDB 文件的名稱(默認值:dump.rdb)。
  • dir:指定 RDB 文件的存儲目錄(默認:Redis 工作目錄)。

了解 AOF(僅追加文件)

AOF(僅附加文件)持久性為 RDB 快照提供了更持久的替代方案。AOF 不會定期拍攝快照,而是記錄服務器收到的每個寫入作。

AOF 的工作原理

啟用 AOF 后,Redis 會將每個寫入作(例如 SETHSET、``LPUSH) 附加到 AOF 文件中。此文件實質上包含對數據庫執行的所有寫入作的完整歷史記錄。

  1. 命令附加: 每次執行寫入作時,Redis 都會將相應的命令附加到 AOF 文件中。該命令以 Redis 協議格式編寫。
  2. **文件同步:**AOF 文件會定期同步到磁盤,以保證數據的持久性。此同步的頻率是可配置的。
  3. AOF 重寫: 隨著時間的推移,AOF 文件可能會變得非常大,因為它包含所有寫入作的歷史記錄。為了減小文件大小,Redis 可以執行 AOF 重寫。AOF 重寫會創建一個新的、更小的 AOF 文件,其中包含重新創建當前數據集所需的最少命令集。這與 RDB 快照的工作方式類似,但結果仍然是 AOF 文件。

配置 AOF

AOF 在 redis.conf 文件中配置。關鍵配置選項包括:

  • appendonly:設置為 yes 以啟用 AOF 持久化。設置為 no 可禁用它(默認)。
  • appendfilename:指定 AOF 文件的名稱(默認:appendonly.aof)。
  • appendfsync:指定 Redis 應將 AOF 文件同步到磁盤的頻率。它可以具有以下值之一:
    • always:在每次寫入作后同步。這提供了最高級別的數據持久性,但也提供了最低的性能。
    • everysec:每秒同步一次。這是數據持久性和性能之間的良好平衡(推薦)。
    • no:讓作系統決定何時同步。這提供了最佳性能,但數據持久性級別最低。

AOF 重寫配置

使用以下選項配置 AOF 重寫:

  • auto-aof-rewrite-percentage:指定在觸發重寫之前 AOF 文件必須增長的百分比。例如,值 100 表示 AOF 文件的大小必須翻倍才能觸發重寫。
  • auto-aof-rewrite-min-size:指定觸發重寫之前 AOF 文件的最小大小。這可以防止重寫非常小的 AOF 文件。

您還可以使用 redis-cli 中的 BGREWRITEAOF 命令手動觸發 AOF 重寫。

AOF 的優勢

  • **高數據持久性:**AOF 提供比 RDB 更高的數據持久性,尤其是在使用 appendfsync alwaysappendfsync everysec 時。
  • 減少數據丟失: 如果服務器發生故障,AOF 可確保將數據丟失降至最低,因為只有最后幾個尚未同步到磁盤的命令會丟失。
  • **人類可讀格式:**AOF 文件采用人類可讀格式(Redis 協議),因此可以更輕松地在需要時手動調試和恢復數據。

AOF 的缺點

  • **較大的文件大小:**AOF 文件通常比 RDB 文件大,因為它們包含所有寫入作的歷史記錄。
  • **性能開銷:**AOF 可能會帶來性能開銷,尤其是在始終使用 appendfsync 時。
  • **重寫開銷:**AOF 重寫可能是資源密集型的,盡管它是在后臺執行的。

RDB 與 AOF:比較

特征RDBAOF
數據持久性較低 (可能丟失數據)更高(最小數據丟失)
文件大小較小較大
性能更快更慢(尤其是 always
恢復時間更快較慢(需要重放命令)
配置save 指令appendonlyappendfsync 指令
使用案例備份、災難恢復、緩存需要高數據持久性的應用程序

選擇正確的持久性選項

RDB 和 AOF 之間的選擇取決于您的具體要求:

  • RDB: 如果您需要快速備份和恢復,并且可以容忍一些數據丟失,請使用 RDB。它適用于數據丟失不嚴重的緩存方案。
  • 主干: 如果您需要高數據持久性并且無法承受丟失數據,請使用 AOF。它適用于數據完整性至關重要的應用程序,例如金融系統或存儲關鍵用戶信息的數據庫。
  • 混合方法: 您還可以同時使用 RDB 和 AOF。在這種情況下,Redis 將使用 AOF 來恢復數據,因為它提供了最完整的數據集。RDB 仍可用于非關鍵情況下的備份和更快的恢復。

實例

示例 1:為緩存服務器配置 RDB

假設您使用 Redis 作為網站的緩存服務器。數據丟失是可以接受的,因為可以從主數據庫中檢索數據。在這種情況下,您可以配置具有相對不頻繁的保存間隔的 RDB:

save 600 100      # Save if at least 100 keys changed in 600 seconds
save 300 1000     # Save if at least 1000 keys changed in 300 seconds
save 60 10000     # Save if at least 10000 keys changed in 60 seconds

此配置為緩存服務器提供了性能和數據持久性之間的良好平衡。

示例 2:為會話存儲配置 AOF

假設您使用 Redis 作為電子商務網站的會話存儲。數據丟失是不可接受的,因為它可能導致用戶丟失購物車或被注銷。在這種情況下,您應該每 sece 使用 appendfsync 配置 AOF:

appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec

此配置可確保每秒將每個會話更改寫入磁盤,從而最大限度地降低數據丟失的風險。

示例 3:同時使用 RDB 和 AOF

對于假設的財務應用程序,您可以同時使用 RDB 和 AOF。每 squad 使用 appendfsync 的 AOF 可確保將事務記錄的數據丟失降至最低。RDB 快照每天在非高峰時段拍攝,為災難恢復和報告目的提供方便的備份。如果服務器發生故障,Redis 將使用 AOF 文件進行恢復。如果 AOF 文件已損壞或不可用,則可以將每日 RDB 快照用作回退,從而承認自上次快照以來可能會丟失數據。

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

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

相關文章

LLaMA-Factory:環境準備

一、硬件和系統 操作系統: Ubuntu 24.04.2 LTS(64位)GPU: NVIDIA RTX 4090 筆記本 GPU,16GB顯存CPU: 建議高性能多核 CPU(如 Intel i7/i9 或 AMD Ryzen 7/9)以支持數據預處理,我的是32核。RAM: 至少 32GB&…

2025 uniapp的請求封裝工具類以及使用【拿來就用】

一、創建一個http請求封裝的js文件,名字自定義:my_http.js /*** 基礎API請求地址(常量,全大寫命名規范)* type {string}* constant*/ let BASE_URL //通過環境來判斷基礎路徑 if (process.env.NODE_ENV development…

Qt應用程序啟動時的一些思路:從單實例到性能優化的處理方案

程序啟動時優化的價值 在桌面軟件開發領域,應用程序的啟動過程就像音樂的序曲,決定了用戶對軟件品質的第一印象。比如首次啟動等待超過3秒時,會讓大多數用戶產生負面看法,而專業工具軟件的容忍閾值甚至更低。Qt框架作為跨平臺開發的利器,其啟動過程的優化不僅關乎用戶體驗…

Node.js入門指南:開啟JavaScript全棧開發之旅

Hi,我是布蘭妮甜 !Node.js讓JavaScript突破了瀏覽器的限制,成為全棧開發的利器。作為基于V8引擎的高性能運行時,它徹底改變了JavaScript只能做前端開發的局面。本文將帶你快速掌握Node.js的核心用法:環境搭建與模塊系統…

MySQL MCP 使用案例

## 概述 MySQL MCP(MySQL Multi-Channel Protocol)是MySQL的多通道協議實現,提供了高效的數據庫連接池和負載均衡功能。本文檔將介紹MySQL MCP的基本使用方法和常見案例。 ## 環境準備 ### 安裝MySQL MCP bash pip install mysql-mcp ### 基…

基于 React Hook 封裝 Store 的三種方案

基于 React Hook 封裝 Store 的三種方案 方案一&#xff1a;基于 useSyncExternalStore 的輕量級 Store&#xff08;推薦&#xff09; import { useSyncExternalStore } from react;type Store<T> {state: T;listeners: Set<() > void>; };function createSt…

MySQL 8.0 OCP 1Z0-908 131-140題

Q131.You have upgraded the MySQL binaries from 5.7.28 to 8.0.18 by using an in-place upgrade. Examine the message sequence generated during the first start of MySQL 8.0.18: 。。。[System]。。。/usx/sbin/mysqld (mysqld 8.0.18-commercial) starting as process…

正向代理和反向代理的區別?

前言 在現代網絡架構中&#xff0c;代理服務器扮演著至關重要的角色。無論是企業網絡還是互聯網服務&#xff0c;代理技術都廣泛應用以提高性能、安全性和可管理性。正向代理和反向代理是兩種最常見的代理類型&#xff0c;雖然它們都作為中間人處理客戶端和服務器之間的通信&am…

技術融資:概念與形式、步驟與案例、挑戰與應對、發展趨勢

一、技術融資概述 技術融資是指通過外部資金支持技術研發、產品開發或市場擴展的過程。它通常涉及風險投資、天使投資、私募股權、眾籌等多種形式。技術融資的核心目標是為技術創新提供資金保障&#xff0c;推動技術從概念到市場的轉化。 技術融資的主要形式包括以下幾種&…

從硬件角度理解“Linux下一切皆文件“,詳解用戶級緩沖區

目錄 前言 一、從硬件角度理解"Linux下一切皆文件" 從理解硬件是種“文件”到其他系統資源的抽象 二、緩沖區 1.緩沖區介紹 2.緩沖區的刷新策略 3.用戶級緩沖區 這個用戶級緩沖區在哪呢&#xff1f; 解釋關于fork再加重定向“>”后數據會打印兩份的原因 4.內核緩沖…

車道線檢測----CLRERNet

CLRerNet&#xff1a;利用LaneIoU提升車道檢測置信度 摘要 車道標檢測在自動駕駛和駕駛輔助系統中至關重要。現代深度車道檢測方法在車道檢測基準測試中表現出色。通過初步的預言機實驗&#xff0c;我們首次拆解車道表示組件以確定研究方向。我們表明&#xff0c;正確的車道位…

ML307R 的 USB Vendor ID (VID):0x2ECC ML307R 的 USB Product ID (PID):0x3012

可以的&#xff0c;在文檔的「Table 3. VID、PID查詢表」中明確指出&#xff1a; ML307R 的 USB Vendor ID (VID)&#xff1a;0x2ECCML307R 的 USB Product ID (PID)&#xff1a;0x3012 你可以將這對 VID/PID 加到 Linux 的 option 驅動中&#xff0c;比如&#xff1a; ech…

論信息系統項目的范圍管理

論信息系統項目的范圍管理 前言一、規劃范圍管理&#xff0c;收集需求二、定義范圍三、創建工作分解結構四、確認范圍五、控制范圍 前言 為了應對煙草零售客戶數量大幅度增長所帶來的問題&#xff0c;切實履行控煙履約的相關要求&#xff0c;同時也為了響應國務院“放管服”政策…

MongoDB與PostgreSQL兩個數據庫的特點詳細對比

MongoDB 和 PostgreSQL 是兩種不同類型的數據庫&#xff0c;分別屬于 ??NoSQL&#xff08;文檔型&#xff09;?? 和 ??關系型&#xff08;SQL&#xff09;?? 數據庫。它們在數據模型、查詢語言、擴展性、事務支持等方面有顯著差異。以下是詳細對比&#xff1a; ??1. …

計算機網絡:什么是電磁波以及有什么危害?

電磁波詳解 電磁波(Electromagnetic Wave)是由電場和磁場相互激發、在空間中傳播的能量形式。它既是現代通信的基石(如手機、Wi-Fi、衛星信號),也是自然界中光、熱輻射等現象的本質。以下從定義、產生、特性、分類及應用全面解析: 一、電磁波的本質 1. 核心定義 電場與…

如何使用 Solana Yellowstone gRPC 重新連接和重放插槽

Yellowstone gRPC 是一個功能強大、可用于生產環境且經過實戰檢驗的工具&#xff0c;用于流式傳輸實時的 Solana 數據。但在實際條件下&#xff0c;網絡中斷或服務器重啟可能導致連接中斷。如果沒有適當的重連策略&#xff0c;你的應用程序可能會錯過區塊鏈的關鍵更新。 為了防…

foxmail - foxmail 啟用超大附件提示密碼與帳號不匹配

foxmail 啟用超大附件提示密碼與帳號不匹配 問題描述 在 foxmail 客戶端中&#xff0c;啟用超大附件功能&#xff0c;輸入了正確的賬號&#xff08;郵箱&#xff09;與密碼&#xff0c;但是提示密碼與帳號不匹配 處理策略 找到 foxmail 客戶端目錄/Global 目錄下的 domain.i…

MySQL 事務(一)

文章目錄 CURD不加控制&#xff0c;會有什么問題CURD滿足什么屬性&#xff0c;能解決上述問題&#xff1f;什么是事務為什么要有事務事務的版本支持了解事務的提交方式 事務常見操作方式研究并發場景事務的正常操作事務的非正常情況的案例結論事務操作的注意事項 CURD不加控制&…

CSS面試題匯總

在前端開發領域&#xff0c;CSS 是一項不可或缺的技術。無論是頁面布局、樣式設計還是動畫效果&#xff0c;CSS 都扮演著重要的角色。因此&#xff0c;在前端面試中&#xff0c;CSS 相關的知識點往往是面試官重點考察的內容。為了幫助大家更好地準備面試&#xff0c;本文匯總了…

Java 后端給前端傳Long值,精度丟失的問題與解決

為什么后端 Long 類型 ID 要轉為 String&#xff1f; 在前后端分離的開發中&#xff0c;Java 后端通常使用 Long 類型作為主鍵 ID&#xff08;如雪花算法生成的 ID&#xff09;。但如果直接將 Long 返回給前端&#xff0c;可能會導致前端精度丟失的問題&#xff0c;特別是在 J…