redis学习篇(十)-----高级特性之持久化处理
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
redis是基于內(nèi)存的數(shù)據(jù)庫(kù)。基于內(nèi)存的數(shù)據(jù)庫(kù)速度雖然快,但是卻有一個(gè)嚴(yán)重的弊端:當(dāng)服務(wù)器突然宕機(jī)或者斷電時(shí),內(nèi)存里的數(shù)據(jù)都會(huì)丟失。Redis提供了兩種持久化的方式,可以解決這個(gè)問(wèn)題:內(nèi)存快照(snapshotting)和日志追加(Append-only file)。
內(nèi)存快照
內(nèi)存快照是redis的默認(rèn)持久化方式,是將內(nèi)存中的數(shù)據(jù)以快照方式寫入二進(jìn)制文件中,默認(rèn)文件名為dump.rdb。修改配置文件中的dbfilename 可以修改文件名稱。
Redis每隔一段時(shí)間進(jìn)行一次內(nèi)存快照操作,客戶端使用 save 或者 bgsave 命令通知Redis進(jìn)行一次內(nèi)存快照操作。save命令在主線程中保存內(nèi)存快照,Redis由單線程處理所有請(qǐng)求,執(zhí)行save操作可能阻塞其他客戶端請(qǐng)求,從而導(dǎo)致不能快速響應(yīng)請(qǐng)求,所以建議不要使用save命令。另外需要注意的是,內(nèi)存快照每次都把內(nèi)存數(shù)據(jù)完整的寫入硬盤,而不是只寫入增量數(shù)據(jù)。所以如果數(shù)據(jù)量大,寫入操作比較頻繁,會(huì)嚴(yán)重影響性能。
在配置文件中修改 save <seconds> <changes> 會(huì)改變save的執(zhí)行。save的參數(shù)表示經(jīng)過(guò) seconds 秒或者數(shù)據(jù)更新 changes 次會(huì)進(jìn)行一次內(nèi)存快照操作。可以同時(shí)設(shè)置多個(gè)不同條件,只需要滿足其中一個(gè)就會(huì)觸發(fā)快照操作。
比如默認(rèn)的設(shè)置
當(dāng)滿足900秒內(nèi)有1次更改,或者300秒內(nèi)10次更改,或者60秒內(nèi)10000次更改,就會(huì)進(jìn)行快照處理。要注意的是,這里的900是指每900秒處理一次,而不是只要900秒以內(nèi)有改變就會(huì)一直執(zhí)行。
快照的運(yùn)行方式:
日志追加
日志追加(aof)方式是把增加、修改數(shù)據(jù)的命令通過(guò) write 函數(shù)追加到文件尾部(默認(rèn)是appendonly.aof)。重啟Redis的時(shí)候會(huì)讀取appendonly.aof文件中的所有命令并執(zhí)行,從而把數(shù)據(jù)寫入內(nèi)存中。操作系統(tǒng)內(nèi)核的I/O接口可能存在緩存,所以日志追加方式不能立即寫入文件中,這樣就有可能造成部分?jǐn)?shù)據(jù)的丟失。為了解決這個(gè)問(wèn)題,Redis又提供了幾種方法,通過(guò)修改配置文件告訴Redis應(yīng)該在什么時(shí)候使用fsync函數(shù)強(qiáng)制操作系統(tǒng)將緩存寫入硬盤。通過(guò)修改配置文件中的 appendfsync 可以修改寫入緩存配置。?
日志追加的方式可以有效降低數(shù)據(jù)丟失的風(fēng)險(xiǎn),同時(shí)也會(huì)帶來(lái)別的問(wèn)題,即持久化文件 appendonly.aof 占內(nèi)存會(huì)不斷加大。比如調(diào)用incr number命令100次,文件就會(huì)保存100次incr 命令,實(shí)際上恢復(fù)數(shù)據(jù)只需要set num 100就可以,99個(gè)指令都是多余的。
服務(wù)器可能在程序正在對(duì) AOF 文件進(jìn)行寫入時(shí)停機(jī), 如果停機(jī)造成了 AOF 文件出錯(cuò),那么Redis在重啟時(shí)會(huì)拒絕載入這個(gè) AOF 文件,從而確保數(shù)據(jù)的一致性不會(huì)被破壞。
當(dāng)發(fā)生這種情況時(shí),可以用以下方法來(lái)修復(fù)出錯(cuò)的 AOF 文件:
?
AOF的運(yùn)作方式:
Redis也提供了壓縮日志的命令--bgrewriteaof。Redis收到這條命令時(shí),就會(huì)用類似內(nèi)存快照的方式將內(nèi)存的數(shù)據(jù)以命令的方式保存到臨時(shí)文件中,然后替換日志文件。
?
資料參考:http://doc.redisfans.com/topic/persistence.html
轉(zhuǎn)載于:https://my.oschina.net/OSrainn/blog/730730
總結(jié)
以上是生活随笔為你收集整理的redis学习篇(十)-----高级特性之持久化处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux 高级命令
- 下一篇: Expected an Objectiv