redis----持久化

Redis 提供了兩種主要的持久化機制,用于將內存中的數據保存到磁盤,以防止服務器重啟或故障導致數據丟失。這兩種機制分別是 RDB(Redis Database)和 AOF(Append Only File)。

1. RDB 持久化

RDB 是 Redis 默認的持久化方式,它通過創建內存中數據的快照來實現持久化。

2.RDB 持久化的觸發方式

1. 自動觸發(配置文件方式)

這是最常用的方式,通過在 Redis 配置文件(redis.conf)中設置觸發條件,當滿足條件時自動執行 RDB 持久化。

配置格式:

save <seconds> <changes>

表示在?seconds?秒內發生了至少?changes?次數據修改時,觸發 RDB 快照。

默認配置:

save 900 1    # 900秒內有至少1個鍵被修改
save 300 10   # 300秒內有至少10個鍵被修改
save 60 10000 # 60秒內有至少10000個鍵被修改

2. 手動觸發

可以通過 Redis 命令手動觸發 RDB 持久化:

  • SAVE?命令
    執行該命令時,Redis 主進程會直接進行 RDB 持久化操作,期間會阻塞所有客戶端請求,直到 RDB 完成。

    127.0.0.1:6379> SAVE
    OK
    

    適合在低峰期或維護時使用。

  • BGSAVE?命令
    執行該命令時,Redis 會 fork 一個子進程來進行 RDB 持久化,主進程繼續處理客戶端請求,不會阻塞服務。

    127.0.0.1:6379> BGSAVE
    Background saving started
    

    這是更常用的手動觸發方式。

注意:

執行flushall也會清空rdb文件

1.fork

在 Redis 中,fork?是一個非常關鍵的系統調用(由操作系統提供),用于創建一個與當前進程(父進程)幾乎完全相同的新進程(子進程)。

當 Redis 執行?BGSAVE?命令時,會通過?fork?操作創建一個子進程,這個子進程會復制父進程的內存數據,然后負責將數據寫入 RDB 文件。

fork?的特點:

  1. 內存共享機制

    • 在 Linux 系統中,fork?采用?寫時復制(Copy-On-Write)?技術,初始時子進程并不會真正復制父進程的全部內存數據,而是共享同一塊內存。
    • 只有當父進程或子進程修改數據時,才會復制被修改的部分數據,這樣可以大大節省內存和提高效率。
  2. 對 Redis 的意義

    • 主進程(父進程)可以繼續處理客戶端請求,不會被阻塞。
    • 子進程專注于將數據寫入磁盤生成 RDB 文件,完成后會自動退出。
  3. 可能的影響

    • fork?操作本身會短暫阻塞主進程(阻塞時間與內存大小相關)。
    • 如果數據集非常大,fork?可能會導致 Redis 出現短暫的響應延遲。

簡單來說,fork?讓 Redis 能夠在不中斷服務的情況下完成 RDB 持久化,是實現后臺異步操作的核心機制。

2.寫時拷貝

寫時拷貝的核心原理:

當一個進程(父進程)通過?fork?創建新進程(子進程)時,不會立即復制父進程的全部內存數據,而是讓父子進程共享同一塊內存空間。只有當其中一方(父進程或子進程)修改數據時,才會復制被修改的那部分內存頁,確保雙方的數據獨立性。

3.rdb文件

redis的工作目錄

后續redis服務器重新啟動,就會嘗試加載這個rdb文件,如果發現格式錯誤,就可能會加載數據失敗,rdb文件雖然咱們不去主動動他,但是也可能會出現一些意外問題,一旦通過一些操作(比如網絡傳輸)引起這個文件被破壞,此時redis服務器就無法啟動

redis官方提供了rdb文件檢查工具

注意:

如果redis異常退出(如服務器崩潰,kill-9),此時redis服務器來不及生成rdb,內存中尚未保存到快照中的數據,就會隨重啟而丟失

當rdb文件錯誤時,啟動redis加上rdb文件來預警

3. 其他觸發場景

  • 服務器關閉時:當執行?SHUTDOWN?命令關閉 Redis 服務器時,Redis 會自動執行一次?SAVE?命令,生成 RDB 文件后再關閉,確保數據不丟失。

  • 主從復制時:當從節點連接主節點時,主節點會自動執行一次?BGSAVE?生成 RDB 文件,并發送給從節點,用于數據同步。

工作原理

  • Redis 在指定的時間間隔內,將內存中的數據集快照寫入磁盤的二進制文件(默認文件名是?dump.rdb
  • 當 Redis 重啟時,會讀取這個文件恢復數據

配置方式(在 redis.conf 中):

# 900秒內有至少1個鍵被修改,則觸發快照
save 900 1
# 300秒內有至少10個鍵被修改,則觸發快照
save 300 10
# 60秒內有至少10000個鍵被修改,則觸發快照
save 60 10000
#關閉自動生成快照
save ""

優點

  • 生成的 RDB 文件是緊湊的二進制文件,適合用于備份和災難恢復
  • 恢復大數據集時速度比 AOF 快
  • 對 Redis 性能影響較小,因為 fork 子進程進行持久化操作

缺點

  • 可能會丟失最后一次快照之后的數據
  • 如果數據集很大,fork 過程可能會阻塞 Redis 服務器一段時間

3. AOF 持久化

AOF 持久化記錄服務器執行的所有寫操作命令,并在服務器啟動時,通過重新執行這些命令來恢復數據。

工作原理

  • 每當執行一個改變數據集的命令時,Redis 就會將該命令追加到 AOF 文件的末尾
  • 當 Redis 重啟時,會重新執行 AOF 文件中的所有命令以恢復數據

配置方式(在 redis.conf 中):

# 開啟 AOF 持久化
appendonly yes
# AOF 文件名
appendfilename "appendonly.aof"# AOF 同步策略
# appendfsync always  # 每次有寫操作就立即同步到磁盤,最慢但最安全
appendfsync everysec  # 每秒同步一次,平衡性能和安全性(默認)
# appendfsync no      # 由操作系統決定何時同步,最快但最不安全

AOF是否會影響redis性能

AOF緩沖區刷新策略

1. always(每寫命令都同步)

  • 策略描述:每當有新的寫命令追加到 AOF 文件時,Redis 就會立即調用系統的?fsync?函數,將 AOF 緩沖區中的數據強制寫入磁盤 。
  • 優點:數據安全性最高,因為一旦寫入成功,數據就已經持久化到磁盤,即使發生系統崩潰、斷電等異常情況,最多只會丟失剛剛執行但還沒來得及寫入 AOF 文件的那一個寫命令的數據。
  • 缺點:性能開銷較大,頻繁的磁盤 I/O 操作會降低 Redis 的寫入性能,因為每次寫操作都需要等待磁盤寫入完成。

2. everysec(每秒同步)

  • 策略描述:Redis 會每秒調用一次?fsync?函數,將 AOF 緩沖區中的數據寫入磁盤。
  • 優點:兼顧了數據安全性和性能。在大多數情況下,即使發生系統崩潰,最多只會丟失 1 秒內的數據 ,同時又避免了過于頻繁的磁盤 I/O 操作,對 Redis 的性能影響相對較小。
  • 缺點:在極端情況下,比如系統崩潰時剛好距離上次?fsync?超過 1 秒,可能會丟失這 1 秒內的寫命令數據。

3. no(由操作系統決定同步時機)

  • 策略描述:Redis 不主動調用?fsync?函數,而是將數據寫入 AOF 緩沖區后,由操作系統來決定何時將緩沖區的數據真正寫入磁盤。
  • 優點:對 Redis 性能影響最小,因為減少了 Redis 對磁盤 I/O 操作的干預,寫操作只是簡單地追加到緩沖區,不需要等待磁盤寫入。
  • 缺點:數據安全性最低,因為數據停留在緩沖區的時間不確定,一旦系統崩潰,緩沖區中未寫入磁盤的數據都會丟失,可能會丟失大量數據。

在實際應用中,everysec?是最常用的 AOF 刷新策略,它在數據安全性和性能之間找到了一個較好的平衡點。 可以在 Redis 的配置文件(redis.conf)中通過?appendfsync?配置項來設置 AOF 刷新策略,例如:

plaintext

appendfsync always
# 或者
appendfsync everysec
# 或者
appendfsync no

也可以在 Redis 運行時,通過?CONFIG SET appendfsync <策略值>?命令動態修改 AOF 刷新策略。

AOF重寫機制

AOF(Append Only File)重寫機制是 Redis 中用于優化 AOF 文件大小的一種重要機制。隨著 Redis 不斷執行寫命令并將其追加到 AOF 文件中,AOF 文件會越來越大,不僅占用過多磁盤空間,還會導致 Redis 在重啟時,重放 AOF 文件中的命令耗時過長,影響恢復速度 。AOF 重寫機制主要做了以下幾件事:

1. 原理

AOF 重寫是指 Redis 會讀取當前數據庫中的所有鍵值對,然后根據這些鍵值對重新構建出能夠恢復當前數據庫狀態的最小命令集合,再將這些命令寫入一個新的 AOF 文件,而不是簡單地將原 AOF 文件中的命令進行壓縮。

舉個例子,假設先后執行了三條命令:

SET key1 value1
APPEND key1 value2
APPEND key1 value3

在 AOF 文件中會依次記錄這三條命令。但通過 AOF 重寫,Redis 會直接生成?SET key1 value1value2value3?這一條命令,達到同樣的效果,卻極大減少了命令數量。

2. 觸發方式

  • 手動觸發:可以通過?BGREWRITEAOF?命令手動觸發 AOF 重寫。執行該命令后,Redis 會在后臺(fork 一個子進程)進行 AOF 重寫操作,不會阻塞主線程,保證 Redis 的正常服務。
  • 自動觸發:Redis 會根據配置文件中的相關參數自動觸發 AOF 重寫。主要涉及兩個參數:
    • auto-aof-rewrite-percentage:指定 AOF 文件大小相較于上次重寫后增長的百分比。默認值為 100,表示如果 AOF 文件大小比上次重寫后增大了一倍(100%),就可能觸發 AOF 重寫。
    • auto-aof-rewrite-min-size:指定觸發 AOF 重寫的最小 AOF 文件大小。默認值為 64MB,即只有當 AOF 文件大小大于等于 64MB,且滿足?auto-aof-rewrite-percentage?設定的增長條件時,才會觸發 AOF 重寫 。

3. 執行過程

  • fork 子進程:Redis 主進程調用?fork?函數創建一個子進程,子進程負責進行 AOF 重寫工作。在這個過程中,主進程和子進程共享內存數據,這樣可以避免復制大量數據帶來的性能開銷。
  • 子進程重寫:子進程遍歷當前數據庫中的所有鍵值對,根據鍵值對的類型和狀態生成對應的最小命令集合,并寫入到一個臨時的 AOF 重寫文件中。
  • 主進程處理新寫命令:在子進程進行 AOF 重寫期間,主進程依然可以正常處理客戶端的請求。對于新收到的寫命令,主進程一方面會將其追加到現有的 AOF 文件中,以保證數據的實時持久化;另一方面會將這些新寫命令記錄到一個內存緩沖區(AOF 重寫緩沖區)中。
  • 完成重寫并替換:當子進程完成 AOF 重寫后,會向主進程發送一個信號。主進程收到信號后,會先將 AOF 重寫緩沖區中的所有寫命令追加到新的 AOF 重寫文件中,以保證新 AOF 文件中的數據和當前數據庫狀態一致。然后,主進程會原子性地用新的 AOF 重寫文件替換掉原來的 AOF 文件,完成 AOF 重寫操作。

通過 AOF 重寫機制,Redis 可以在保證數據完整性的前提下,有效控制 AOF 文件的大小,提升數據恢復效率和磁盤空間利用率。

優點

  • 數據安全性更高,可以配置不同的同步策略
  • AOF 文件是可讀的文本文件,包含所有操作命令,便于分析和修改

缺點

  • AOF 文件通常比 RDB 文件大
  • 恢復數據的速度比 RDB 慢
  • 在高負載下可能會影響性能

4. 混合持久化(Redis 4.0+)

Redis 4.0 引入了混合持久化機制,結合了 RDB 和 AOF 的優點:

  • 快照以 RDB 格式寫入文件開頭
  • 之后的增量數據以 AOF 命令格式存儲

配置方式:

# 開啟混合持久化
aof-use-rdb-preamble yes

5.對于信號的簡單解釋

6. 如何選擇持久化方式

  • 如果需要快速恢復且可以接受少量數據丟失,選擇 RDB
  • 如果需要更高的數據安全性,選擇 AOF
  • 對于關鍵業務,推薦使用混合持久化或同時啟用 RDB 和 AOF

可以通過?CONFIG SET?命令動態修改持久化配置,也可以使用?SAVE?或?BGSAVE?命令手動觸發 RDB 快照,使用?BGREWRITEAOF?命令重寫 AOF 文件。

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

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

相關文章

Docker快速部署Mongodb主副本集實踐

系列文章目錄 第一章 Mongodb的主副本集 文章目錄系列文章目錄前言一、Mongodb基礎介紹數據庫&#xff08;Database&#xff09;集合&#xff08;Collection&#xff09;文檔&#xff08;Document&#xff09;BSON&#xff08;Binary JSON&#xff09;_id&#xff08;主鍵&…

FC平臺安裝Windows Server2016并連接V6存儲

創建 windows server2016 上傳ISO創建虛擬機安裝OS 加載光盤掛載成功之后&#xff0c;重啟虛擬機重啟之后VNC登錄即可。在FC上安裝windows&#xff0c;安裝完成后&#xff0c;必須安裝tools工具&#xff0c;不然沒有虛擬網卡&#xff0c;無法配置ip地址。Windows主機安裝toolsW…

農業XR數字融合工作站,賦能農業專業實踐學習

隨著數字技術與農業的深度融合&#xff0c;農業專業XR數字融合工作站為農業專業學生提供了沉浸式、交互式的學習體驗。農業專業XR數字融合工作站作為集PC、VR、MR技術于一體的軟硬件集成平臺&#xff0c;通過虛擬仿真、數字孿生等技術手段&#xff0c;有效解決了傳統農業教育中…

積分球的使用——簡易版

這篇寫的比較雜。積分球的功能積分球——測量燈具等光源的總光通量、光效、色溫、顯色指數等參數。使用方法1.開啟積分球系統&#xff08;探測器、光度計、光譜儀&#xff09;&#xff0c;充分預熱&#xff08;15-30分鐘&#xff09;&#xff0c;使得電子設備穩定&#xff0c;減…

[光學原理與應用-435]:晶體光學 - 晶體的結構-基元/原胞/晶胞/點陣

晶體的結構可通過基元、原胞、晶胞和點陣四個核心概念進行系統描述&#xff0c;它們共同揭示了晶體中原子排列的周期性與對稱性規律&#xff0c;具體如下&#xff1a;1. 基元&#xff08;Structure Motif&#xff09;定義&#xff1a;基元是晶體中重復排列的最小結構單元&#…

電腦音頻錄制 | 系統麥克混錄 / 系統聲卡直錄 | 方法匯總 / 常見問題

注&#xff1a;本文為 “電腦音頻錄制 ” 相關合輯。 英文引文&#xff0c;機翻未校。 未整理去重&#xff0c;如有內容異常&#xff0c;請看原文。 How to Record Computer Audio in 6 Free Ways 如何用 6 種免費方式錄制電腦音頻 Sponsored by EaseUS Nov 28, 2023 4:34 a…

2025高教社國賽數學建模競賽B題完整參考論文(含模型和代碼)

2025國賽數學建模競賽B題完整參考論文 目錄 一、 問題重述 1.1 問題背景 1.2 問題回顧與分析 二、 模型假設 三、 符號說明 四、 問題求解與分析 4.1數據預處理 4.2 問題1求解與分析 4.2.1 問題1分析 4.2.2 問題1建模與求解 4.2.3 問題1結果與分析 4.3 問題2求解與分…

OpenSSL 1.0.1e 下載解壓和運行方法(小白適用 附安裝包)?

openssl-1.0.1e.zip? 是 OpenSSL 加密工具包的一個舊版本&#xff08;發布于 2013 年左右&#xff09;的 ?源代碼壓縮包&#xff0c;文件格式是 ZIP 壓縮格式。 一、下載與解壓 ?下載文件? 假如你已經有了 openssl-1.0.1e.zip 這個壓縮包&#xff0c;就跳過這步。 如果沒有…

MapStruct詳解

提到屬性拷貝&#xff0c;首先想到的BeanUtils。 先簡單的回憶下BeanUtils&#xff0c;處理Java Bean之間的屬性拷貝&#xff1b;不過由于它是通過反射來拷貝屬性&#xff0c;在數據量大一些的時候性能會降低&#xff1b; 且在安全方面也會比較弱&#xff1b; MapStruct是編譯期…

8.FC平臺模塊梳理

文章目錄8.FC平臺模塊梳理8.1. 內存復用技術特點應用價值8.2. 虛擬機啟用策略8.3. NUMA8.4. HA高可用8.5. 故障和響應策略8.6. DRS 和 DPM8.7. IMC8.FC平臺模塊梳理 8.1. 內存復用 內存共享內存交換內存氣泡 內存共享&#xff1a;多臺虛擬機共享數據內容相同的內存頁。內存交換…

貪心算法應用:DNA自組裝問題詳解

JAVA中的貪心算法應用&#xff1a;DNA自組裝問題詳解 1. DNA自組裝問題概述 DNA自組裝(DNA Self-Assembly)是分子計算和納米技術中的一個重要問題&#xff0c;它利用DNA分子的互補配對特性&#xff0c;通過精心設計DNA序列&#xff0c;使其自發地組裝成預定的納米結構。在計算機…

數據湖如何打造統一存儲與處理方案(結構化數據、半結構化數據和非結構化數據)

目錄 1. 數據湖的“包容哲學”:為什么需要統一方案? 數據湖的核心訴求 案例:零售企業的痛點 2. 存儲層設計:給數據找個舒適的家 分區與分層存儲 選擇存儲格式 案例:Parquet的威力 云存儲的選擇 3. 元數據管理:給數據湖裝上“導航儀” 元數據管理的核心組件 主流…

AUTOSAR進階圖解==>AUTOSAR_SWS_TTCANDriver

TTCAN驅動器詳細規范 AUTOSAR TTCAN Driver Specification with Enhanced Visual Documentation目錄 1. 概述2. TTCAN控制器狀態機3. TTCAN模塊架構4. TTCAN時間觸發操作序列5. TTCAN錯誤處理流程6. 總結 1. 概述 TTCAN&#xff08;Time-Triggered CAN&#xff09;驅動器是AU…

equals 定義不一致導致list contains錯誤

錯誤代碼如下&#xff1a;for (int i0;i< rows.size();i) {Row r rows.get(i);if (r.equals(row)) {assertTrue(rows.contains(row));return;}}cassertTrue(rows.contains(row));返回了false&#xff0c;看起來很奇怪&#xff0c;此時equals 定義如下&#xff1a;public bo…

【Python基礎】 20 Rust 與 Python 循環語句完整對比筆記

一、基本循環結構對比 Rust 循環類型 // 1. loop - 無限循環 let mut count 0; loop {count 1;if count > 5 {break;} }// 2. while - 條件循環 let mut number 3; while number ! 0 {println!("{}!", number);number - 1; }// 3. for - 迭代循環 for i in 0..…

Redis 在互聯網高并發場景下的應用--個人總結

在現代互聯網系統中&#xff0c;高并發已經成為常態。無論是電商的秒殺場景、社交平臺的熱點推薦&#xff0c;還是支付接口的風控&#xff0c;系統需要同時應對成千上萬的請求。這時候&#xff0c;Redis 作為一個高性能的內存數據庫&#xff0c;憑借其極快的讀寫速度和豐富的數…

C++筆記之軟件設計原則總結

C++筆記之軟件設計原則總結 code review 文章目錄 C++筆記之軟件設計原則總結 1.軟件設計的六大原則 2.高內聚與低耦合 2.1.高內聚(High Cohesion) 2.2.低耦合(Low Coupling) 2.3.高內聚與低耦合的關系與重要性 3.DRY(Dont Repeat Yourself)原則 3.1.定義 3.2.好處 3.3.示…

ThreadLocal 深度解析:原理、應用場景與最佳實踐

一、ThreadLocal 核心概念與設計哲學?1.1 ThreadLocal 的基本概念?ThreadLocal 是 Java 中提供線程局部變量的類&#xff0c;它允許每個線程創建自己的變量副本&#xff0c;從而實現線程封閉&#xff08;Thread Confinement&#xff09;。簡單來說&#xff0c;ThreadLocal 為…

AMD顯卡運行GPT-OSS全攻略

AMD顯卡運行GPT-OSS全攻略 本文介紹如何在Windows系統上使用AMD顯卡&#xff08;以RX 7900XTX為例&#xff09;運行開源GPT-OSS模型。 前置要求 硬件&#xff1a;AMD顯卡&#xff08;如RX 7900XTX&#xff0c;具體支持型號參考ROCm文檔&#xff09;。軟件&#xff1a; Ollam…

【Sharding-JDBC】?Spring/Spring Boot 集成 Sharding-JDBC,分表策略與 API、YAML 配置實踐?

文章目錄環境準備Spring框架Sharding-JDBC 4.x版本api實現Sharding-JDBC 5.4.x版本yaml實現Springboot框架Sharding-JDBC 5.4.x版本yaml實現分庫、加密、讀寫分離基于yaml的配置示例更多相關內容可查看需求&#xff1a;按月分區&#xff0c;按年分表&#xff0c;找不到對應年份…