1. 前言
Redis 的設(shè)計核心是提供快速的查詢和存儲能力,所以所有的數(shù)據(jù)都被存儲在內(nèi)存中。相對于硬盤,內(nèi)存中的數(shù)據(jù)是半持久化存儲,當(dāng)遇到不可抗阻力,例如斷電或者硬件損壞導(dǎo)致的服務(wù)器宕機時,內(nèi)存中的數(shù)據(jù)會完全丟失。為了防止 Redis 中的數(shù)據(jù)丟失,需要將數(shù)據(jù)持久化存儲到硬盤。
2. 持久化方案
面試官提問: Redis 的持久化方案有哪些?這些方案之間有什么區(qū)別?
題目解析:
首先給出持久化的定義:持久化是把 Redis 數(shù)據(jù)從內(nèi)存同步到硬盤的過程。
其次給出 Redis 中兩種持久化方案:
- RDB 持久化:將 Redis 的數(shù)據(jù)定時 dump 到硬盤;
- AOF 持久化:將 Redis 的操作日志追加寫入硬盤文件。
在 Redis 的 redis.conf
文件中,預(yù)先提供了 RDB 和 AOF 的配置方案。
2.1 RDB 方式
RDB 持久化方式的步驟是:
(1)定時從 Redis 主進(jìn)程 fork 一個 Redis 子進(jìn)程;
(2)Redis 子進(jìn)程生成內(nèi)存的數(shù)據(jù)快照,并且寫入 RDB 臨時文件;
(3)臨時文件寫入成功后,生成 RDB 最終文件。
RDB 同步有三種觸發(fā)機制:save 指令、bgsave 指令、自動化指令
- save 指令:命令會阻塞當(dāng)前 Redis 服務(wù)器,導(dǎo)致 Redis 暫時不可用;
- bgsave 指令:命令在后臺異步執(zhí)行操作,Redis 服務(wù)器同時也能響應(yīng)客戶端請求,阻塞只發(fā)生在 fork 時間段,時間很短。
- 自動化指令:在
redis.conf
文件配置,例如數(shù)據(jù)在經(jīng)過 m 次修改后自動觸發(fā) bgsave 命令。
簡單來說,因為 save 指令會在整個過程中阻塞服務(wù)器,所以線上生產(chǎn)環(huán)境都是使用 bgsave 指令。
2.2 AOF 方式
AOF 持久化方式以日志形式記錄 Redis 服務(wù)器的每一個插入、修改、刪除操作,以文本的形式異步保存。
2.3 對比
在介紹完了兩種同步方式后,需要和面試官解釋兩種方式的特點。
RDB 方式的優(yōu)點:
(1)性能較高:在開始持久化時,只需要 fork 出一個子進(jìn)程,子進(jìn)程負(fù)責(zé)持久化的工作,避免主線程的 IO 操作。
(2)啟動效率高:相對于 AOF 方式,如果數(shù)據(jù)集非常大, 啟動速度更快。
RDB 方式的缺點:
(1)如果服務(wù)器在定時持久化之前宕機,那么 Redis 中沒來得及寫入的數(shù)據(jù)都會丟失。
AOF 的優(yōu)點:
(1)數(shù)據(jù)安全:每次修改都會同時追加到日志文件,就算服務(wù)器宕機,數(shù)據(jù)也能在日志文件中找回。
(2)方便重建:日志文件同 MySQL 的 binlog 功能相同,我們所有的寫操作都能從日志文件中獲取。
AOF 的缺點:
(1)運行效率低:AOF 方式本質(zhì)上是犧牲緩存的性能,來換去緩存的一致性。
(2)占用文件更大:AOF 的日志文件相對 RDB 同步的文件,通常要更大,所以在恢復(fù)時速度更慢。
3. 小結(jié)
本章節(jié)介紹了 Redis 的持久化方式,RDB 和 AOF 方式各有特點,需要衡量生產(chǎn)環(huán)境的不同需求定制化選擇。如果偏向高性能,則選擇 RDB 方式,如果需要數(shù)據(jù)高一致性,那么選擇 AOF 方式。