為什麼要持久化?在不考慮伺服器當機的情況下,是不需要把記憶體中的資料儲存到磁盤,來做持久化的。
持久化,就是專門為當機準備的補救措施。redis有rdb和aof兩種持久化機制。
一、RDB (Redis DataBases)
原理:
目前程序fork出一個子程序,子程序循環周遊所有的資料,并将資料儲存到RDB檔案。![]()
redis的持久化
時機:
按照配置檔案設定的政策,來持久化資料。
配置:
save 900 1
save 300 10
save 60 10000
二、AOF (AppendOnly File)
redis會将收到的,用戶端發送過來的每一個寫指令,都追加到aof檔案的最後。![]()
redis的持久化
每次寫指令,都會記錄下操作。
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檔案尾部。