redis持久化存儲支持兩種方式:RDB和AOF。RDB一定時間取存儲文件,AOF默認每秒去存儲歷史命令,官方建議兩種方式同時使用
沒有持久化的redis和memcache一樣,相當于一個純內存的數據庫
一、RDB(Redis DataBase)
RDB是將數據寫入一個臨時文件,持久化結束后,用這個臨時文件替換上次持久化的文件,達到數據恢復。
優(yōu)點:使用單獨子進程來進行持久化,主進程不會進行任何IO操作,保證了redis的高性能
缺點:RDB是間隔一段時間進行持久化,如果持久化之間redis發(fā)生故障,會發(fā)生數據丟失。所以這種方式更適合數據要求不嚴謹的時候
RDB默認開啟,redis.conf中的具體配置參數如下;
#dbfilename:持久化數據存儲在本地的文件
dbfilename dump.rdb
#dir:持久化數據存儲在本地的路徑,如果是在/redis/redis-3.0.6/src下啟動的redis-cli,則數據會存儲在當前src目錄下
dir ./
#save時間,以下分別表示更改了1個key時間隔900s進行持久化存儲;更改了10個key300s進行存儲;更改10000個key60s進行存儲。
save 900 1
save 300 10
save 60 10000
持久化過程:
當滿足save的條件時,比如更改了1個key,900s后會將數據寫入臨時文件,持久化完成后將臨時文件替換舊的dump.rdb。(存儲數據的節(jié)點是到觸發(fā)時間時的的節(jié)點)
使用RDB恢復數據:
自動的持久化數據存儲到dump.rdb后。實際只要重啟redis服務即可完成(啟動redis的server時會從dump.rdb中先同步數據)
使用命令進行持久化save存儲:
./redis-cli -h ip -p port save
./redis-cli -h ip -p port bgsave
一個是在前臺進行存儲,一個是在后臺進行存儲。我的client就在server這臺服務器上,所以不需要連其他機器,直接./redis-cli bgsave
二、AOF(AppendOnly File)
AOF是將執(zhí)行過的指令記錄下來,數據恢復時按照從前到后的順序再將指令執(zhí)行一遍,實現(xiàn)數據恢復
優(yōu)點:可以保持更高的數據完整性,如果設置追加file的時間是1s,如果redis發(fā)生故障,最多會丟失1s的數據;且如果日志寫入不完整支持redis-check-aof來進行日志修復;AOF文件沒被rewrite之前(文件過大時會對命令進行合并重寫),可以刪除其中的某些命令(比如誤操作的flushall)。
缺點:AOF文件比RDB文件大,且恢復速度慢。
AOF默認關閉,開啟方法,修改配置文件reds.conf:appendonly yes
其他相關配置項:
#AOF保存的文件名
appendfilename ""
以下為同步方式相關的配置:
#一旦插入命令,立即同步到磁盤,保證了完全的持久化,但是速度慢,不推薦
appendfsync always
#AOF每秒進行同步
appendfsync everysec
#不自動同步,性能最好,但是持久化沒有保證
appendfsync no
存儲過程:將快照內容以命令的形式追加到AOF文件中,所以隨著追加AOF文件會越來越大
保存的AOF文件存儲了執(zhí)行的所有命令,所以可以進行修改文件來撤銷輸錯的命令(在重寫之前,如果重寫了就沒有辦法了)
針對AOF文件越來越大的問題,可以對AOF文件進行重寫,命令如下:
redis-cli -h ip -p port bgrewriteaof
重寫命令的操作過程:在當前的快照保存工作結束后,開啟一個子進程,將AOF文件進行重寫,合并set命令等操作到一個臨時文件,達到縮小文件大小的目的。重寫結束后后將臨時文件替換為新的AOF文件(重寫過程中如果有新的redis操作命令,會提交到緩存中,重寫結束后追加到AOF文件內)
說明:redis2.4以上版本,重寫機制自動觸發(fā)。觸發(fā)的相關redis.conf配置如下:
auto-aof-rewrite-percentage 100(當目前的AOF文件大小超過上一次重寫文件大小的百分之幾時進行重寫,如果沒有重啟過,則以啟動時的AOF文件大小為依據);
auto-aof-rewrite-min-size 64mb(允許重寫的最小AOF文件大?。?;
數據恢復:
重啟redis服務,前提是配置文件必須設置了appendonly yes,然后會從appendfile的文件加載文件。反之是從RDB中加載數據的。
下面的博客是具體講redis啟動過程中的操作的,比較好,大家可以看一下:
引自上面這個博客的加載數據的過程:
加載數據:
根據配置的不同,Redis加載數據的源也不一樣,如果在配置文件里設置了appendonly yes(默認是no),那么就從appendfile加載數據,反之則從RedisDb加載數據
·從appendfile加載數據:我們先來看一下appendfile的內容是什么。下面的一條記錄摘取自appendfile:SET $9 olylakers $3 oly。很顯,appendfile保存的就是redis server接收到的各種命令,那么從appendfile加載數據就是redis server從appenfile里面讀取這些命令的記錄,然后重新把這些命令執(zhí)行一遍即可。需要注意的是,如果開啟了VM,那么在從appendfile加載數據的時候可能要涉及swap操作。
·從redisdb加載數據:如果沒有開啟appendonly,那么則需要從db file加載數據到內存,其過程是:
1.通過處理select命令,選擇DB
2.然后從db file讀取key和value
3.檢查key是否過期,如果過期則跳過這個key,如果不過期,則把數據Add到對應的db的dict中
4.如果開啟了VM,則從db file中l(wèi)oad數據,也可能涉及到swap操作