天天看點

redis的持久化

為什麼要持久化?在不考慮伺服器當機的情況下,是不需要把記憶體中的資料儲存到磁盤,來做持久化的。

持久化,就是專門為當機準備的補救措施。redis有rdb和aof兩種持久化機制。

一、RDB (Redis DataBases)

原理:

redis的持久化
目前程序fork出一個子程序,子程序循環周遊所有的資料,并将資料儲存到RDB檔案。

時機:

按照配置檔案設定的政策,來持久化資料。

配置:

save 900 1

save 300 10

save 60 10000

二、AOF (AppendOnly File)

redis的持久化
redis會将收到的,用戶端發送過來的每一個寫指令,都追加到aof檔案的最後。
每次寫指令,都會記錄下操作。

appendonly yes

#預設不需要修改,最低64m開始重排,重排比率是上次的一倍,128m,256m,512m這樣。

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

三、RDB和AOF的比較

持久化:

RDB等待寫入條件,頻率低,如果一次寫入的資料較多,有可能帶來伺服器卡頓。

AOF馬上記錄每次寫指令,頻率高,每次寫入的資料很少;生成的檔案會比RDB生成的大。

AOF記錄資料更及時,丢資料的可能更小。

資料恢複:

RDB恢複資料時,直接從RDB檔案讀取資料,非常快速。

AOF恢複資料時,需要一條一條指令,操作redis伺服器,效率較低。

四、AOF的指令重排

aof的指令為什麼需要重排:

set aa 1

set aa 2

set aa 3

三條指令,其實隻需要儲存最後一條就可以了,指令重排的意義就是,将三條變成一條set aa 3。

redis的持久化

目前程序fork出一個子程序,由子程序完成指令重排。

需要注意的是,在子程序進行指令重排的過程中,如果出現新的指令,主程序做兩件事情:

1.将指令追加到老的aof檔案末尾;

2.将指令儲存到緩存中。緩存中的資料,在子程序完成指令重排之後,全部追加到新的aof檔案尾部。

五、如何選擇持久化的方式