1. 程式人生 > >Redis持久化(RDB和AOF)

Redis持久化(RDB和AOF)

前言

為了使Redis在重啟後仍能保證資料不丟失,需要將資料從記憶體中以某種形式持久化到硬碟中。Redis提供了兩種持久化的方式:RDB和AOF,這兩種持久化方式所產生的儲存檔案的格式分別是.rdb和.aof。

一.RDB

1.什麼是RDB方式?

RDB就是快照方式實現持久化,所謂快照就是將當前的資訊全部儲存到一個位於安裝目錄下的dump.rdb檔案中,redis預設是開啟RDB方式的。

2.有兩種方式執行快照:

1) 自動執行:第一種是當滿足一定條件時,會進行一次快照,這是一種固定時間間隔會產生的快照。
在redis.conf檔案中有:

save <seconds>
<changes>

這裡寫圖片描述
在多少秒之內發生幾條及以上的記錄進行更新就進行一次快照,比如第一條就是在900秒內出現至少一條記錄被更新就進行一次快照;
當執行SHUTDOWN命令關閉連線時,會進行一次快照保證資料持久化。
“如果持久化被開啟的話, SHUTDOWN 命令會保證伺服器正常關閉而不丟失任何資料。”(來自Redis命令參考
2) 手動執行:如果沒有觸發自動快照,需要對Redis執行手動快照操作,SAVE和BGSAVE都是執行手動快照,但是兩者有區別:可以通過SAVE和BGSAVE命令來手動快照,兩個命令的區別是前者是由主程序進行快照,會阻塞其他請求,後者是通過fork子程序進行快照。
3) 注意

:由於Redis使用fork來複制一份當前程序,那麼子程序就會佔有和主程序一樣的記憶體資源,比如說主程序8G記憶體,那麼在備份的時候,必須保證有16G的記憶體,要不然會啟用虛擬記憶體,效能非常的差。

3.RDB的缺點:

1) save命令會發生阻塞,即使是使用bgsave也會建立一個子程序而耗費大量資源,有些情況下,fork子程序的時間甚至會超過資料備份的時間;
2) 定期的持久化可能會存在資料丟失的風險,可以根據情況配置save的引數。

二.AOF

1.什麼是AOF方式?

RDB方式是將資料進行持久化,而AOF是將執行的語句進行持久化,將執行的寫操作的語句都儲存到appendonly.aof檔案中,通過執行儲存的語句的方式恢復資料。AOF方式預設是關閉的,可以在redis.conf檔案中更改配置(把no改為yes)。
這裡寫圖片描述


這裡寫圖片描述
appenfsync是進行同步的頻率:
always是每執行一條寫操作語句就進行一次同步;
everysec是每秒執行一次同步;
no是不開啟同步。
這三者中,always會大大降低效能,所以一般選用everysec方式,即使出現資料丟失,最壞的情況下也只是丟失一秒的資料。

2. .aof檔案過大怎麼辦?

隨著寫操作的執行增加,.aof檔案會越來越大,redis提供了一個rewrite操作對檔案進行壓縮。
這個壓縮並不是從原來的備份檔案中複製語句而是將資料存下來,將其轉化為最簡單的SET語句(這裡就比較像是快照了),同時還在對正在進行的寫操作進行備份,對兩個檔案進行合併成為一個檔案,建立的新檔案在進行壓縮合並之後才會更名為append.aof。
那麼什麼時候去執行這條語句呢?
1) 手動執行
執行bgrewriteaof命令
2) 自動執行
這裡寫圖片描述
這兩條配置指定了進行rewrite的條件,
auto-aof-rewrite-percentage 100:當前.aof檔案的大小一旦超過上一次重寫後的.aof檔案大小的百分之多少(此處是100)就進行一次rewrite;
auto-aof-rewrite-min-size 64mb:當.aof檔案大小超過多大(此處是64mb)才可以進行rewrite操作。

三.總結

AOF:資料更完整,但恢復資料速度較慢(需要執行寫入操作)
RDB:資料不能保證很完整,但恢復資料較快
根據這兩種方式的優缺點,若要實現持久化,可以通過配置檔案來指定它們中的一種,或者同時使用它們(不建議同時使用),在主從架構中,master通常使用AOF,slave使用RDB,主要原因是master需要首先確保資料完整性,它作為資料備份的第一選擇;而slave功能就是響應使用者的讀請求,對響應速度要求高,當master資料恢復後可以通過主從複製保證資料的一致性。