一、持久化
我們前兩章已經(jīng)講了,redis是內(nèi)存型的數(shù)據(jù)庫,他之所以快是因?yàn)閿?shù)據(jù)存儲在內(nèi)存。那么數(shù)據(jù)存儲在內(nèi)存會有什么問題呢?當(dāng)然就是當(dāng)服務(wù)重啟或者服務(wù)器宕機(jī)內(nèi)存數(shù)據(jù)就被清除,我們就無法訪問之前存儲的數(shù)據(jù)了。那么怎么解決這個問題呢?當(dāng)然就是使用持久化技術(shù)
持久化(Persistence),即把數(shù)據(jù)(如內(nèi)存中的對象)保存到可永久保存的存儲設(shè)備中(如磁盤)。持久化是將程序數(shù)據(jù)在持久狀態(tài)和瞬時狀態(tài)間轉(zhuǎn)換的機(jī)制。比如JDBC就是一種持久化機(jī)制。文件IO也是一種持久化機(jī)制。
redis也是一個支持持久化的內(nèi)存數(shù)據(jù)庫,也就是說redis需要經(jīng)常將內(nèi)存中的數(shù)據(jù)同步到磁盤來保證持久化,持久化可以避免因進(jìn)程退出而造成數(shù)據(jù)丟失;
redis支持兩種持久化方式,RDB和AOF
二、RDB持久化方式
RDB持久化把當(dāng)前進(jìn)程數(shù)據(jù)生成快照(.rdb)文件保存到硬盤的過程,有手動觸發(fā)和自動觸發(fā)
2.1?手動觸發(fā)
手動觸發(fā)有save和bgsave兩命令
save命令:阻塞當(dāng)前Redis,直到RDB持久化過程完成為止,若內(nèi)存實(shí)例比較大會造成長時間阻塞,線上環(huán)境不建議用它
bgsave命令:redis進(jìn)程執(zhí)行fork操作創(chuàng)建子進(jìn)程,由子線程完成持久化,阻塞時間很短(微秒級),是save的優(yōu)化,在執(zhí)行redis-cli shutdown關(guān)閉redis服務(wù)時,如果沒有開啟AOF持久化,自動執(zhí)行bgsave;
bgsave流程如下:
2.2?RDB持久化命令
命令:config set dir /usr/local? //設(shè)置rdb文件保存路徑
備份:bgsave? //將dump.rdb保存到usr/local下
恢復(fù):將dump.rdb放到redis安裝目錄與redis.conf同級目錄,重啟redis即可
2.3 恢復(fù)和異常流程演示
1,查看啟動目錄,沒有dump文件

2、set值


3、執(zhí)行shutdown命令關(guān)掉服務(wù),查看目錄,已經(jīng)生成對應(yīng)的dump文件。

4、重啟redis服務(wù),發(fā)現(xiàn)數(shù)據(jù)還存在

5、執(zhí)行shutdown命令關(guān)掉服務(wù),并把dump文件刪除

6、啟動redis在進(jìn)行查看,發(fā)現(xiàn)存儲的數(shù)據(jù)已經(jīng)不存在了。

2.4?RDB持久化的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
壓縮后的二進(jìn)制文,適用于備份、全量復(fù)制,用于災(zāi)難恢復(fù)
加載RDB恢復(fù)數(shù)據(jù)遠(yuǎn)快于AOF方式
缺點(diǎn):
無法做到實(shí)時持久化,每次都要創(chuàng)建子進(jìn)程,頻繁操作成本過高
三、AOF持久化
針對RDB不適合實(shí)時持久化,redis提供了AOF持久化方式來解決
開啟方式就是在redis.conf設(shè)置:appendonly yes? (默認(rèn)不開啟,為no)

默認(rèn)文件名:appendfilename "appendonly.aof"?
3.1?AOF持久化原理
所有的寫入命令(set hset)會append追加到aof_buf緩沖區(qū)中
AOF緩沖區(qū)向硬盤做sync同步
隨著AOF文件越來越大,需定期對AOF文件rewrite重寫,達(dá)到壓縮
當(dāng)redis服務(wù)重啟,可load加載AOF文件進(jìn)行恢復(fù)
3.2?AOF持久化配置
配置信息含義
appendonly yes啟用aof持久化方式
appendfsync always每收到寫命令就立即強(qiáng)制寫入磁盤,最慢的,但是保證完全的持久化,不推薦使用
appendfsync everysec每秒強(qiáng)制寫入磁盤一次,性能和持久化方面做了折中,推薦
no-appendfsync-on-rewrite? yes正在導(dǎo)出rdb快照的過程中,要不要停止同步aof
auto-aof-rewrite-percentage 100aof文件大小比起上次重寫時的大小,增長率100%時,重寫
auto-aof-rewrite-min-size 64mbaof文件,至少超過64M時,重寫
3.3?AOF持久化恢復(fù)
1. 設(shè)置appendonly yes;
2. 將appendonly.aof放到dir參數(shù)指定的目錄;
3. 啟動Redis,Redis會自動加載appendonly.aof文件。
四、Redis持久化加載機(jī)制順序
如果同時都開啟了AOF和RDB?兩種持久化方式,那么加載順序及流程如下
當(dāng) AOF 和 RDB 文件同時存在時,優(yōu)先加載?AOF
若關(guān)閉了 AOF,加載 RDB 文件
加載 AOF/RDB 成功,redis 重啟成功
AOF/RDB 存在錯誤,redis 啟動失敗并打印錯誤信息
轉(zhuǎn)自:https://blog.csdn.net/b379685397/article/details/108130809?utm_medium=distribute.pc_feed.none-task-blog-personrec_tag-4.nonecase&depth_1-utm_source=distribute.pc_feed.none-task-blog-personrec_tag-4.nonecase&request_id=5f439919cea070620e93ef00