一馁痴、持久化
我們前兩章已經(jīng)講了嚷硫,redis是內(nèi)存型的數(shù)據(jù)庫(kù),他之所以快是因?yàn)閿?shù)據(jù)存儲(chǔ)在內(nèi)存症革。那么數(shù)據(jù)存儲(chǔ)在內(nèi)存會(huì)有什么問(wèn)題呢筐咧?當(dāng)然就是當(dāng)服務(wù)重啟或者服務(wù)器宕機(jī)內(nèi)存數(shù)據(jù)就被清除,我們就無(wú)法訪問(wèn)之前存儲(chǔ)的數(shù)據(jù)了噪矛。那么怎么解決這個(gè)問(wèn)題呢量蕊?當(dāng)然就是使用持久化技術(shù)
持久化(Persistence),即把數(shù)據(jù)(如內(nèi)存中的對(duì)象)保存到可永久保存的存儲(chǔ)設(shè)備中(如磁盤(pán))艇挨。持久化是將程序數(shù)據(jù)在持久狀態(tài)和瞬時(shí)狀態(tài)間轉(zhuǎn)換的機(jī)制残炮。比如JDBC就是一種持久化機(jī)制。文件IO也是一種持久化機(jī)制缩滨。
redis也是一個(gè)支持持久化的內(nèi)存數(shù)據(jù)庫(kù),也就是說(shuō)redis需要經(jīng)常將內(nèi)存中的數(shù)據(jù)同步到磁盤(pán)來(lái)保證持久化势就,持久化可以避免因進(jìn)程退出而造成數(shù)據(jù)丟失;
redis支持兩種持久化方式脉漏,RDB和AOF
二苞冯、RDB持久化方式
RDB持久化把當(dāng)前進(jìn)程數(shù)據(jù)生成快照(.rdb)文件保存到硬盤(pán)的過(guò)程,有手動(dòng)觸發(fā)和自動(dòng)觸發(fā)
2.1?手動(dòng)觸發(fā)
手動(dòng)觸發(fā)有save和bgsave兩命令
save命令:阻塞當(dāng)前Redis侧巨,直到RDB持久化過(guò)程完成為止舅锄,若內(nèi)存實(shí)例比較大會(huì)造成長(zhǎng)時(shí)間阻塞,線(xiàn)上環(huán)境不建議用它
bgsave命令:redis進(jìn)程執(zhí)行fork操作創(chuàng)建子進(jìn)程刃泡,由子線(xiàn)程完成持久化巧娱,阻塞時(shí)間很短(微秒級(jí))碉怔,是save的優(yōu)化,在執(zhí)行redis-cli shutdown關(guān)閉redis服務(wù)時(shí)烘贴,如果沒(méi)有開(kāi)啟AOF持久化,自動(dòng)執(zhí)行bgsave;
bgsave流程如下:
2.2?RDB持久化命令
命令:config set dir /usr/local? //設(shè)置rdb文件保存路徑
備份:bgsave? //將dump.rdb保存到usr/local下
恢復(fù):將dump.rdb放到redis安裝目錄與redis.conf同級(jí)目錄撮胧,重啟redis即可
2.3 恢復(fù)和異常流程演示
1桨踪,查看啟動(dòng)目錄,沒(méi)有dump文件
2芹啥、set值
3锻离、執(zhí)行shutdown命令關(guān)掉服務(wù)铺峭,查看目錄,已經(jīng)生成對(duì)應(yīng)的dump文件汽纠。
4卫键、重啟redis服務(wù),發(fā)現(xiàn)數(shù)據(jù)還存在
5虱朵、執(zhí)行shutdown命令關(guān)掉服務(wù)莉炉,并把dump文件刪除
6、啟動(dòng)redis在進(jìn)行查看碴犬,發(fā)現(xiàn)存儲(chǔ)的數(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):
無(wú)法做到實(shí)時(shí)持久化,每次都要?jiǎng)?chuàng)建子進(jìn)程偿荷,頻繁操作成本過(guò)高
三窘游、AOF持久化
針對(duì)RDB不適合實(shí)時(shí)持久化,redis提供了AOF持久化方式來(lái)解決
開(kāi)啟方式就是在redis.conf設(shè)置:appendonly yes? (默認(rèn)不開(kāi)啟跳纳,為no)
默認(rèn)文件名:appendfilename "appendonly.aof"?
3.1?AOF持久化原理
所有的寫(xiě)入命令(set hset)會(huì)append追加到aof_buf緩沖區(qū)中
AOF緩沖區(qū)向硬盤(pán)做sync同步
隨著AOF文件越來(lái)越大张峰,需定期對(duì)AOF文件rewrite重寫(xiě),達(dá)到壓縮
當(dāng)redis服務(wù)重啟棒旗,可load加載AOF文件進(jìn)行恢復(fù)
3.2?AOF持久化配置
配置信息含義
appendonly yes啟用aof持久化方式
appendfsync always每收到寫(xiě)命令就立即強(qiáng)制寫(xiě)入磁盤(pán)喘批,最慢的,但是保證完全的持久化铣揉,不推薦使用
appendfsync everysec每秒強(qiáng)制寫(xiě)入磁盤(pán)一次饶深,性能和持久化方面做了折中,推薦
no-appendfsync-on-rewrite? yes正在導(dǎo)出rdb快照的過(guò)程中,要不要停止同步aof
auto-aof-rewrite-percentage 100aof文件大小比起上次重寫(xiě)時(shí)的大小,增長(zhǎng)率100%時(shí),重寫(xiě)
auto-aof-rewrite-min-size 64mbaof文件,至少超過(guò)64M時(shí),重寫(xiě)
3.3?AOF持久化恢復(fù)
1. 設(shè)置appendonly yes逛拱;
2. 將appendonly.aof放到dir參數(shù)指定的目錄敌厘;
3. 啟動(dòng)Redis,Redis會(huì)自動(dòng)加載appendonly.aof文件朽合。
四俱两、Redis持久化加載機(jī)制順序
如果同時(shí)都開(kāi)啟了AOF和RDB?兩種持久化方式,那么加載順序及流程如下
當(dāng) AOF 和 RDB 文件同時(shí)存在時(shí)曹步,優(yōu)先加載?AOF
若關(guān)閉了 AOF宪彩,加載 RDB 文件
加載 AOF/RDB 成功,redis 重啟成功
AOF/RDB 存在錯(cuò)誤讲婚,redis 啟動(dòng)失敗并打印錯(cuò)誤信息
轉(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