你不知道的redis三-Redis的持久化機(jī)制

一、持久化

我們前兩章已經(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支持兩種持久化方式,RDBAOF

二、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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容