和Memcache不同的是,Redis能讓資料持久化到硬碟中。 Redis目前提供三種持久化方式,RDB、AOF、RDB-AOF混合持久化。資料的安全及備份是維運工作中的重點,以下來看看這RDB持久化的介紹及應用場景。
Redis預設使用的持久化方式是RDB,RDB檔案佔用空間很小,所以產生檔案速度及載入都很快。
產生RDB檔案
產生RDB檔案分為手動方式以及自動方式。
先看手動方式,有兩個指令可以觸發產生RDB檔。 save及bgsave,他們的差別在於save操作會阻塞redis,直到RDB檔案產生結束。而bgsave,則不會阻塞redis,它會fork出一個子程序,在子程序中完成rdb檔的產生。
自動方式則又有幾種情況,分別如下:
目前鍵的修改操作達到redis中Rdb的設定要求
#主從節點進行全量複製的時候
重啟或關閉redis的時候(Redis持久化方式為RDB)
這裡,我們將重點放在下rdb的相關配置。
rdb檔案儲存的目錄是有dir設定項決定的
# rdb文件保存目录 dir "/usr/local/redis/var"
而檔案名稱則是由dbfilename決定
dbfilename "dump.rdb"
觸發機制則有save項目決定
save 900 1 save 300 10 save 60 10000
上面的配置的意義是,當900秒內有1次修改操作就觸發、當300秒內用10次修改操作就觸發,當60秒內有10000次修改操作就觸發。
另外rdbcompression設定項決定是否壓縮rdb文件,預設為yes,表示壓縮,這也是建議的方式。
RDB檔案產生流程
#因為save幾乎已經被遺棄,redis自動觸發都是採用bgsave操作,所以這裡只介紹bgsave的流程。
當執行bgsave時候,如果目前已有子程序的話,那麼redis就會直接退出,不執行下面的操作。沒有則往下執行。
redis主程序會fork出一個子程序。 fork的時候會阻塞redis,但時間非常短。
fork成功後,redis主流程繼續做自己該做的事。
子程序產生新的RDB文件,並取代舊的rdb檔。
當取代作業完成後,子行程會通知父行程,父行程就會儲存此操作的相關資訊。
應用程式場景
#RDB檔案體積小,產生及載入快,但rdb持久化方式無法做到即時持久化,異常情況下容易導致資料遺失。另外,不同版本的rdb檔案可能有不相容的情況。
透過上面的介紹,可以知道,RDB檔案非常適合做災難備份,例如每天凌晨產生RDB檔案。另外,如果redis裡存放的資料不是太重要,例如使用redis做緩存,丟失部分資料沒有影響的話,使用RDB通常是更佳的方式。
再介紹一個常見的問題的解決方法,redis資料存放的分割區快要寫滿時,如何在不停止redis下將資料寫到另一個分割區。我們可以使用config set dir '新分區目錄' 修改rdb檔案存放的目錄。然後執行bgsave產生新的RDB檔案到新的目錄中。
以上是redis資料持久化之RDB的詳細內容。更多資訊請關注PHP中文網其他相關文章!