Redis持久化存儲

Redis持久化存儲詳解

一、核心持久化機制

Redis提供兩種主要持久化方式:RDB(快照)AOF(追加文件),以及兩者的混合模式。

RDB(Redis Database)快照持久化

工作原理

RDB通過創建數據集的二進制快照進行持久化,默認保存在dump.rdb文件中。

成功
失敗
客戶端請求
Redis主進程
fork子進程
子進程寫入新RDB文件
主進程繼續處理請求
替換舊RDB文件
配置示例(redis.conf)
# 保存策略(每15分鐘至少1次修改)
save 900 1# 每5分鐘至少10次修改
save 300 10# 每1分鐘至少10000次修改
save 60 10000# RDB文件名
dbfilename dump.rdb# 工作目錄
dir /var/lib/redis# 壓縮RDB文件
rdbcompression yes# 啟用CRC64校驗
rdbchecksum yes
手動觸發命令
# 阻塞式保存(生產環境避免使用)
127.0.0.1:6379> SAVE
OK# 后臺異步保存(推薦)
127.0.0.1:6379> BGSAVE
Background saving started
RDB文件結構
+---------+---------+---------+-----+---------+
| REDIS   | RDB版本 | 數據庫  | ... | EOF     |
| 魔數(5字節) | (4字節) | 內容     |     | (1字節) |
+---------+---------+---------+-----+---------+

AOF(Append Only File)日志持久化

工作原理

AOF記錄所有寫操作命令,以Redis協議格式保存到文件。

always
everysec
no
客戶端寫命令
命令執行
寫入AOF緩沖區
同步策略
立即同步到磁盤
每秒同步
OS決定同步
配置示例
# 啟用AOF
appendonly yes# AOF文件名
appendfilename "appendonly.aof"# 同步策略(推薦每秒)
appendfsync everysec# 重寫時是否同步
no-appendfsync-on-rewrite no# 觸發重寫的增長百分比
auto-aof-rewrite-percentage 100# 觸發重寫的最小大小
auto-aof-rewrite-min-size 64mb
AOF重寫過程
def bgrewriteaof():# 1. 創建子進程child_pid = fork()if child_pid == 0:  # 子進程# 2. 創建臨時AOF文件temp_file = create_temp_aof()# 3. 遍歷數據庫,寫入當前狀態for db in databases:for key in db:write_command(temp_file, "SET", key, db[key])# 4. 將重寫期間的新命令追加到文件append_rewrite_buffer(temp_file)# 5. 原子替換舊AOF文件rename(temp_file, "appendonly.aof")exit(0)else:  # 主進程# 記錄重寫開始時間start_time = time.now()# 繼續處理客戶端請求while True:# 處理請求...# 將新命令寫入AOF緩沖區和重寫緩沖區write_to_buffers(new_command)
AOF文件修復
# 修復損壞的AOF文件
$ redis-check-aof --fix appendonly.aof# 修復前的備份
0x0000: *2 $6 SELECT $1 0
0x0013: *3 $3 set $4 name $5 Alice
0x002b: *3 $3 set $4 age $2 30  # 損壞行# 修復后
0x0000: *2 $6 SELECT $1 0
0x0013: *3 $3 set $4 name $5 Alice
# 損壞行被移除

混合持久化(Redis 4.0+)

配置
aof-use-rdb-preamble yes
文件結構
+---------+---------+---------+-----+---------+
| RDB     | AOF     | AOF     | ... | AOF     |
| 數據快照 | 追加命令1 | 追加命令2 |     | 追加命令N |
+---------+---------+---------+-----+---------+

二、持久化操作與監控

命令行操作

# 查看持久化狀態
127.0.0.1:6379> INFO PERSISTENCE
# Output:
# aof_enabled:1
# aof_rewrite_in_progress:0
# rdb_last_bgsave_status:ok# 手動觸發AOF重寫
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started# 獲取當前配置
127.0.0.1:6379> CONFIG GET *append*
1) "appendonly"
2) "yes"
3) "appendfsync"
4) "everysec"

持久化監控腳本

import redis
import timedef monitor_persistence(r):while True:info = r.info('persistence')# 檢查RDB狀態rdb_status = "OK" if info['rdb_last_bgsave_status'] == 'ok' else "ERROR"print(f"RDB Status: {rdb_status}, Last save: {info['rdb_last_save_time']}")# 檢查AOF狀態aof_status = "OK" if info['aof_last_bgrewrite_status'] == 'ok' else "ERROR"print(f"AOF Status: {aof_status}, Size: {info['aof_current_size']/1024/1024:.2f}MB")# 檢查重寫狀態if info['aof_rewrite_in_progress']:print(f"AOF rewrite in progress: {info['aof_rewrite_buffer_length']} commands buffered")time.sleep(60)if __name__ == "__main__":r = redis.Redis(host='localhost', port=6379)monitor_persistence(r)

三、數據恢復流程

恢復優先級

啟動Redis
是否存在AOF文件?
加載AOF文件
是否存在RDB文件?
加載RDB文件
啟動空實例

恢復操作步驟

# 1. 停止Redis服務
$ redis-cli shutdown# 2. 備份當前數據文件
$ cp /var/lib/redis/dump.rdb /backup/dump-$(date +%F).rdb
$ cp /var/lib/redis/appendonly.aof /backup/appendonly-$(date +%F).aof# 3. 恢復RDB文件
$ mv /backup/dump-restore.rdb /var/lib/redis/dump.rdb# 4. 恢復AOF文件(可選)
$ mv /backup/appendonly-restore.aof /var/lib/redis/appendonly.aof# 5. 修改文件權限
$ chown redis:redis /var/lib/redis/*# 6. 啟動Redis
$ systemctl start redis-server# 7. 驗證數據
$ redis-cli DBSIZE
(integer) 123456  # 預期的鍵數量

四、性能優化與故障處理

性能優化策略

  1. RDB優化

    # 禁用不必要的保存規則
    save ""# 使用現代Linux系統(優化fork性能)
    # 配置大頁內存
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    
  2. AOF優化

    # 使用everysec策略(默認)
    appendfsync everysec# 增加重寫緩沖區大小
    aof-rewrite-buffer-size 128mb# 使用SSD存儲
    dir /ssd/redis-data
    

常見故障處理

1. OOM(內存不足)錯誤

場景:執行BGSAVE時因fork失敗導致

Can't save in background: fork: Cannot allocate memory

解決方案

# 檢查系統配置
$ sysctl vm.overcommit_memory
vm.overcommit_memory = 1  # 應設置為1# 增加交換空間
$ sudo fallocate -l 4G /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile# 減少Redis最大內存
127.0.0.1:6379> CONFIG SET maxmemory 8gb
2. AOF文件損壞

癥狀:Redis啟動失敗,日志報"AOF is not valid"

修復步驟

# 1. 創建備份
$ cp appendonly.aof appendonly.bak# 2. 修復文件
$ redis-check-aof --fix appendonly.aof# 3. 驗證修復后文件
$ head -n 20 appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
SET
...
3. RDB生成緩慢

優化方案

# 降低保存頻率
save 3600 1    # 1小時內至少1次修改
save 86400 10  # 1天內至少10次修改# 禁用壓縮(CPU緊張時)
rdbcompression no# 使用外部工具并行壓縮
rdbcompression no

五、生產環境最佳實踐

部署架構

同步
同步
持久化
持久化
持久化
主節點
從節點1
從節點2
本地SSD
網絡存儲
對象存儲
監控系統

配置推薦

# 混合持久化配置
appendonly yes
aof-use-rdb-preamble yes
appendfsync everysec# RDB配置
save 3600 1     # 每小時保存
save 86400 10   # 每天保存
rdbcompression yes# 內存管理
maxmemory 16gb
maxmemory-policy volatile-lru# 安全配置
requirepass "StrongPassword123!"
rename-command FLUSHDB ""

備份策略

# 每日全量備份
0 2 * * * redis-cli BGSAVE && cp /var/lib/redis/dump.rdb /backup/dump-$(date +\%F).rdb# 每小時AOF備份
0 * * * * cp /var/lib/redis/appendonly.aof /backup/aof/appendonly-$(date +\%H).aof# 異地備份
0 3 * * * aws s3 cp /backup/dump-$(date +\%F).rdb s3://redis-backup/

災難恢復測試

import redis
import subprocessdef disaster_recovery_test():# 1. 創建測試數據r = redis.Redis(password='StrongPassword123!')for i in range(10000):r.set(f'key:{i}', f'value-{i}')# 2. 模擬故障r.shutdown()# 3. 恢復最新備份subprocess.run(['cp', '/backup/latest.rdb', '/var/lib/redis/dump.rdb'])subprocess.run(['systemctl', 'start', 'redis-server'])# 4. 驗證數據recovered = redis.Redis(password='StrongPassword123!')assert recovered.dbsize() == 10000print("Disaster recovery test passed!")if __name__ == "__main__":disaster_recovery_test()

六、總結與選擇指南

持久化方案選擇矩陣

需求推薦方案配置要點
最大化性能RDBsave "", rdbcompression no
最小化數據丟失AOF(always) + 混合持久化appendfsync always, aof-use-rdb-preamble yes
快速重啟恢復混合持久化aof-use-rdb-preamble yes, rdbcompression yes
有限磁盤空間RDB調整save間隔,增加壓縮比
大數據集(>10GB)RDB + 副本增加repl-backlog-size, 優化fork性能

關鍵決策因素

  1. 數據重要性:金融數據使用AOF(always),緩存數據使用RDB
  2. 恢復時間目標(RTO):RDB恢復更快,適合大型數據集
  3. 恢復點目標(RPO):AOF提供秒級數據保護
  4. 系統資源:內存充足時使用混合模式,CPU受限時使用RDB
  5. 運維復雜性:AOF需要更多監控和管理

通過合理配置RDB和AOF,結合混合持久化模式,Redis可以在各種場景下實現性能與數據安全的最佳平衡。

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

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

相關文章

python學智能算法(三十四)|SVM-KKT條件回顧

【1】引言 前序學習進程中,對軟邊界拉格朗日方程進行了初步構建。 其中約定了兩個拉格朗日乘子要非負,其本質是要滿足KKT條件。 今天就乘此次機會,在回顧一下KKT條件。 【2】定義 當問題無約束的時候,只要讓函數梯度為零&#…

【網絡基礎】計算機網絡發展背景及傳輸數據過程介紹

本文旨在幫助初學者建立起計算機網絡的基礎認知,從網絡的發展背景到網絡協議的分層模型,再到IP與MAC地址的基本概念,全面覆蓋第一階段學習重點。 📌 本節重點 了解計算機網絡的發展背景,掌握局域網(LAN&am…

阿里云-通義靈碼:解鎖云原生智能開發新能力,讓云開發更“靈”~

免責聲明:此篇文章所有內容皆是本人實驗,并非廣告推廣,并非抄襲,如有侵權,請聯系筆者。 每日一句 信念其實就是相信未來, 相信內在, 以及坦然美好的心境。 目錄 每日一句 一. 引言 二.通義…

lesson33:Python協程詳解:從原理到實戰的異步編程指南

目錄 一、協程核心概念:輕量級并發的本質 1.1 什么是協程? 1.2 協程與線程/進程的對比 二、協程工作原理:事件循環與協作式調度 2.1 事件循環(Event Loop):協程的"調度中心" 2.2 協作式調度…

深入理解C++模板進階:非類型參數、特化與分離編譯

前言C模板是泛型編程的核心,它允許我們編寫與類型無關的代碼。在掌握了模板的基礎知識后,我們需要進一步了解模板的高級特性,以便更靈活地使用它們。本文將深入探討三個重要的模板進階主題:非類型模板參數、模板特化以及模板的分離…

使用winsw把SpringBoot項目注冊成window服務

目錄 一、使用winsw注冊 1.1、項目打jar包 1.2、下載winsw 1.3、把 WinSW.NET4.exe 重新命名 1.4、編寫m配置文件用于配置注冊信息 1.5、創建文件夾存放你的文件 1.6、安裝服務 1.7、啟動服務 1.8、卸載服務 1.8、停止服務 一、使用winsw注冊 1.1、項目打jar包 例如項目jar包名…

進階向:Python開發簡易QQ聊天機器人

數字化時代的聊天機器人應用在當今數字化時代,聊天機器人已經成為日常生活和商業活動中不可或缺的一部分。根據市場研究數據顯示,全球聊天機器人市場規模預計將在2026年達到102億美元,年復合增長率達到34.75%。這些智能助手正廣泛應用于以下場…

基于開源鏈動2+1模式AI智能名片S2B2C商城小程序的用戶留存策略研究

摘要:在數字化商業競爭白熱化的當下,用戶留存成為企業可持續發展的核心命題。本文聚焦開源鏈動21模式AI智能名片S2B2C商城小程序這一創新技術組合,通過分析其技術架構、模式創新與生態閉環的協同效應,揭示其在降低用戶決策成本、提…

單詞的劃分(動態規劃)

題目描述有一個很長的由小寫字母組成字符串。為了便于對這個字符串進行分析,需要將它劃分成若干個部分,每個部分稱為一個單詞。出于減少分析量的目的,我們希望劃分出的單詞數越少越好。你就是來完成這一劃分工作的。輸入第一行,一…

C語言學習筆記——文件

目錄1 文件的概念2 程序文件和數據文件3 二進制文件和文本文件4 流4.1 流的概念4.2 標準流5 文件信息區和文件指針6 處理文件的庫函數6.1 fopen6.2 fclose6.3 fgetc6.4 fputc6.5 fgets6.6 fputs6.7 fscanf6.8 fprintf6.9 fread6.10 fwrite6.11 fseek6.12 ftell6.13 rewind6.14 …

C++語法與面向對象特性(2)

一.inline函數1.inline的基本特性被inline修飾的函數被稱為內聯函數。inline函數設計的初衷是為了優化宏的功能,編譯器會在編譯階段對inline函數進行展開。然而需要注意的是,inline對于編譯器而言是一種建議,它通常會展開一些簡短的&#xff…

Linux中grep命令

Linux 中的 grep 用法詳解grep 是 Linux 中強大的文本搜索工具,用于在文件或輸入流中查找匹配指定模式的行。其基本語法為:grep [選項] "模式" [文件]核心功能基礎搜索在文件中查找包含特定字符串的行:grep "error" log.…

【遙感圖像入門】遙感中的“景”是什么意思?

在遙感成像中,“3景城市影像”和“5景城市影像”中的“景”是遙感數據的基本單位,通常指一次成像過程中獲取的獨立遙感影像塊。這一概念的具體含義需結合技術背景和應用場景理解: 一、“景”的技術定義 單次成像的獨立覆蓋區域 遙感平臺(如衛星、飛機)在特定時間和位置對…

Pytorch-07 如何快速把已經有的視覺模型權重扒拉過來為己所用

下載,保存,加載,使用模型權重 在這一節里面我們會過一遍對模型權重的常用操作,比如: 如何下載常用模型的預訓練權重如何下載常用模型的無訓練權重(只下載網絡結構)如何加載模型權重如何保存權…

C語言零基礎第9講:指針基礎

目錄 1.內存和地址 2.指針變量和地址 2.1 取地址操作符(&) 2.2 指針變量 2.3 解引用操作符(*) 2.4 指針變量的大小 3.指針變量類型的意義 3.1 指針的解引用 3.2 指針 - 整數 3.3 void*指針 4.指針運算 4.1 指針…

013 HTTP篇

3.1 HTTP常見面試題 1、HTTP基本概念: 超文本傳輸協議:在計算機世界里專門在「兩點」之間「傳輸」文字、圖片、音頻、視頻等「超文本」數據的「約定和規范」HTTP常見的狀態碼 [[Pasted image 20250705140705.png]]HTTP常見字段 Host 字段:客戶…

每日面試題20:spring和spring boot的區別

我曾經寫過一道面試題,題目是為什么springboot項目可以直接打包給別人運行?其實這涉及到的就是springboot的特點。今天來簡單了解一下springboot和spring的區別, Spring 與 Spring Boot:從“全能框架”到“開箱即用”的進化之路 …

ClickHouse數據遷移

ClickHouse實例是阿里云上的云實例,想同步數據到本地,本地部署有ClickHouse實例,下面為單庫單表 源實例:阿里云cc-gs5xxxxxxx.public.clickhouse.ads.aliyuncs.com:8123 目標實例:本地172.16.22.10:8123 1、目標實例建…

sqli-labs-master/Less-41~Less-50

Less-41這一關還是用堆疊注入,這關數字型不需要閉合了。用堆疊的話,我們就不爆信息了。我們直接用堆疊,往進去寫一條數據?id-1 union select 1,2,3;insert into users (id,username,password) values(666,zk,180)--看一下插進去了沒?id-1 u…

Tiger任務管理系統-10

十是個很好美好的數字,十全十美,確實沒讓人失望,收獲還是很大的。 溫習了前端知識,鞏固了jQuery,thymeleaf等被忽視的框架,意外將之前的所學所用的知識都連起來了,感覺有點像打通了任督二脈一樣…