溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Redis持久化該怎么理解

發(fā)布時間:2021-12-23 09:23:05 來源:億速云 閱讀:123 作者:柒染 欄目:大數(shù)據(jù)

Redis持久化該怎么理解,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

我們都知道Redis是個內(nèi)存數(shù)據(jù)庫,所有的數(shù)據(jù)都存儲在內(nèi)存中。一旦服務(wù)器上Redis進程退出,數(shù)據(jù)庫中的數(shù)據(jù)就會丟失。

持久化是做什么事呢?持久化簡單的理解就是將內(nèi)存中的數(shù)據(jù)做個備份。Redis的持久化有兩種方法,即RDB持久化和AOF持久化。下面將會分兩部分介紹這兩種持久化方法,以及實現(xiàn)原理。

Redis持久化該怎么理解

一、RDB持久化

Redis數(shù)據(jù)持久化是將內(nèi)存中的數(shù)據(jù)保存到磁盤里,避免數(shù)據(jù)意外丟失。RDB持久化會生成一個RDB文件,這個RDB文件是一個經(jīng)過壓縮的二進制文件。通過該文件可以還原出Redis數(shù)據(jù)庫中的數(shù)據(jù)。RDB的持久化可以手動執(zhí)行,也可以根據(jù)服務(wù)器配置項定期自動執(zhí)行。

下面我們一起學(xué)習(xí)一下RDB文件是怎么創(chuàng)建的。有兩個命令可以創(chuàng)建RDB文件,一個是SAVE,另一個是BGSAVE。

Redis持久化該怎么理解

執(zhí)行SAVE命令會阻塞Redis服務(wù)器進程,直到RDB文件創(chuàng)建完成為止,在服務(wù)器進程被阻塞期間,服務(wù)器不能處理任何命令請求。

執(zhí)行BGSAVE命令會派生出一個子進程,然后由子進程負責(zé)創(chuàng)建RDB文件,服務(wù)器父進程繼續(xù)處理命令請求。

SAVE命令和BGSAVE命令的底層調(diào)用的函數(shù)都是同一個函數(shù)rdbSave,只不過SAVE命令是直接調(diào)用這個函數(shù),而BGSAVE會fork()出子進程來調(diào)用這個函數(shù)。偽代碼如下:

Redis持久化該怎么理解

RDB文件的載入工作是在服務(wù)器啟動時自動執(zhí)行的,只要Redis服務(wù)器在啟動時檢測到RDB文件存在,就會自動載入RDB文件。值得一提的是,Redis服務(wù)器在載入RDB文件的期間,會一直處于阻塞狀態(tài),直到載入工作完成為止。

BGSAVE命令在不阻塞服務(wù)器進程的情況下執(zhí)行,所以Redis允許用戶通過設(shè)置服務(wù)器的save選項來讓服務(wù)器每隔一段時間自動執(zhí)行一次BGSAVE命令。

Redis持久化該怎么理解

上面條件只要滿足其中一個,BGSAVE命令就會被執(zhí)行:

  • 第一條的意思是:服務(wù)器在900秒內(nèi)對數(shù)據(jù)庫執(zhí)行過至少1次修改,就會執(zhí)行BGSAVE命令

  • 第二條的意思是:服務(wù)器在300秒內(nèi)對數(shù)據(jù)庫執(zhí)行過至少10次修改,就會執(zhí)行BGSAVE命令

  • 第三條的意思是:服務(wù)器在60秒內(nèi)對數(shù)據(jù)庫執(zhí)行過至少10000次修改,就會執(zhí)行BGSAVE命令

Redis持久化該怎么理解

二、AOF持久化

除了RDB持久化之外,Redis還提供了AOF持久化功能,兩者的實現(xiàn)方式有著很大的不同。RDB持久化是通過保存數(shù)據(jù)庫中的鍵值對來記錄數(shù)據(jù)庫狀態(tài),而AOF持久化是通過保存Redis服務(wù)器所執(zhí)行的寫命令來記錄記錄數(shù)據(jù)庫狀態(tài)。

AOF持久化是如何實現(xiàn)的呢?AOF持久化分文三個步驟:命令追加、文件寫入、文件同步。

  • 命令追加:當(dāng)AOF持久化功能打開時,服務(wù)器在執(zhí)行完一個寫命令后,會以一定的格式將被執(zhí)行的寫命令追加到服務(wù)器中的aof緩沖區(qū)中。aof緩沖區(qū)是redisServer結(jié)構(gòu)體維護的一個SDS結(jié)構(gòu)的屬性。

  • 文件寫入:文件寫入是指從Redis的aof緩沖區(qū)寫入到操作系統(tǒng)的內(nèi)存緩沖區(qū)。這個過程是為了提高文件的寫入效率,但是帶來的風(fēng)險是服務(wù)器出現(xiàn)故障時,內(nèi)存緩沖區(qū)中的數(shù)據(jù)會丟失掉。

  • 文件同步:這個過程是將內(nèi)存緩沖區(qū)中的數(shù)據(jù)寫入到硬盤中的AOF文件中

Redis中默認(rèn)執(zhí)行的是RDB持久化,如何打開AOF持久化呢?我們先來看看AOF的配置項:

①appendonly:這個參數(shù)是AOF的開關(guān),配置成yes可以打開AOF持久化機制。打開AOF機制后

②appendfsync:我們知道Redis中有個事件循環(huán),Redis在每個事件循環(huán)都會將aof緩沖區(qū)中的內(nèi)容寫入到操作系統(tǒng)的內(nèi)存緩沖區(qū)。這個參數(shù)就是來配置將內(nèi)存緩沖區(qū)中的數(shù)據(jù)同步到硬盤上的AOF文件中的更新頻率,有always、everysec、no三個配置值。

  • always表示每次執(zhí)行寫入操作,就會立即將內(nèi)存緩沖區(qū)中的內(nèi)容同步到磁盤中的AOF文件中。這種配置性能比較差,但是可以確保數(shù)據(jù)不丟失。

  • everysec表示每秒執(zhí)行一次將操作系統(tǒng)的內(nèi)存緩沖區(qū)中的數(shù)據(jù)同步到磁盤的AOF文件中,這個操作由一個線程來負責(zé),性能很高。

  • no表示由操作系統(tǒng)來控制何時將內(nèi)存緩沖區(qū)中的數(shù)據(jù)同步到硬盤的AOF文件中。這種操作在服務(wù)器出現(xiàn)異常時會丟失一部分?jǐn)?shù)據(jù)。

下面說說AOF文件的還原過程,我們知道AOF文件中存儲的是所有曾經(jīng)執(zhí)行過的寫命令,所以服務(wù)器只要讀入并重新執(zhí)行一遍AOF文件里保存的寫命令,就可以還原服務(wù)器關(guān)閉之前的數(shù)據(jù)庫內(nèi)容。

同時為了解決在Redis運行過程中AOF文件越來越大,Redis還提供了AOF重寫功能,關(guān)于AOF重寫原理在此不具體介紹,有興趣的我們可以私下討論。

Redis持久化該怎么理解

三、RDB和AOF區(qū)別和聯(lián)系,以及同時工作時的情況

①首先我們總結(jié)一下兩種方式的區(qū)別和聯(lián)系:

RDB持久化:默認(rèn)開啟;全量備份,一次性保存整個數(shù)據(jù)庫;體積小,數(shù)據(jù)恢復(fù)快;服務(wù)器異常時可能會丟失部分?jǐn)?shù)據(jù);SAVE操作會阻塞,BGSAVE不阻塞

AOF持久化:默認(rèn)關(guān)閉;增量備份,一次保存一個修改數(shù)據(jù)庫的命令;體積大,數(shù)據(jù)恢復(fù)慢;備份頻率可以自己設(shè)置;不會出現(xiàn)阻塞

②當(dāng)RDB和AOF同時開始時:

  • 如果RDB在執(zhí)行snapshotting操作,那么redis不會執(zhí)行AOF rewrite; 如果redis在執(zhí)行AOF rewrite,那么就不會執(zhí)行RDB snapshotting

  • 如果RDB在執(zhí)行snapshotting,此時用戶執(zhí)行BGREWRITEAOF命令,那么等RDB快照生成之后,才會去執(zhí)行AOF rewrite

  • 同時有RDB snapshot文件和AOF日志文件,那么redis重啟的時候,會優(yōu)先使用AOF進行數(shù)據(jù)恢復(fù),因為其中的日志更完整

看完上述內(nèi)容,你們掌握Redis持久化該怎么理解的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI