Redis優秀的效能是由於其將所有的資料都儲存在記憶體中,同樣memcached也是這樣做的,但是為什麼Redis能夠脫穎而出呢,很大程度上是因為Redis有出色的持久化機制,能夠保證伺服器重啟後,資料不會丟失。下面來看看Redis是如何持久化的。
Redis支援兩種方式的持久化,一種是RDB方式,一種是AOF方式。這兩種方式可以單獨使用其中一種,或者混合使用。
RDB方式介紹
RDB方式是通過快照完成的,當符合一定條件時Redis會自動將記憶體中的所有資料進行快照,並且儲存到硬碟上。就像拍照一樣,將這一瞬間的所有東西都儲存下來。進行快照的條件在設定檔中指定。主要有兩個參數構成:時間和改動的索引值的個數,即當在指定時間內被更改的鍵的個數大於執行數值時,就會進行快照。RDB是Redis的預設持久化方式。
RDB方式配置
找到Redis的設定檔:redis.conf
1) 設定觸發條件:
2) 設定rdb檔案路徑
預設rdb檔案存放路徑是目前的目錄,檔案名稱是:dump.rdb。可以在設定檔中修改路徑和檔案名稱,分別是dir和dbfilename
Redis啟動後會讀取RDB快照檔案,將資料從硬碟載入到記憶體,一般情況下1GB的快照檔案載入到記憶體的時間大約20-30分鐘。
RDB如何進行快照
RDB的快照過程:
1) Redis使用fork函數複製一份當前進程(父進程)的副本;
2) 父進程繼續接受並處理用戶端發來的命令,而子進程開始將記憶體中的資料寫入到硬碟中的臨時檔案;
3) 當子進程寫入完成所有資料後會用該臨時檔案替換舊的RDB檔案。
手動快照:
如果沒有觸發自動快照,可以對redis進行手動快照操作,SAVE和BGSAVE都可以執行手動快照,兩個命令的區別是前者是由主進程進行快照操作,會阻塞其他請求;而後者是通過fork子進程進行快照操作。
注意:
由於redis使用fork來複製一份當前進程,那麼子進程就會佔有和主進程一樣的記憶體資源,比如說主進程8G記憶體,那麼在備份的時候必須保證有16G記憶體,要不然會啟用虛擬記憶體,效能非常差。
RDB檔案的壓縮
RDB檔案過大時,是可以壓縮的,Redis預設開啟壓縮,當然也可以通過配置rdbcompression參數來禁用壓縮。
壓縮和不壓縮的優缺點:
壓縮:
優點:減少磁碟儲存空間缺點:消耗CPU資源
1 2 3
不壓縮:
優點:不消耗CPU資源缺點:佔用磁碟空間多
1 2 3
如何選擇。 那就需要看需求、看伺服器資源情況了。