Redis持久化

Redis的持久化

Redis的持久化方式有兩種:快照(RDB)文件追加文件(AOF文件) 兩種方式。

RDB

基本原理

RDB這種方式的工作原理就是Redis會創(chuàng)建一個子進(jìn)程,然后子進(jìn)程把數(shù)據(jù)寫到一個臨時的RDB文件,當(dāng)子進(jìn)程寫完RDB文件之后,它會將舊的RDB文件替換掉。

優(yōu)點

  • RDB文件很簡潔,相比于后面AOF這種方式。你可以設(shè)置一個時間點對RDB文件進(jìn)行歸檔,這樣我們就能很輕易的實現(xiàn)將數(shù)據(jù)恢復(fù)到歸檔的時間點。
  • RDB的性能也很好,在需要持久化時會創(chuàng)建一個子進(jìn)程出來做持久化的工作不會影響主進(jìn)程。
  • 相比于AOF的方式,在數(shù)據(jù)量較大的情況下,RDB的啟動速度相對于AOF會更快。

缺點

  • RDB更容易丟數(shù)據(jù)。RDB通常設(shè)置的是每隔多久持久化一次,如果因為某些原因Redis掛了,那么在距離上一次持久化的這段時間內(nèi)的數(shù)據(jù)將會丟失。
  • 同樣RDB格式因為Redis的版本不同,會存在版本兼容性的問題。有可能不同版本的Redis產(chǎn)生的RDB文件不兼容。
  • 無法做到實時持久化。即使手動的觸發(fā),它還是需要創(chuàng)建子進(jìn)程來處理,如果頻繁執(zhí)行效率上也不會太高。

相關(guān)配置

在Redis的配置文件中,我們可以查找SNAPSHOTTING節(jié)點下的相關(guān)內(nèi)容找到RDB的配置信息。

保存點

你可以配置保存點,使Redis在多少秒內(nèi)數(shù)據(jù)改變N次就保存快照文件。它的格式如下:

save 時間(秒) 改變次數(shù)

例如配置在30s內(nèi)發(fā)生100次變動就保存快照文件。

save 30 100

同時我們可以配置多個保存策略,默認(rèn)的配置文件示例中就配置了三個。如果我們想禁用快照保存策略該怎么做呢?有兩種做法,第一種就是注釋掉所有的保存策略,第二種就是在最后添加一條配置。配置信息如下:

save ""

錯誤處理

默認(rèn)情況下,如果Redis持久化失敗,那么就會停止接收數(shù)據(jù),目的是為了讓用戶知道這個時候RDB持久化失敗了。這個配置信息如下:

stop-writes-on-bgsave-error yes

如果想要禁用該功能,將該值設(shè)置成false即可。

數(shù)據(jù)壓縮

默認(rèn)情況下,Redis會采用LZF對數(shù)據(jù)進(jìn)行壓縮。不過該功能會消耗部分CPU性能,如果需要關(guān)閉該功能只需要將其設(shè)置成false即可。

rdbcompression yes

數(shù)據(jù)校驗

在Redis5及以上的版本,Redis會在生成的RDB文件末尾增加一個CRC64校驗碼。可以通過這個校驗碼來檢查文件是否完整,但是該配置會消耗CPU性能,如果想最求極致的性能可以將其關(guān)閉。

rdbchecksum yes

dump文件

RDB文件的文件名稱和目錄我們可以通過下面兩個配置來設(shè)置:

# RDB文件名稱
dbfilename dump.rdb
# RDB文件目錄
dir ./

手動觸發(fā)

默認(rèn)情況下,Redis會按照我們配置的保存點來觸發(fā)RDB持久化,如果我們想手動觸發(fā)可以通過下面兩種方式。

save

使用save命令會使用同步的方式生成RDB快照文件,這意味著在持久化的這個過程中會阻塞所有其他客戶端的請求。因此在生成環(huán)境下不建議使用該命令。

bgsave

通過名稱可以知道,該命令會在后臺保存RDB文件,調(diào)用該命令后會立馬返回OK信息。Redis會創(chuàng)建一個子進(jìn)程來處理,然后恢復(fù)客戶端的服務(wù)。

AOF

通過上面的方式我們知道了快照的方式并不是那么可靠,因為它存在快照真空期。如果我們的服務(wù)掛掉了或者Redis服務(wù)被kill掉了,而RDB文件上次持久化時間距離服務(wù)器掛了的這段時期的數(shù)據(jù)就丟失了。
相比于RDB這種方式,AOF提供了一種更加可靠的持久化方式。每當(dāng)Redis接收到一個修改數(shù)據(jù)的命令時,它就會把命令通過追加寫的方式寫到AOF文件中。當(dāng)你重啟Redis時,AOF里面的命令重寫執(zhí)行一次,數(shù)據(jù)就恢復(fù)了。

優(yōu)點

  • 相比與RDB的方式更加可靠。默認(rèn)情況下,可以設(shè)置每秒fsync一次,這意味著你最多丟失一秒的數(shù)據(jù)。
  • AOF是通過追加寫的方式寫數(shù)據(jù)的。就算遇到突發(fā)情況也不會導(dǎo)致文件的定位和損壞問題。
  • 因為AOF文件是通過追加寫的方式記錄的,當(dāng)AOF文件太大時Redis會在后臺進(jìn)行重寫。
  • AOF把操作命令逐條寫入到文件中,很容易恢復(fù)數(shù)據(jù)。例如我們把所有數(shù)據(jù)都flushall了,只要我們的AOF文件還沒有被重寫,那么我們可以刪掉flushall命令,然后重啟服務(wù)即可。

缺點

  • 在相同的數(shù)據(jù)集下,AOF文件的大小一般會比RDB文件大。
  • 在某些fsync策略下,AOF的速度會比RDB慢。通常設(shè)置成每秒一次能獲得較高的性能。

相關(guān)配置

搜索Redis的配置文件中APPEND ONLY MODE節(jié)點的相關(guān)配置可以找到AOF的配置信息。

開啟AOF

我們可以通過下面的配置開啟或者關(guān)閉AOF功能,默認(rèn)情況下該值為false.

appendonly yes

文件名稱與目錄

可以通過配置文件中的appendfilename設(shè)置AOF文件的名稱,通過可以通過dir設(shè)置文件的目錄。需要注意的是,dir該配置與RDB是共用的。

appendfilename "appendonly.aof"

可靠性

Redis調(diào)用fsync的頻率有三個選項可以選擇:

  • appendfsync always 每當(dāng)有新命令追加到AOF的時候調(diào)用fsync。速度最慢,但是最安全。
  • appendfsync everysec 每秒調(diào)用一次fsync,安全性比較不錯,最多丟失1s的數(shù)據(jù),速度也快。
  • appendfsync no 從不主動調(diào)用fsync,交由系統(tǒng)去處理。這個方式速度最快,但是安全性一般。
# appendfsync always
appendfsync everysec
# appendfsync no

日志重寫

隨著修改操作不斷增多,AOF文件會越來越大。AOF會執(zhí)行重寫操作,例如我們將一個計數(shù)器持續(xù)不斷的增加了1萬次,而實際上我們可以把這一萬次命令改成一次增加1萬即可,這樣命令就被精簡成一條了。Redis提供了在后臺重建AOF文件的功能,而重寫的觸發(fā)條件可以通過下面兩個選項配置:

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

Redis會記住上次重寫后的AOF文件大小,如果當(dāng)前的AOF文件超過了上一次文件大小的百分比,那么就會觸發(fā)重寫。同時還要設(shè)置一個文件的最小值,防止很小的時候就已經(jīng)超過了百分比而進(jìn)行重寫。
如果需要禁用重寫功能,可以設(shè)置這個百分比為0禁用重寫。

auto-aof-rewrite-percentage 0

no-appendfsync-on-rewrite

該配置的作用是在后臺執(zhí)行AOF重寫時fsync設(shè)置為no。
當(dāng)AOF的fsync配置為everysec或者always時,并且后臺運行著RDB的save或者AOF的重寫時,會消耗大量的磁盤性能。在某些linux配置下,aof同步到磁盤執(zhí)行fsync將被阻塞很長時間。
目前并沒有解決辦法,為了減輕這個問題,可以將該配置設(shè)置成no防止在執(zhí)行save或者aof重寫時在主線程fsync。這意味著appendfsync為0,這很可能導(dǎo)致數(shù)據(jù)的丟失。如果你對延遲有問題,可以將該值設(shè)置成yes,如果你更需要保證數(shù)據(jù)的完整性應(yīng)該將其設(shè)置成false。

no-appendfsync-on-rewrite no

aof-load-truncated

該配置的作用是當(dāng)發(fā)生AOF文件末尾截斷時,是加載文件還是報錯退出。

aof-load-truncated yes

如果該值為yes時,文件將被加載,將會打印日志知用戶。如果為no時,服務(wù)將拒絕啟動。我們需要使用redis-check-aof工具修復(fù)AOF文件再重新啟動。

RDB-AOF混合方式

在Redis的在4.0的版本增加了新的混合持久化方式?;旌铣志没绞酵瑫r結(jié)合了RDB和AOF的持久化方式將數(shù)據(jù)寫入AOF文件中。這樣做的好處是可以結(jié)合RDB和AOF的優(yōu)點,快速加載數(shù)據(jù)同時避免丟失過多數(shù)據(jù)。默認(rèn)情況下,如果開啟AOF,該配置也默認(rèn)開啟。

aof-use-rdb-preamble yes

總結(jié)

對于RDB和AOF的持久化方式,它們都有自身的優(yōu)缺點。我們更應(yīng)該結(jié)合自己的業(yè)務(wù)實際情況選擇合理的持久化方案,對于其中的配置作用,更多可以參照Redis中給出的示例配置文件注釋和官網(wǎng)文檔信息進(jìn)行了解。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容