Redis 持久化機制淺析

1. 持久化機制的作用

Redis 是基于內存的數據結構數據庫,雖然讀寫性能非常高,但所有數據默認保存在內存中。一旦服務器宕機、進程意外崩潰或容器重啟,內存中的數據將全部丟失。這對于生產環境的可用性與可靠性是極其危險的。因此,Redis 提供了持久化機制,將內存數據定期或實時寫入磁盤,以便在服務重啟時能夠從磁盤數據中恢復,防止宕機導致的數據全部丟失。

2. 三種持久化機制

Redis 提供了三種持久化方式:

  1. RDB(Redis DataBase)快照持久化
  2. AOF(Append Only File)日志持久化
  3. 混合持久化(RDB + AOF,Redis 4.0+ 引入)

在生產環境中使用時,這些策略都可能會失敗。

2.1 RDB 快照持久化

1 基本原理

RDB 是一種 周期性快照機制,Redis 會在滿足特定條件時,將當前內存中的所有數據以快照方式保存為一個二進制文件(默認為 dump.rdb

RDB 采用了 COW(Copy-On-Write)機制,由 Redis 主進程通過 fork() 創建子進程,子進程將內存快照寫入磁盤,而主進程則繼續處理客戶端請求,保證高并發。

子進程剛創建時共享父進程內存,但當父進程修改某塊內存數據時,會將該頁面復制一份,以避免子進程快照不一致,這一機制稱為 “頁面分離”。

2 觸發方式
  • 自動觸發:通過配置 redis.conf 文件中的 save 參數,如:
 //默認如下配置:
save 900 1:每隔900s(15min),如果有超過1個key發生了變化,就寫一份新的RDB文件
save 300 10:每隔300s(5min),如果有超過10個key發生了變化,就寫一份新的RDB文件
save 60 10000:每隔60s(1min),如果有超過10000個key發生了變化,就寫一份新的RDB文件
//(配置多種策略可以同時生效,無論滿足哪一種條件都會寫一份新的RDB文件)
  • 手動觸發
    • save:阻塞主進程,生成 RDB 文件。
    • bgsave:異步觸發,fork 子進程處理持久化。
3 優缺點

優點:對主進程性能影響小,快照文件便于備份與遠程傳輸。恢復速度快,適合冷啟動。數據文件緊湊,占用空間小。

缺點:數據可能丟失幾分鐘。 fork 子進程時內存翻倍,數據量大時存在性能抖動風險。使用特定二進制格式存儲,版本兼容性差。

4 RDB可能的故障場景

??場景1:數據丟失??。默認配置下,如果Redis在快照之間崩潰,可能丟失最多15分鐘數據。

??場景2:Fork失敗??。當內存不足時,fork操作可能失敗。

# Redis log
[1111]  4 Aug # Can't save in background: fork: Cannot allocate memory

??場景3:磁盤空間耗盡??。RDB文件先寫入臨時位置,再原子性的重命名。如果寫入期間磁盤空間不足,快照會失敗,Redis仍然繼續運行。

# Redis log
[1111]  4 Aug # Write error saving DB on disk: No space left on device

??場景4:斷電后RDB文件損壞??。斷電時RDB文件只寫入部分內容。重啟時Redis拒絕啟動損壞的RDB文件。

# Redis startup log
[1111]  4 Aug # Short read or OOM loading DB. Unrecoverable error, aborting now.

2.2 AOF 日志持久化

1 基本原理

AOF 通過將所有修改命令(如 SETDEL按順序追加到日志文件(默認為 appendonly.aof)中來實現持久化。Redis 在收到命令后,先記錄日志,再執行命令。寫入流程如下:

  • 指令被追加至 OS 緩沖區;
  • 根據 appendfsync 策略定期 fsync 到磁盤。
2 配置方式

通過 appendfsync 參數配置:

appendfsync everysec   # 每秒刷一次
appendfsync always     # 每寫入一條命令都 fsync,最安全但最慢
appendfsync no         # 不主動 fsync,完全交由 OS 決定
3 重寫(Rewrite)

隨著操作積累,AOF 文件會越來越大,影響重啟速度。因此 Redis 提供了AOF Rewrite

  • fork 子進程;
  • 將當前內存快照轉化為最小指令集;
  • 合并重寫后的小文件;
  • 替換原有 AOF 文件。
// 自動觸發規
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
4 優缺點

優點:更高的數據安全性,最多丟失 1 秒數據。日志可讀,可手動恢復誤刪數據。重寫機制可控制文件大小。
缺點:恢復速度比 RDB 慢。寫入性能略低于 RDB。文件體積通常比 RDB 大。

5 AOF可能的失敗場景

??場景1:系統崩潰后AOF損壞??

# Redis startup log
[1111]  4 Aug # Bad file format reading the append only file: 
make a backup of your AOF file, then use ./redis-check-aof --fix <filename>

??場景2:AOF重寫失敗??。隨著AOF文件增長,Redis會定期重寫以保持精簡。但這個重寫過程可能出錯。

# Redis log during rewrite failure
[1111]  4 Aug # Error rewriting AOF: No space left on device
[1111]  4 Aug # AOF rewrite failed: 
Previous AOF was kept, but disk is full, cannot proceed with rewrite.

這個錯誤的大意是重寫AOF錯誤,因為設備剩余存儲空間不足。雖然重寫失敗,但Redis繼續向舊AOF文件追加。磁盤完全填滿后,Redis開始拒絕寫入。

??場景3:重寫期間內存爆炸??。AOF重寫期間,Redis在內存中緩沖所有新寫入。如果重寫耗時過長(慢磁盤常見),可能在"安全"的重寫操作期間因OOM而崩潰。

??場景4:"appendfsync always"導致腦裂??。假設對Redis中的重要數據使用appendfsync always策略。如果這個Redis實例因為網絡問題等性能變差,會被負載均衡器將其標記為不健康,把流量轉向備份實例。網絡恢復后,會得到兩個包含不同數據的Redis實例。

2.3 混合持久化(RDB + AOF)

Redis 4.0 引入混合持久化模式:在重寫 AOF 文件時,先寫入 RDB 快照,再追加從快照開始到當前的 AOF 增量日志,融合了二者優點。
配置參數:

aof-use-rdb-preamble yes

注意:混合持久化的 AOF 文件前段為 RDB 格式,老版本 Redis 不兼容。

優點:

  • 恢復效率高,RDB 快照 + 小量 AOF 日志。
  • 兼具 AOF 的數據完整性與 RDB 的恢復速度。

缺點:

  • 文件結構復雜,可讀性差。
  • 4.0 以下版本不支持。

3. 持久化監控信息

Redis的INFO命令能顯示持久化狀態,但信息并不完整。

# INFO顯示內容
rdb_last_save_time:1678889001
rdb_last_bgsave_status:ok
aof_enabled:1
aof_last_rewrite_time_sec:45# 未顯示內容
# - Fork失敗率
# - 磁盤空間趨勢
# - 損壞檢測
# - 性能影響

以下是一個設置額外的監控數據的示例。

#!/bin/bash
# 檢查RDB保存失敗
redis-cli LASTSAVE | awk '{last_save = $1;now = systime();diff = now - last_save;if (diff > 3600) {  # 1小時未保存則告警print "警告:RDB已" diff "秒未保存";}
}'# 檢查AOF健康狀態
redis-cli INFO persistence | grep aof_last_write_status | grep -v ok && echo "AOF寫入失敗"# 監控持久化磁盤空間
df -h /var/lib/redis | awk 'NR==2 {if (int($5) > 80) {print "警告:Redis磁盤使用" $5 "已滿";}
}'

4. 恢復策略

1. AOF損壞恢復參考示例

# 步驟1:備份損壞文件
cp appendonly.aof appendonly.aof.corrupted# 步驟2:嘗試自動修復
redis-check-aof --fix appendonly.aof# 步驟3:檢查丟失內容
redis-check-aof appendonly.aof.corrupted > corruption_report.txt# 步驟4:自動修復失敗時人工干預
# 編輯AOF文件,移除末尾不完整命令
tail -20 appendonly.aof.corrupted  # 查找不完整命令
head -n -5 appendonly.aof.corrupted > appendonly.aof  # 移除最后5行

2 RDB損壞恢復參考示例

# 步驟1:檢查RDB是否可修復
redis-check-rdb dump.rdb# 步驟2:不可修復則從備份恢復
aws s3 cp s3://backup-bucket/redis/dump.rdb.gz .
gunzip dump.rdb.gz# 步驟3:無備份則重建并重載應用數據

5. 完整配置參考

1 Redis配置

# redis.conf - 生產環境配置# RDB配置
# 更頻繁保存,多條件觸發
save 900 1      # 15分鐘內任何變更
save 300 10     # 5分鐘內10+變更
save 60 100     # 1分鐘內100+變更# RDB失敗時停止接受寫入
stop-writes-on-bgsave-error yes# 壓縮RDB文件
rdbcompression yes# AOF配置  
appendonly yes
appendfilename "appendonly.aof"# 每秒同步(良好的持久性/性能平衡)
appendfsync everysec# 啟用AOF重寫控制文件大小
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb# AOF損壞但可讀時不丟失數據
aof-load-truncated yes# 使用RDB-AOF混合加速重啟
aof-use-rdb-preamble yes# 內存管理
maxmemory 6gb  # 為fork期間的COW預留空間
maxmemory-policy allkeys-lru# 禁用內存過量使用
vm-enabled no

2 自動備份配置

#!/bin/bash
# redis-backup.sh - 每小時執行DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/redis"
S3_BUCKET="company-redis-backups"# 創建備份目錄
mkdir -p $BACKUP_DIR/$DATE# 觸發RDB保存
redis-cli BGSAVE
sleep 30  # 等待保存完成# 復制文件
cp /var/lib/redis/dump.rdb $BACKUP_DIR/$DATE/
cp /var/lib/redis/appendonly.aof $BACKUP_DIR/$DATE/# 壓縮上傳
tar -czf $BACKUP_DIR/$DATE.tar.gz $BACKUP_DIR/$DATE/
aws s3 cp $BACKUP_DIR/$DATE.tar.gz s3://$S3_BUCKET/# 清理舊備份(本地保留48小時,S3保留30天)
find $BACKUP_DIR -name "*.tar.gz" -mtime +2 -delete
aws s3 ls s3://$S3_BUCKET/ | awk '$1 < "'$(date -d '30 days ago' '+%Y-%m-%d')'" {print $4}' | xargs -I {} aws s3 rm s3://$S3_BUCKET/{}

6. 常用持久化相關命令

命令說明
save阻塞生成 RDB 快照
bgsave后臺生成 RDB 快照
bgrewriteaof重寫 AOF 文件
info Persistence查看持久化信息
redis-check-aof檢查 / 修復 AOF 文件
redis-check-rdb檢查 RDB 文件
shutdown安全關閉,自動保存 RDB
kill -9強制關閉,可能導致數據丟失

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

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

相關文章

使用MatterJs物理2D引擎實現重力和鼠標交互等功能,有點擊事件(盒子堆疊效果)

使用MatterJs物理2D引擎實現重力和鼠標交互等功能&#xff0c;有點擊事件&#xff08;盒子堆疊效果&#xff09; 效果圖&#xff1a;直接上代碼&#xff0c;我是用的是html&#xff0c;使用了MatterJs的cdn&#xff0c;直接復制到html文件中然后在瀏覽器打開即可 <!DOCTYPE …

如何玩轉 Kubernetes K8S

在容器化時代&#xff0c;雖然Docker已經很強大了&#xff0c;但是在實際使用上還是有諸多不便&#xff0c;比如集群管理、資源調度、文件管理等等。 不過目前也涌現了很多解決方案&#xff0c;比如 Mesos、Swarm、Kubernetes 等等&#xff0c;其中谷歌開源的 Kubernetes就是其…

論文閱讀筆記:Dataset Condensation with Gradient Matching

論文閱讀筆記&#xff1a;Dataset Condensation with Gradient Matching1. 解決了什么問題&#xff1f;(Motivation)2. 關鍵方法與創新點 (Key Method & Innovation)2.1 核心思路的演進&#xff1a;從參數匹配到梯度匹配2.2 算法實現細節 (Implementation Details)3. 實驗結…

網安學習no.22

一、基礎系統信息命令&#xff08;簡單入門&#xff09;uname作用&#xff1a;查看系統內核信息示例&#xff1a;uname -a&#xff08;顯示完整內核版本、主機名、硬件架構等&#xff09;hostname作用&#xff1a;查看或設置主機名示例&#xff1a;hostname&#xff08;顯示當前…

AJAX的引入

是的&#xff0c;AJAX 的一個主要特點就是通過 局部刷新 來實現與服務器的交互&#xff0c;而不需要重新加載整個頁面。通過 AJAX&#xff0c;JavaScript 可以發送異步的 HTTP 請求&#xff0c;接收到響應數據后&#xff0c;更新頁面的某個部分&#xff08;DOM&#xff09;。這…

SpringBoot 整合 Langchain4j AIService 深度使用詳解

目錄 一、前言 二、AIService 介紹 2.1 AiService 是什么 2.2 AiService 主要功能 2.3 AiService 使用步驟 三、AIService 操作實踐 3.1 前置準備 3.1.1 獲取apikey 3.1.2 導入核心依賴 3.1.3 添加配置文件 3.1.4 前置導入案例 3.2 AIService 案例操作詳解 3.2.1 入…

基于FFmpeg和HLS的大文件分片傳輸方案

1&#xff1a;功能介紹 在視頻這類大文件的傳輸過程中&#xff0c;經常會因為文件太大而受到網絡帶寬的限制。比如在實現視頻預覽功能時&#xff0c;常常會出現長時間加載、緩存卡頓的問題。我在項目中也遇到了類似的情況&#xff0c;于是采用了這個解決方案。 我們可以利用 FF…

體育場預定-下單-扣減庫存一致性

流程1:通過庫存服務緩存(緩存里面不僅有位圖存儲該時間點id的位置信息還有庫存信息)的Redis獲取令牌2:拿著令牌向訂單服務同步下單如果有令牌就執行下面的Redis&#xff0c;如果沒有就直接返回扣減Redis庫存緩存扣減成功:繼續扣減失敗:返回前端重試整套流程3:1鎖2查3更新生成訂…

【計算機網絡】王道考研筆記整理(3)數據鏈路層

目錄 第三章 數據鏈路層 3.1 數據鏈路層的功能 3.2 組幀 3.2.1 字符計數法 3.2.2 字節填充法 3.2.3 零比特填充法 3.2.4 違規編碼法 3.3 差錯控制 3.3.1 奇偶校驗碼 3.3.2 CRC 校驗碼 3.3.3 海明校驗碼 3.4 可靠傳輸與流量控制 3.4.1 滑動窗口機制 3.4.2 停止 - 等待…

【后端】java 抽象類和接口的介紹和區別

文章目錄一、抽象類&#xff08;Abstract Class&#xff09;二、接口&#xff08;Interface&#xff09;三、核心區別總結四、使用場景對比五、從設計思想理解最佳實踐在Java中&#xff0c;抽象類&#xff08;Abstract Class&#xff09;和接口&#xff08;Interface&#xff0…

Apache OFBiz Scrum 組件命令注入漏洞

【嚴重】Apache OFBiz Scrum 組件命令注入漏洞 漏洞描述 Apache OFBiz 是一款知名的開源企業資源規劃(ERP)解決方案&#xff0c;它提供了一整套開箱即用的企業級應用。Scrum 是 OFBiz 的一個插件&#xff0c;旨在為敏捷開發團隊提供項目管理功能&#xff0c;其中包括與 SVN 版…

FastAPI入門:多個文件、后臺任務、元數據和文檔 URL

更大的應用 - 多個文件 假設文件結構如下&#xff1a;. ├── app # 「app」是一個 Python 包 │ ├── __init__.py # 這個文件使「app」成為一個 Python 包 │ ├── main.py # 「main」模塊&#xff0c;例如 import app.main │ ├…

一個示例mcp agent功能的交互式框架

https://github.com/whym3/Deepseek_MCPDeepseek_MCP https://github.com/whym3/Deepseek_MCP Deepseek_MCP是一個演示mcp agent的框架&#xff0c;基于Flask開發&#xff0c;支持在瀏覽器采用交互方式與deepseek及agent對話。需要注冊外部Deepseek api&#xff0c;不支持本地…

nodejs 基礎知識-2

模塊的暴露和導入 編寫date.js module.exports.echo 導出的名稱 module.exports.echo function echo(){ return Date.now(); } 編寫 index.js const echoDate require(‘./date.js’) 在index引入 console.log(echoDate.echo()); //調用 開發一個自定義模塊 exports.forma…

遞歸推理樹(RR-Tree)系統:構建認知推理的骨架結構

探索基于三維評估的動態推理系統如何實現智能決策與知識演化引言 在復雜問題求解領域&#xff08;如戰略決策或科學探索&#xff09;&#xff0c;人類思維的遞歸本質為AI系統設計提供了重要啟發。我設計并實現的遞歸推理樹&#xff08;Recursive Reasoning Tree, RR-Tree&#…

《動手學深度學習》讀書筆記—9.5機器翻譯與數據集

本文記錄了自己在閱讀《動手學深度學習》時的一些思考&#xff0c;僅用來作為作者本人的學習筆記&#xff0c;不存在商業用途。 語言模型是自然語言處理的關鍵&#xff0c; 而機器翻譯是語言模型最成功的基準測試。 因為機器翻譯正是將輸入序列轉換成輸出序列的 序列轉換模型&a…

Mysql進行操作時鎖的具體行為

場景一&#xff1a;單個事務更新一條存在的數據 假設有表 user (id PK, name, age)&#xff0c;數據&#xff1a;[id1, nameAlice, age25] 你的 SQL&#xff1a; UPDATE user SET age 26 WHERE id 1; 底層動作&#xff1a; 事務 A (主動方) 發起更新請求。Lock Manager 介入&…

人工智能領域、圖歐科技、IMYAI智能助手2025年7月更新月報

IMYAI 平臺 2025 年 7 月重要功能更新與優化匯總 2025年07月31日更新 細節優化&#xff1a; 修復了移動端提交后自動彈出側邊欄的BUG。優化對話高級配置界面&#xff0c;增加滾動條并固定高度&#xff0c;避免內容超出屏幕。音樂生成界面的人聲選擇新增“合唱”選項&#xff…

HTTP 與 HTTPS 的區別深度解析:從原理到實踐

HTTP 和 HTTPS 是現代 Web 開發中不可或缺的協議&#xff0c;它們決定了瀏覽器與服務器之間數據傳輸的方式。HTTPS 作為 HTTP 的安全版本&#xff0c;在安全性、性能和用戶體驗上都有顯著提升。本文將通過萬字篇幅&#xff0c;結合圖表和代碼示例&#xff0c;詳細剖析 HTTP 與 …

STM32F407VET6學習筆記11:smallmodbus_(多從機)創建新的slave從機

今日記錄一些smallmodbus 創建新的slave 從機 的過程&#xff0c;以及使用的關鍵點. 目錄 創建新的從機對應操作函數與buffer 創建新的從機線程與操作代碼&#xff1a; slave使用的要點&#xff1a; 完整的slave代碼&#xff1a; 能正常通信&#xff1a; 創建新的從機對應操作函…