一,Redis是一款基於內存的數據庫,可以持久化,在企業中常用於緩存,相信大家都比較熟悉Redis了,下面主要分享下關於Redis持久化的兩種模式
1、半持久化模式(RDB,filesnapshotting)
此模式是Redis默認的備份方式,通過快照方式,將數據從內存寫入磁盤中,如果Redis異常退出,下次啟動則從打快照的這個時間節點來恢復此之前的數據,根據數據量大小、結構、服務器性能不同,通常將記錄1千萬個string類主鍵、大小為1GB的快照文件載入內存中需要20~30s
觸發快照參數在配置文件中已預設置:
save 900 1 :900s內至少1個主鍵被更改則進行快照
save 300 10 :300s內至少10個主鍵被更改則進行快照
save 60 10000 :60s內至少10000個主鍵被更改則進行快照
Redis實現快照的過程:當觸發快照功能時,Redis的主進程會fork出一個子進程,子進程來將數據從內存中存入磁盤中,默認存放的文件名為dump.rdb,存放路徑在Redis數據目錄下,這些配置可以在redis.conf中調整;此時的rdb文件會覆蓋之前的rdb文件。在父進程fork出子進程時,它們共享內存中的數據,當父進程接受命令請求要修改某片數據時,為了使子進程數據不受影響,這時Redis會有一種策略,就是寫時復制(copy-on-write),原理是:在父進程要改動某片數據時,操作系統會把此片數據先copy一份給子進程,以保證子進程的內存數據不受影響,所以新的rdb文件就是父進程fork子進程時那一刻的內存數據。dump.rdb文件可以進行壓縮(rdbcompression),節省占用空間、方便傳輸,也可以禁用壓縮節省cpu工作負載。除了自動執行快照,還可以通過手動save和bgsave來執行快照,兩者區別是,save是由主進程來進行快照操作,會阻塞其它請求,bgsave是通過fork子進程來操作。
通過RDB方式實現持久化,一旦Redis異常退出,就會丟失最后一次快照以后更改的所有數據,此時需要開發者根據具體的應用場合,通過組合設置自動快照條件的方式來將可能發生的數據損失控制在能接受的范圍內。
2,全持久化模式(AOF, append-only)
此模式需要手動修改配置文件的appendonly參數,默認為no,需要改為yes
如果數據很重要無法承受損失,則使用此模式,默認Redis沒有開啟AOF方式的全持久化模式,在啟動時Redis會逐個執行AOF文件中的命令來將硬盤中的數據載入到內存中,載入的速度較RDB模式會慢一些,開啟AOF持久化后每執行一條會更改Redis數據的命令,Redis就會將該命令寫入硬盤中的AOF文件,默認文件名為appendonly.aof,位置可通過appendfilename參數設置。
需要注意的是,Redis可以同時開啟兩種模式,既保證了數據安全性又保證了速度及操作十分容易,此時重啟Redis會使用AOF文件來恢復數據,可以設置此下參數來開啟AOF模式
appendonly yes 開啟AOF模式
appendfilename appendonly.aof 文件名稱
auto-aof-rewrite-percentage 100 當AOF文件大小超過上一次重寫時的AOF文件大小的百分之多少時會再次進場重寫,如果沒有超過,則以啟動時的AOF文件大小為依據
auto-aof-rewrite-min-size 64MB 允許重寫的最小AOF文件大小配置寫入AOF文件后,要求系統刷新硬盤緩存的機制
appendfsync always 每次執行寫入操作都會執行同步,最安全也最慢
#appendfsync everysec 每秒執行一次同步操作
#appendfsync no 不主動進行同步操作,而是完全交由系統來操作,每30s一次,最快但不安全