持久化分爲兩種方式:RDB和AOFredis
1.1 RDB模式數據庫
RDB方式的持久化是經過快照(snapshotting)完成的,當符合必定條件時Redis會自動將內存中的全部數據進行快照並存儲在硬盤上。進行快照的條件能夠由用戶在配置文件中自定義,由兩個參數構成:時間和改動的鍵的個數。當在指定的時間內被更改的鍵的個數大於指定的數值時就會進行快照。RDB是Redis默認採用的持久化方式,在配置文件中已經預置了3個條件:緩存
save 900 1 # 900秒內有至少1個鍵被更改則進行快照
save 300 10 # 300秒內有至少10個鍵被更改則進行快照 save 60 10000 # 60秒內有至少10000個鍵被更改則進行快照
能夠存在多個條件,條件之間是「或」的關係,只要知足其中一個條件,就會進行快照。 若是想要禁用自動快照,只須要將全部的save參數刪除便可。安全
Redis默認會將快照文件存儲在當前目錄(可CONFIG GET dir來查看)的dump.rdb文件中,能夠經過配置dir和dbfilename兩個參數分別指定快照文件的存儲路徑和文件名。bash
Redis實現快照的過程服務器
在執行fork的時候操做系統(類Unix操做系統)會使用寫時複製(copy-on-write)策略,即fork函數發生的一刻父子進程共享同一內存數據,當父進程要更改其中某片數據時(如執行一個寫命令 ),操做系統會將該片數據複製一份以保證子進程的數據不受影響,因此新的RDB文件存儲的是執行fork一刻的內存數據。app
Redis在進行快照的過程當中不會修改RDB文件,只有快照結束後纔會將舊的文件替換成新的,也就是說任什麼時候候RDB文件都是完整的。這使得咱們能夠經過定時備份RDB文件來實 現Redis數據庫備份。RDB文件是通過壓縮(能夠配置rdbcompression參數以禁用壓縮節省CPU佔用)的二進制格式,因此佔用的空間會小於內存中的數據大小,更加利於傳輸。函數
除了自動快照,還能夠手動發送SAVE或BGSAVE命令讓Redis執行快照,兩個命令的區別在於,前者是由主進程進行快照操做,會阻塞住其餘請求,後者會經過fork子進程進行快照操做。 Redis啓動後會讀取RDB快照文件,將數據從硬盤載入到內存。根據數據量大小與結構和服務器性能不一樣,這個時間也不一樣。一般將一個記錄一千萬個字符串類型鍵、大小爲1GB的快照文件載入到內 存中須要花費20~30秒鐘。 經過RDB方式實現持久化,一旦Redis異常退出,就會丟失最後一次快照之後更改的全部數據。這就須要開發者根據具體的應用場合,經過組合設置自動快照條件的方式來將可能發生的數據損失控制在可以接受的範圍。若是數據很重要以致於沒法承受任何損失,則能夠考慮使用AOF方式進行持久化。性能
redis Save 命令基本語法以下:spa
redis 127.0.0.1:6379> SAVE
redis 127.0.0.1:6379> SAVE OK
該命令將在 redis 安裝目錄中建立dump.rdb文件。
若是須要恢復數據,只需將備份文件 (dump.rdb) 移動到 redis 安裝目錄並啓動服務便可。獲取 redis 目錄可使用 CONFIG 命令,以下所示:
redis 127.0.0.1:6379> CONFIG GET dir 1) "dir" 2) "/usr/local/redis/bin"
以上命令 CONFIG GET dir 輸出的 redis 安裝目錄爲 /usr/local/redis/bin。
2.AOF
AOF方式
默認狀況下Redis沒有開啓AOF(append only file)方式的持久化,能夠在redis.conf中經過appendonly參數開啓:
appendonly yes
在啓動時Redis會逐個執行AOF文件中的命令來將硬盤中的數據載入到內存中,載入的速度相較RDB會慢一些
開啓AOF持久化後每執行一條會更改Redis中的數據的命令,Redis就會將該命令寫入硬盤中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是經過dir參數設置的,默認的文件名是appendonly.aof,能夠經過appendfilename參數修改:
appendfilename appendonly.aof
配置redis自動重寫AOF文件的條件
auto-aof-rewrite-percentage 100 # 當目前的AOF文件大小超過上一次重寫時的AOF文件大小的百分之多少時會再次進行重寫,若是以前沒有重寫過,則以啓動時的AOF文件大小爲依據
auto-aof-rewrite-min-size 64mb # 容許重寫的最小AOF文件大小
配置寫入AOF文件後,要求系統刷新硬盤緩存的機制
# appendfsync always # 每次執行寫入都會執行同步,最安全也最慢
appendfsync everysec # 每秒執行一次同步操做 # appendfsync no # 不主動進行同步操做,而是徹底交由操做系統來作(即每30秒一次),最快也最不安全
Redis容許同時開啓AOF和RDB,既保證了數據安全又使得進行備份等操做十分容易。此時從新啓動Redis後Redis會使用AOF文件來恢復數據,由於AOF方式的持久化可能丟失的數據更少