咱們知道,redis是基於內存的,也就是說數據在內存中,這也是爲何redis這麼快的緣由之一。可是當redis重啓了,內存中的數據就會丟失。因此,redis就有持久化的機制。它提供兩種方式的持久化:redis
前者根據指定的規則‘定時’將內存中的數據存儲在硬盤中。後者在每次執行寫命令後將命令自己記錄下來。app
當符合必定的條件的時候,redis會自動將內存中的全部數據生成一個副本並存儲在硬盤上。這個過程被稱爲‘快照’。異步
在配置文件redis.conf中, 配置save以下例:函數
save 900 1
save 300 10
save 60 10000性能
意思是:900s內,至少有一個key被更改則進行異步快照;300s內至少有10個key被更改;60s內至少有10000個key。優化
SAVE命令,使redis同步進行快照,會阻塞來自客戶端的請求。不推薦操作系統
BGSAVE命令,在後臺異步進行快照,能夠相應客戶端請求。執行BGSAVE會馬上返回ok,表示開始執行快照操做,若是想要知道快照是否完成,經過LASTSAVE命令,獲取最近一次成功執行快照的時間,返回unix時間戳。unix
redis默認會將快照文件存儲在redis工做目錄的dump.rdb文件中。過程以下:進程
注意: 當fork函數發生的一刻,父子進程共享同一內存數據,當父進程要更改其中某片數據時,操做系統會將該片數據複製一份,以保持子進程的數據不受影響,因此新的rdb文件存儲的是fork一刻的內存數據。內存
rdb文件是通過壓縮的二進制格式。
以上,能夠看到這種方式的持久化明顯存在缺陷。當redis異常退出,就會丟失最後一次快照之後的更改。若是數據相對重要,就要使用AOF方式了。
這種方式將全部的寫命令追加到硬盤文件中,這個過程會下降redis的性能,可是大部分狀況下這個影響是能夠接受的,另外使用較快的硬盤能夠提升AOF的性能。
默認狀況redis是沒有開啓AOF的,能夠經過appendonly參數啓用:
appendonly yes
aof文件和rdb文件的位置相同,默認文件名是appendonly.aof,能夠經過appendfilename參數修改:
appendfilename XXX.aof
好比咱們有兩條寫命令:
set foo 1
set foo 2
set foo 3
明顯,前面兩條都是沒用的。這時候咱們但願優化aof文件。
能夠在配置文件redis.conf裏面配置:
auto-aof-rewrite-percentage 100
aotu-aof-rewrite-min-size 64mb
auto-aof-rewrite-percentage意思是當目前的aof文件大小超過上次重寫時的aof文件大小的百分之多少時,會再次自動重寫,若是以前沒有重寫過,則以啓動時的aof文件大小爲依據。
aotu-aof-rewrite-min-size限制了容許自動重寫的最小aof文件大小,一般在aof文件過小的時候咱們並不關心。
此外還能夠手動重寫:
BGREWRITEAOF
重寫的過程只和內存中的數據有關,和舊的aof文件無關。