【Redis】9.10.Redis持久化方式之RDBAOFAOF和RDB区别场景分析
持久化簡(jiǎn)介
什么是持久化
利用永久性存儲(chǔ)介質(zhì)將數(shù)據(jù)進(jìn)行保存,在特定的事件將保存的數(shù)據(jù)進(jìn)行恢復(fù)的工作機(jī)制稱(chēng)為持久化
為什么要持久化
防止數(shù)據(jù)的意外丟失,確保數(shù)據(jù)安全性
持久化的過(guò)程保存什么
- 將當(dāng)前數(shù)據(jù)狀態(tài)進(jìn)行保存,快照形式,存儲(chǔ)數(shù)據(jù)結(jié)果,存儲(chǔ)而是簡(jiǎn)單,關(guān)注點(diǎn)在數(shù)據(jù) -----》 RDB
- 將數(shù)據(jù)的操作過(guò)程進(jìn)行保存,日志形式,存儲(chǔ)操作過(guò)程,存儲(chǔ)格式復(fù)雜,關(guān)注點(diǎn)在數(shù)據(jù)的操作過(guò)程 ------》AOF
RDB
RDB啟動(dòng)方式
誰(shuí),什么事件,干什么事情?
- 誰(shuí):redis操作者(用戶(hù))
- 什么時(shí)間:即時(shí)(隨時(shí)進(jìn)行)
- 干什么事情:保存數(shù)據(jù)
RDB的啟動(dòng)方式——save指令
- 命令
save
- 作用
手動(dòng)執(zhí)行一次保存操作
RDB啟動(dòng)方式——save指令相關(guān)配置
- dbfilename dump.rdb
說(shuō)明:設(shè)置本地?cái)?shù)據(jù)庫(kù)文件名,默認(rèn)值為dump.rdb
經(jīng)驗(yàn):通常設(shè)置魏dump-端口號(hào).rdb - dir
說(shuō)明:設(shè)置存儲(chǔ).rdb文件的路徑
經(jīng)驗(yàn):通常設(shè)置成存儲(chǔ)空間較大的目錄中,目錄名稱(chēng)data - rdbcompression yes
說(shuō)明:設(shè)置存儲(chǔ)至本地?cái)?shù)據(jù)庫(kù)時(shí)是否壓縮數(shù)據(jù),默認(rèn)為yes,采用LZF壓縮
經(jīng)驗(yàn):通常默認(rèn)為開(kāi)啟狀態(tài),如果設(shè)置成no,可以節(jié)省CPU運(yùn)行時(shí)間,但會(huì)使存儲(chǔ)的文件變大(巨大) - rdbchecksumy yes
說(shuō)明:設(shè)置是否進(jìn)行RDB文件格式的校驗(yàn),該校驗(yàn)過(guò)程在寫(xiě)文件和讀文件過(guò)程均進(jìn)行
經(jīng)驗(yàn):通常默認(rèn)為開(kāi)啟狀態(tài),如果設(shè)置為no,可以節(jié)約讀寫(xiě)性過(guò)程約10%時(shí)間消耗,但是存儲(chǔ)一定的數(shù)據(jù)損壞風(fēng)險(xiǎn)
conf配置文件:
RDB啟動(dòng)方式——save指令工作原理
注意:Redis是單線(xiàn)程的,所有命令都會(huì)在類(lèi)似隊(duì)列中排好隊(duì),不建議使用save指令,因?yàn)閟ave指令的執(zhí)行會(huì)阻塞當(dāng)前Redis服務(wù)器,直到當(dāng)前RDB過(guò)程完成位置,有可能會(huì)造成長(zhǎng)時(shí)間阻塞,線(xiàn)上環(huán)境不建議使用
如上所述,數(shù)據(jù)量過(guò)大,單線(xiàn)程執(zhí)行方式造成效率過(guò)低如何處理?
后臺(tái)執(zhí)行
- 誰(shuí):redis操作者(用戶(hù))發(fā)起指令;redis服務(wù)器控制指令執(zhí)行
- 什么時(shí)間:即時(shí)(發(fā)起);合理時(shí)間(執(zhí)行)
- 干什么事情:保存數(shù)據(jù)
RDB啟動(dòng)方式——bgsave指令
- 命令
bgsave
- 作用
手動(dòng)啟動(dòng)后臺(tái)保存操作,但不是立即執(zhí)行
RDB啟動(dòng)方式——bgsave指令工作原理
注意:bgsave命令是針對(duì)save阻塞問(wèn)題做的優(yōu)化。Redis內(nèi)部所有涉及到RDB操作都采用bgsave的方式,save命令可以放棄使用
RDB啟動(dòng)方式——bgsave指令相關(guān)配置
以下跟save配置相同
新增
- stop-writes-on-bgsave-error yes
說(shuō)明:后臺(tái)存儲(chǔ)過(guò)程中如果出現(xiàn)錯(cuò)誤線(xiàn)程,是否停止保存操作
經(jīng)驗(yàn):通常默認(rèn)為開(kāi)啟狀態(tài)
到目前位置,save和bgsave都是手動(dòng)的保存指令,那么會(huì)引入以下問(wèn)題
反復(fù)執(zhí)行保存命令,忘記了怎么辦?不知道數(shù)據(jù)產(chǎn)生了多少變化,何時(shí)保存?
自動(dòng)執(zhí)行
- 誰(shuí):redis服務(wù)器發(fā)起指令(基于條件)
- 什么時(shí)間:滿(mǎn)足條件
- 干什么事情:保存數(shù)據(jù)
RDB啟動(dòng)方式——save配置
- 配置
save second changes
- 作用
滿(mǎn)足限定時(shí)間范圍內(nèi)key的變化數(shù)量達(dá)到指定數(shù)量即進(jìn)行持久化(后臺(tái)使用的就是bgsave) - 參數(shù)
second:監(jiān)控時(shí)間范圍
changes:監(jiān)控key的變化量 - 位置
在conf文件中進(jìn)行配置 - 范例
RDB啟動(dòng)方式——save配置原理
注意:
save配置要根據(jù)實(shí)際業(yè)務(wù)情況進(jìn)行設(shè)置,頻度過(guò)高或過(guò)低都會(huì)出現(xiàn)性能問(wèn)題,結(jié)果可能是災(zāi)難性的
save配置中對(duì)second與changes設(shè)置通常具有互補(bǔ)對(duì)應(yīng)關(guān)系,盡量不要設(shè)置成包含性關(guān)系
save配置啟動(dòng)后執(zhí)行的是bgsave操作
RDB三種啟動(dòng)方式對(duì)比
rdb特殊啟動(dòng)形式
- 全量復(fù)制
在主從復(fù)制中會(huì)提到 - 服務(wù)器運(yùn)行過(guò)程中重啟
debug reload - 關(guān)閉服務(wù)器時(shí)指定保存數(shù)據(jù)
shutdown save
RDB 優(yōu)缺點(diǎn)
RDB優(yōu)點(diǎn)
- RDB是一個(gè)緊湊壓縮的二進(jìn)制文件,存儲(chǔ)效率較高
- RDB內(nèi)部存儲(chǔ)的是redis在某個(gè)時(shí)間點(diǎn)的數(shù)據(jù)快照,非常適合用于數(shù)據(jù)備份,全量復(fù)制等場(chǎng)景
- RDB恢復(fù)數(shù)據(jù)的速度要比AOF快很多
- 應(yīng)用:服務(wù)器中每X小時(shí)執(zhí)行bgsave備份,并將RDB文件拷貝到遠(yuǎn)程機(jī)器中,用于災(zāi)難恢復(fù)
RDB缺點(diǎn)
- RDB方式無(wú)論是執(zhí)行指令還是利用配置,無(wú)法做到實(shí)時(shí)持久化,具體較大的可能性丟失數(shù)據(jù)
- bgsave指令每次運(yùn)行要執(zhí)行fork操作創(chuàng)建子進(jìn)程,要犧牲掉一些性能
- Redis的眾多版本中未進(jìn)行RDB文件格式的版本統(tǒng)一,有可能出現(xiàn)個(gè)版本服務(wù)之間數(shù)據(jù)格式無(wú)法兼容現(xiàn)象
RDB存儲(chǔ)的弊端
- 存儲(chǔ)數(shù)據(jù)量較大,效率較低——基于快照思想,每次讀寫(xiě)都是全部數(shù)據(jù),當(dāng)數(shù)據(jù)量巨大時(shí),效率非常低
- 大數(shù)據(jù)量下的IO性能較低
- 基于fork創(chuàng)建子進(jìn)程,內(nèi)存產(chǎn)生額外消耗
- 宕機(jī)帶來(lái)的數(shù)據(jù)丟失風(fēng)險(xiǎn)
解決思路
- 不寫(xiě)全數(shù)據(jù),僅記錄部分?jǐn)?shù)據(jù)
- 改記錄數(shù)據(jù)未記錄操作過(guò)程
- 對(duì)所有操作均進(jìn)行記錄,排除丟失數(shù)據(jù)的風(fēng)險(xiǎn)
- 這也就是AOF的引入
AOF概念
- AOF(append only file)持久化:以獨(dú)立日志的方式記錄每次寫(xiě)命令,重啟時(shí)再重新執(zhí)行AOF文件中命令達(dá)到恢復(fù)數(shù)據(jù)的目的。與RDB相比可以簡(jiǎn)單描述為該記錄數(shù)據(jù)產(chǎn)生的過(guò)程(注意:只有數(shù)據(jù)被改變時(shí)才會(huì)將操作記錄在aof文件中,如get命令就不會(huì)記錄)
- AOF的主要作用是解決了數(shù)據(jù)持久化的實(shí)時(shí)性,目前已經(jīng)是Redis持久化的主流方式
conf文件配置實(shí)例:
RDB和AOF的區(qū)別
總結(jié)
以上是生活随笔為你收集整理的【Redis】9.10.Redis持久化方式之RDBAOFAOF和RDB区别场景分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Redis】7.使用jedis操作re
- 下一篇: 【Redis】11.Redis事务、事务