Redis 保證數據不丟失(或最大限度減少丟失)的核心是通過 持久化機制 結合 合理的配置策略 實現的。具體方案如下:
一、核心:開啟 Redis 持久化(防止進程崩潰丟失數據)
Redis 提供兩種持久化方式,可單獨使用或結合使用,確保內存中的數據定期寫入磁盤。
1. RDB 持久化(快照方式)
- 原理:在指定時間間隔內,將內存中的數據集 快照(Snapshot) 寫入磁盤(生成
.rdb
文件)。 - 觸發方式:
- 自動觸發:通過
redis.conf
配置觸發條件(如 5 分鐘內有 10 次寫入):
- 自動觸發:通過
save 300 10 # 300秒內有10次修改則觸發快照
save 60 10000 # 60秒內有10000次修改則觸發快照
- 手動觸發:執行
save
(阻塞主進程,不推薦)或bgsave
(后臺異步執行,推薦)命令。
- 手動觸發:執行
- 優點:
.rdb
文件是壓縮的二進制文件,恢復速度快,適合備份。 - 缺點:可能丟失最后一次快照后的所有數據(如快照間隔內 Redis 崩潰)。
2. AOF 持久化(日志方式)
- 原理:將每一條寫命令(如
set
、hset
)追加到.aof
日志文件中,Redis 重啟時通過重放日志恢復數據。 - 配置方式:在
redis.conf
中開啟:
appendonly yes # 開啟AOF
appendfilename "appendonly.aof" # AOF文件名
- 同步策略(控制命令寫入磁盤的頻率,平衡性能與安全性):
appendfsync always # 每執行一條命令就同步到磁盤(最安全,性能最差)
appendfsync everysec # 每秒同步一次(默認,推薦,最多丟失1秒數據)
appendfsync no # 由操作系統決定何時同步(性能最好,安全性最差)
- 優點:數據丟失風險低(默認最多丟失 1 秒數據),日志文件可讀性強。
- 缺點:
.aof
文件體積較大,恢復速度比 RDB 慢。
3. 推薦組合:RDB + AOF
- 原因:RDB 適合快速備份和恢復,AOF 確保數據丟失量最小。
- Redis 4.0+ 支持混合持久化:AOF 重寫時會將 RDB 快照內容寫入 AOF 文件開頭,兼顧兩者優勢:
aof-use-rdb-preamble yes # 開啟混合持久化(默認開啟)
二、進階:防止硬件/磁盤故障(高可用部署)
即使開啟持久化,若單機磁盤損壞,數據仍可能丟失。需通過 主從復制 + 哨兵/集群 實現高可用:
1. 主從復制(Master-Slave)
- 原理:主節點(Master)處理寫請求,從節點(Slave)實時復制主節點的數據。
- 作用:主節點故障時,從節點可作為備用數據來源,避免單點故障。
- 配置:在從節點的
redis.conf
中指定主節點地址:
replicaof <master-ip> <master-port> # Redis 5.0+ 用 replicaof,舊版本用 slaveof
2. 哨兵(Sentinel)
- 作用:監控主從節點狀態,主節點故障時自動將從節點升級為主節點(自動故障轉移),確保服務持續可用。
- 配置:通過
sentinel.conf
定義監控的主節點和故障轉移規則:
sentinel monitor mymaster <master-ip> <master-port> 2 # 監控名為mymaster的主節點,2個哨兵同意則判定故障
sentinel down-after-milliseconds mymaster 30000 # 30秒未響應則標記為主觀下線
3. Redis 集群(Cluster)
- 適用場景:海量數據 + 高并發,將數據分片存儲在多個節點(至少 3 主 3 從)。
- 數據安全:每個主節點有從節點備份,主節點故障后從節點自動切換,同時結合持久化確保分片數據不丟失。
三、其他關鍵配置(減少數據丟失風險)
- 禁用內存淘汰策略(謹慎):
若 Redis 內存滿了,默認會淘汰舊數據(如allkeys-lru
),可通過配置禁止淘汰(僅在內存充足時使用):
maxmemory-policy noeviction # 內存滿時拒絕寫請求,不淘汰數據
- 開啟 AOF 重寫自動觸發:
AOF 文件會越來越大,通過重寫壓縮(保留最終狀態的命令):
auto-aof-rewrite-percentage 100 # AOF文件比上次重寫后增長100%時觸發
auto-aof-rewrite-min-size 64mb # AOF文件至少64MB才觸發重寫
- 避免誤操作:
- 禁用危險命令(如
flushall
、flushdb
):
- 禁用危險命令(如
rename-command FLUSHALL ""
rename-command FLUSHDB ""
- 開啟密碼認證:
requirepass your_strong_password
四、總結:數據不丟失的最佳實踐
- 基礎保障:開啟 AOF(
appendfsync everysec
)+ RDB 混合持久化,確保進程崩潰最多丟失 1 秒數據。 - 高可用保障:部署主從復制 + 哨兵(或集群),防止單點硬件故障導致數據丟失。
- 運維保障:定期備份
.rdb
和.aof
文件,測試數據恢復流程。
通過以上組合,可將 Redis 數據丟失風險降至最低,滿足絕大多數生產環境的可靠性要求。