1.持久化概念:
redis支持 將內(nèi)存中的數(shù)據(jù)持久化到磁盤中,在下次啟動(dòng)redis時(shí)可以將磁盤中的數(shù)據(jù)加載到內(nèi)存中
2.持久化通用的兩種方式:
- 快照(某一時(shí)刻對(duì)數(shù)據(jù)的備份)
例如:mmysql dump redis RDB - 記錄日志()
例如:Mysql binlog Hbase Hlog redis AOF
3.redis持久化之 RDB(redis database)
①RDB概念:
②觸發(fā)機(jī)制-主要三種方式:
(1) save(同步)
(2)bgsave(異步)
(3)自動(dòng)(符合配置文件中 save滿足條件)

save與bgsave
| \命令 | save | bgsave |
|---|---|---|
| IO類型 | 同步 | 異步 |
| 阻塞 | 是 | 否(阻塞僅僅會(huì)發(fā)生在fork出子進(jìn)程) |
| 復(fù)雜度 | O(n) | O(n) |
| 優(yōu)點(diǎn) | 不消耗額外內(nèi)存 | 不阻塞客戶端命令 |
自動(dòng)生成RDB
save <seconds> <changes>
save 900 1
save 300 10
save 60 10000
釋義:
60秒改變10000次,會(huì)采用bgsave方式生成RDB文件
300秒改變10次,會(huì)自動(dòng)生成RDB文件
③RDB配置相關(guān)
# 每多少秒 數(shù)據(jù)改變幾次
# 滿足下面任一條件進(jìn)行RDB文件生成
#如果線上環(huán)境數(shù)據(jù)量很大時(shí),可以關(guān)閉RDB持久化方式 只需要注釋下面三個(gè)save即可
save 900 1
save 300 10
save 60 10000
#bgsave生成RDB文件出錯(cuò)時(shí)是否停止
stop-writes-on-bgsave-error yes
#RDB文件是否采用壓縮
rdbcompression yes
#是否對(duì)rdb文件校驗(yàn)和校驗(yàn)
#redis 5之后采用CRC64校驗(yàn)方式
rdbchecksum yes
# rdb文件名字
# 目錄位置 采用 dir設(shè)置
dbfilename dump-6379.rdb
#指定目錄路徑非文件名
# rdb文件aof文件均采用此目錄
dir ./
④可能忽略RDB觸發(fā)機(jī)制
(1)全量復(fù)制
從節(jié)點(diǎn)執(zhí)行全量復(fù)制操作的時(shí)候,主節(jié)點(diǎn)會(huì)自動(dòng)觸發(fā)bgsave命令生存rdb文件并發(fā)送給從節(jié)點(diǎn)
(2)debug reload
Redis中的debug reload提供debug級(jí)別的重啟,不清空內(nèi)存的一種重啟,這種方式也會(huì)觸發(fā)RDB文件的生成。

(3)shutdown
RDB存在問(wèn)題:
① 耗時(shí)、耗性能
復(fù)雜度為o(n),save時(shí)內(nèi)存數(shù)據(jù)dump到磁盤:耗時(shí)
bgsave時(shí),fork()階段采用copy-on-write策略,會(huì)比較耗內(nèi)存
dump到文件造成io開銷
②不可控,丟失數(shù)據(jù)
| 時(shí)間戳 | save、bgsave |
|---|---|
| T1 | 執(zhí)行多個(gè)命令 |
| T2 | 滿足RDB自動(dòng)創(chuàng)建條件 |
| T3 | 再次執(zhí)行多個(gè)命令 |
| T4 | 宕機(jī) |
在T4時(shí)刻redis出現(xiàn)宕機(jī),會(huì)導(dǎo)致T3-T4時(shí)刻的數(shù)據(jù)丟失
如何解決? 請(qǐng)看下一節(jié)AOF持久化方式吧
4.redis持久化之AOF(Append-only file)
client每次請(qǐng)求redis,都會(huì)將寫請(qǐng)求的命令保存到文件中,
①AOF三種策略
① always
只要緩沖區(qū)有數(shù)據(jù) 立馬寫入文件中
②everysec
每隔一秒將數(shù)據(jù)從緩沖區(qū)寫入文件中
③no
寫文件的操作交由操作系統(tǒng)控制
AOF三種策略比較
| 命令 | always | everysec | no |
|---|---|---|---|
| 優(yōu)點(diǎn) | 不丟失數(shù)據(jù) | 每秒一次fsync只丟失1秒數(shù)據(jù) | 交由操作系統(tǒng)fsync,不用管 |
| 缺點(diǎn) | 磁盤開銷較大,一般sata磁盤一秒只有幾百TPS | 丟失1秒數(shù)據(jù) | 交由操作系統(tǒng)fsync,不可控 |
總結(jié):
是業(yè)務(wù)情況,場(chǎng)景而定,一般可以使用everysec,在磁盤開銷及數(shù)據(jù)丟失情況取個(gè)折中
aof相關(guān)配置
#是否啟用AOF持久化方式
appendonly no
#AOF文件名
#目錄受Dir控制
appendfilename "appendonly-6379.aof"
#AOF持久化策略
#默認(rèn)值 everysec
# 有三種 no everysec always
#no 寫文件的操作交由操作系統(tǒng)控制
#always 只要緩沖區(qū)有數(shù)據(jù) 立馬寫入文件中
#everysec 每隔一秒將數(shù)據(jù)從緩沖區(qū)寫入文件中
appendfsync everysec
#aof重寫期間主進(jìn)程是否繼續(xù)講日志從緩沖區(qū)刷新到舊日志文件(上圖aof_buf-<舊aof文件)
no-appendfsync-on-rewrite no
#以下兩個(gè)配置同時(shí)滿足即可觸發(fā)AOF重寫
#文件增長(zhǎng)率
auto-aof-rewrite-percentage 100
#aof重寫需要的文件
auto-aof-rewrite-min-size 64mb
②AOF重寫
引入原因:
隨著數(shù)據(jù)的不斷寫入,會(huì)造成AOF文件不斷增大,重復(fù)的命令會(huì)額外占用磁盤空間,而是增加redis重啟速度
AOF重寫定義:
AOF文件重寫不是對(duì)原有AOF文件進(jìn)行讀取分析,而是讀取最新的數(shù)據(jù)進(jìn)行分析實(shí)現(xiàn)的。
AOF重寫作用:
1.減少磁盤占用量
2.加速啟動(dòng)速度
AOF重寫觸發(fā)機(jī)制
1.bgrewriteaof

2.AOF重寫配置(同時(shí)滿足配置文件中auto-aof-rewrite-percentage auto-aof-rewrite-min-size兩個(gè)配置)
bgwriteaof命令
AOF重寫流程
注:
aof_rewrite是在子進(jìn)程執(zhí)行,子進(jìn)程帶有主進(jìn)程數(shù)據(jù)副本,不會(huì)阻塞客戶端請(qǐng)求
子進(jìn)程在AOF重寫期間,主進(jìn)程依然需要會(huì)記錄數(shù)據(jù)變化日志,就會(huì)出現(xiàn)當(dāng)前數(shù)據(jù)與AOF重寫之后的數(shù)據(jù)不一致
解決方案:
redis增加了一個(gè)aof_rewrite_buf(aof重寫緩沖區(qū)),當(dāng)主進(jìn)程fork出子進(jìn)程后開始啟用,此時(shí)主進(jìn)程需要將日志同時(shí)記錄到aof_buf(aof緩沖區(qū))與aof_ewrite_aof(aof重寫緩沖區(qū)),當(dāng)子進(jìn)程重寫完數(shù)據(jù)后給主進(jìn)程發(fā)送信號(hào),此時(shí) 主進(jìn)程通過(guò)信號(hào)處理函數(shù)將aof_rewrite_buf數(shù)據(jù)追加到新aof文件后,替換舊aof文件
5.混合持久化
重啟 Redis 時(shí),我們很少使用 rdb 來(lái)恢復(fù)內(nèi)存狀態(tài),因?yàn)闀?huì)丟失大量數(shù)據(jù)。我們通常使用 AOF 日志重放,但是重放 AOF 日志性能相對(duì) rdb 來(lái)說(shuō)要慢很多,這樣在 Redis 實(shí)例很大的情況下,啟動(dòng)需要花費(fèi)很長(zhǎng)的時(shí)間。 Redis 4.0 為了解決這個(gè)問(wèn)題,帶來(lái)了一個(gè)新的持久化選項(xiàng)——混合持久化。AOF在重寫(aof文件里可能有太多沒(méi)用指令,所以aof會(huì)定期根據(jù)內(nèi)存的最新數(shù)據(jù)生成aof文件)時(shí)將重寫這一刻之前的內(nèi)存rdb快照文件的內(nèi)容和增量的 AOF修改內(nèi)存數(shù)據(jù)的命令日志文件存在一起,都寫入新的aof文件,新的文件一開始不叫appendonly.aof,等到重寫完新的AOF文件才會(huì)進(jìn)行改名,原子的覆蓋原有的AOF文件,完成新舊兩個(gè)AOF文件的替換;
AOF根據(jù)配置規(guī)則在后臺(tái)自動(dòng)重寫,也可以人為執(zhí)行命令bgrewriteaof重寫AOF。 于是在 Redis 重啟的時(shí)候,可以先加載 rdb 的內(nèi)容,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放,重啟效率因此大幅得到提升。
相關(guān)配置:
#redis 4.0引入
# 是否開啟混合持久化
aof-use-rdb-preamble yes
6.總結(jié)
①redis存在AOF與RDB兩種持久化方式
如果redis宕機(jī)或重啟時(shí)想要恢復(fù)數(shù)據(jù),會(huì)優(yōu)先采用哪種方式恢復(fù)數(shù)據(jù)呢?
AOF與RDB同時(shí)開啟時(shí),會(huì)優(yōu)先使用AOF恢復(fù)數(shù)據(jù),如果采用RDB恢復(fù)數(shù)據(jù),可以先將AOF關(guān)閉,appendonly no,重啟完成后,執(zhí)行config set appendonly yes動(dòng)態(tài)開啟AOF