redis中資料持久化介紹
目前會在兩種情況下使用
1. 作為資料庫使用;
2. 作為快取服務器使用。
redis的高效能很大程度上是因為其把資料存放區在記憶體中,然而當redis重啟時或者意外當機後,資料都會丟失。為了不讓redis中資料丟失,我們需要把記憶體中的資料以某種方式儲存的硬碟中,使得redis伺服器重啟後資料可以恢複,這一過程稱之為持久化。
redis支援兩種方式的資料持久化,一是RDB方式;二是AOF方式。
RDB方式會根據指定的規則,“定時”將記憶體中的資料寫入硬碟中;
AOF方式每次執行命令會將命令本身記錄下來。
兩種方式都可以單獨使用,通常是兩者配合使用。下面分別對兩種方式介紹。
以下配置都是通過修改redis根目錄下的redis.conf檔案 一. RDB方式
RDB的方式是通過快照(snapshot)完成,當符合規則時redis會把記憶體的資料產生一個副本並儲存在硬碟中,這個過程稱之為“快照”。
redis會在以下幾種情況執行快照
1. 根據配置規則自動快照
2. 使用者執行save或bgsave命令
3. 執行flushall命令
4. 執行複製時。
下面對以上4中方式分別介紹
1.1 根據配置規則自動快照
使用者可以自訂快照條件,使用者可以在設定檔中自訂,格式如下:
save 時間 改動鍵的個數
save是關鍵字;時間是指在多長時間內,單位是秒;改動鍵的個數是指在指定時間內,被更改的個數大於我們指定的改動鍵個數時,自動執行快照。
如:
save 100 1
save 60 10
save 30 1000
命令允許存在多個,它們之間的關係式或者關聯。以上的命令意思是,每隔100秒,儲存一次;或者,60秒內,有10個以上索引值發生變化;或者,30秒內,有1000個索引值發生變化。當滿足以上3個條件任何之一,redis會自動快照。
1.2 使用者執行save或bgsave命令
當我們需要重啟redis服務、遷移redis服務、備份redis服務時,需要手動執行快照,這時可以使用save或者bgsave命令。
save:同步執行,這時會影響使用者請求,當redis資料比較大時,不建議使用此命令;
bgsave:後台非同步執行,不影響使用者對redis的請求。可以使用lastsave命令,查看最後快照時間。
1.3 執行flushall命令
執行flushall命令時,會清除redis中所有資料。當有任何一個自訂快照條件是,都會觸發快照操作;若沒有自訂任何快照規則,則不會觸發自訂快照。
1.4 執行複製時。
當redis服務配置了主從複製時,即使沒有配置任何自訂快照條件,沒有執行任何手動操作(執行save或者bgsave),也會執行快照。
redis預設會將快照檔案儲存體在目前的目錄下的dump.rdb檔案中,可以配置dir和dbfilename兩個參數分別之間檔案路徑和檔案名稱。
如:
dir c:\gyc
dbfilename dump.rdb
註:通過RDB方式持久化redis,一旦redis異常退出,那麼都會丟失最後一次快照後的所有更改的資料。如果不能接受丟失的這些資料,建議使用AOF方式持久化資料。 二. AOF(append only file)方式
當使用redis來儲存非臨時資料時,需要開啟AOF方式持久化。AOF將redis執行的每一條命令追加到磁碟中,這樣會降低redis的效能,不夠還是可以接受的。 2.1. 開啟AOF方式
預設情況redis沒有開啟AOF方式,可以通過appendonly命令來啟用,如:
appendonly yes
可以指定隱藏檔路徑,如:
dir c:\redis_aof
appendfilename appendonly.aof
2.2. 同步到磁碟中
雖然每次操作,redis都會把命令寫到AOF檔案中,但是由於作業系統緩衝機制,這時並沒有把所有資料真正寫到磁碟中,而是進入到硬碟緩衝。一般情況下,系統會每隔30秒做一次把硬碟緩衝中資料寫入磁碟中。
可以通過以下命令,執行:
# appendfsync always
# appendfsync no
appendfsync everysec
第一條命令是,每次執行寫入,都會執行同步,最安全也最慢;
第二條命令是,不主動執行同步,而是由系統自動執行,也就是30秒執行,不建議,有可能會丟失30秒的資料;
第三條命令是,每秒執行一次,redis預設執行此種;
redis支援同時開啟RDB和AOF,系統重啟後,redis會使用AOF來恢複資料。這樣丟失的資料會最少。