Redis持久化機(jī)制實(shí)現(xiàn)原理和流程
Redis持久化機(jī)制實(shí)現(xiàn)原理是什么?流程是什么?持久化就是把內(nèi)存中的數(shù)據(jù)存放到磁盤中,防止宕機(jī)后內(nèi)存數(shù)據(jù)丟失。按照指定的時(shí)間間隔內(nèi)將內(nèi)存的數(shù)據(jù)以快照的形式保存到硬盤中,對應(yīng)產(chǎn)生的數(shù)據(jù)文件為dump.rdb。通過配置文件中的save參數(shù)來定義快照的周期。
Redis的持久化機(jī)制,以及在實(shí)際業(yè)務(wù)中,我們應(yīng)該如何選擇比較合理的方式,能夠更好的解決我們的問題
Redis持久化機(jī)制實(shí)現(xiàn)原理是什么?
持久化:Redis是內(nèi)存數(shù)據(jù)庫,數(shù)據(jù)都是存儲在內(nèi)存中,為了避免進(jìn)程退出導(dǎo)致數(shù)據(jù)的永久丟失,需要定期將Redis中的數(shù)據(jù)以某種形式(數(shù)據(jù)或命令)從內(nèi)存保存到硬盤;當(dāng)下次Redis重啟時(shí),利用持久化文件實(shí)現(xiàn)數(shù)據(jù)恢復(fù)。除此之外,為了進(jìn)行災(zāi)難備份,可以將持久化文件拷貝到一個(gè)遠(yuǎn)程位置
持久化流程是什么?
既然redis的數(shù)據(jù)可以保存在磁盤上,那么這個(gè)流程是什么樣的呢?
要有下面五個(gè)過程:
(1)客戶端向服務(wù)端發(fā)送寫操作(數(shù)據(jù)在客戶端的內(nèi)存中)。
(2)數(shù)據(jù)庫服務(wù)端接收到寫請求的數(shù)據(jù)(數(shù)據(jù)在服務(wù)端的內(nèi)存中)。
(3)服務(wù)端調(diào)用write這個(gè)系統(tǒng)調(diào)用,將數(shù)據(jù)往磁盤上寫(數(shù)據(jù)在系統(tǒng)內(nèi)存的緩沖區(qū)中)。
(4)操作系統(tǒng)將緩沖區(qū)中的數(shù)據(jù)轉(zhuǎn)移到磁盤控制器上(數(shù)據(jù)在磁盤緩存中)。
(5)磁盤控制器將數(shù)據(jù)寫到磁盤的物理介質(zhì)中(數(shù)據(jù)真正落到磁盤上)。
這5個(gè)過程是在理想條件下一個(gè)正常的保存流程,但是在大多數(shù)情況下,我們的機(jī)器等等都會有各種各樣的故障,這里劃分了兩種情況:
Redis數(shù)據(jù)庫發(fā)生故障,只要在上面的第三步執(zhí)行完畢,那么就可以持久化保存,剩下的兩步由操作系統(tǒng)替我們完成;操作系統(tǒng)發(fā)生故障,必須上面5步都完成才可以。
為應(yīng)對以上5步操作,redis提供了兩種不同的持久化方式:RDB(Redis DataBase)和AOF(Append Only File)
RDB的快照、AOF的重寫都需要fork,這是一個(gè)重量級操作,會對Redis造成阻塞。因此為了不影響Redis主進(jìn)程響應(yīng),我們需要盡可能降低阻塞。
1.降低fork的頻率,比如可以手動來觸發(fā)RDB生成快照、與AOF重寫;
2.控制Redis最大使用內(nèi)存,防止fork耗時(shí)過長;
3.使用更牛逼的硬件;
4.合理配置Linux的內(nèi)存分配策略,避免因?yàn)槲锢韮?nèi)存不足導(dǎo)致fork失敗
線上實(shí)踐經(jīng)驗(yàn):
1.如果Redis中的數(shù)據(jù)并不是特別敏感或者可以通過其它方式重寫生成數(shù)據(jù),可以關(guān)閉持久化,如果丟失數(shù)據(jù)可以通過其它途徑補(bǔ)回;
2.自己制定策略定期檢查Redis的情況,然后可以手動觸發(fā)備份、重寫數(shù)據(jù);
3.可以加入主從機(jī)器,利用一臺從機(jī)器進(jìn)行備份處理,其它機(jī)器正常響應(yīng)客戶端的命令;
4.RDB持久化與AOF持久化可以同時(shí)存在,配合使用。
到此這篇關(guān)于Redis持久化機(jī)制實(shí)現(xiàn)原理和流程的文章就介紹到這了,更多相關(guān)Redis持久化機(jī)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用requests發(fā)送POST請求實(shí)例代碼
這篇文章主要介紹了Python使用requests發(fā)送POST請求實(shí)例代碼,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01對PyTorch torch.stack的實(shí)例講解
今天小編就為大家分享一篇對PyTorch torch.stack的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07python使用Tkinter實(shí)現(xiàn)在線音樂播放器
這篇文章主要為大家詳細(xì)介紹了python使用Tkinter實(shí)現(xiàn)在線音樂播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Python簡單獲取二維數(shù)組行列數(shù)的方法示例
這篇文章主要介紹了Python簡單獲取二維數(shù)組行列數(shù)的方法,結(jié)合實(shí)例形式分析了Python基于numpy模塊的二維數(shù)組相關(guān)運(yùn)算技巧,需要的朋友可以參考下2018-12-12Python可視化學(xué)習(xí)之seaborn繪制矩陣圖詳解
矩陣圖即用一張圖繪制多個(gè)變量之間的關(guān)系,數(shù)據(jù)挖掘中常用于初期數(shù)據(jù)探索。本文介紹python中seaborn.pairplot和seaborn.PairGrid繪制矩陣圖,需要的可以參考一下2022-02-02Python查找兩個(gè)有序列表中位數(shù)的方法【基于歸并算法】
這篇文章主要介紹了Python查找兩個(gè)有序列表中位數(shù)的方法,結(jié)合實(shí)例形式分析了Python基于歸并算法遍歷、計(jì)算有序列表相關(guān)操作技巧,需要的朋友可以參考下2018-04-04Python Flask上下文管理機(jī)制實(shí)例解析
這篇文章主要介紹了Python Flask上下文管理機(jī)制實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03python 獲取指定文件夾下所有文件名稱并寫入列表的實(shí)例
下面小編就為大家分享一篇python 獲取指定文件夾下所有文件名稱并寫入列表的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04