Redis的讀寫和響應速度爲何如此之快?不一樣於傳統的關係型數據庫,Redis的數據庫是所有加載在實時內存中的,讀寫操做可以直接在內存中進行,省去了大量IO操做,所以性能很是優越。但一切依託於內存的服務都有個最大的軟肋,那即是在設備出現故障(如斷點)時,內存中全部的實時數據都將會丟失。爲了解決這個問題,Redis中提供了兩種持久化方案:RDB和AOF,其機制實際上都是設法將內存中的數據以文件的形式備份到磁盤上,從而解決斷電等機器故障致使數據丟失的問題。redis
實現機制:Redis會單首創建(fork)一個子進程來進行持久化,會先將數據寫入到一個臨時文件中,待持久化過程結束後,再用這個臨時文件替換上次持久化好的文件(dump.rdb)。整個過程當中,主進程不會進行任何IO操做的,這樣就可以保證Redis主進程持續的高性能。在恢復數據時,重啓後會Redis會自動加載工做目錄下的dump.rdb文件恢復數據到內存算法
相關參數:數據庫
## 設置觸發RDB dump的條件,在<seconds>時間至少發生了<changes>次數據的操做,則<seconds>時間到了就將數據寫到磁盤中,爲dump.rdb Redis默認設置了三個條件,知足之一便可觸發。移除全部條件或者設置 save 後加空字符串爲禁用RDB功能 save <seconds> <changes> save 900 1 ## for 低頻寫入 save 300 10 ## for 中頻寫入 save 60 10000 ## for 高頻寫入 ## 設置當RDB進程出現故障時,Redis是否中止寫操做,默認爲yes stop-writes-on-bgsave-error yes ## 設置RDB時是否使用LZF壓縮算法對dump.rdb文件進行壓縮,默認yes rdbcompression yes ## 設置是否對dump.rdb文件進行校驗,默認CRC64校驗算法,會消耗RDB進程的CPU資源的10%,默認開 rdbchecksum yes ## 設置輸出文件名, 默認dump.rdb dbfilename dump.rdb ## 設置dump.rdb文件輸出路徑,默認爲當前啓動工做目錄 dir ./
優點:安全
劣勢:app
PLUS:爲何最後一次持久化的數據可能丟失?異步
RDB經過設置save <seconds> <changes>條件來觸發dump,其機制爲知足任一save條件後再該條件的<seconds>後進行刷寫,但實際上可能最後一次dump時雖然達到修改次數<changes>要求,但在時間還未到達時redis進程停止,則這一階段的數據就丟失了。 好比save 300 10這一條件,Redis在300s內的修改操做次數超過了10次,所以觸發持久化條件,系統將會在300s到期後進行刷寫,可是可能在到期前幾秒,設備異常關機,那麼這300s內產生的數據修改信息將會所有丟失
實現機制:與RDB直接寫原數據不一樣,AOF記錄的是Redis自啓動期間全部的寫操做,相似於日誌,且寫入的方式只容許在末尾追加,不容許修改以前寫入的內容,默認保存爲appendonly.aof文件。恢復數據時,Redis將AOF加載到內存並執行其中的每一條數據進行數據的恢復。性能
相關參數:優化
## 啓動開關 -- 默認關閉 appendonly no ## 文件名 appendfilename "appendonly.aof" ## 刷寫頻率 appendfsync always ## 同步持久化,每當有數據變動就當即記錄到磁盤,性能較差但數據完整性好 appendfsync everysec ## 出廠默認配置,異步操做,每秒記錄,若是一秒內宕機,則會有數據丟失 append no ## 不設置刷寫頻率,當Redis本身觸發刷寫條件時才進行刷寫
優點:線程
劣勢:日誌
Rewrite機制:爲解決appendonly.aof文件會愈來愈大的隱患,AOF設置了Rewrite機制,默認當appendonly.aof文件大小達到了上次Rewrite後appendonly.aof文件的大小時而且文件的大小超過64M,AOF將會啓動Rewrite,fork出一條新進程建立一個臨時文件,而後遍歷整個數據庫,將每一個key、value對以Redis命令的格式輸出到臨時文件。這一過程會將多個鍵值對集合起來用一條命令表達以減少最終文件的大小。在rewrite期間的寫操做會保存在內存的rewrite buffer中,rewrite成功後這些操做也會append到臨時文件中,rewrite完成後該臨時文件便會代替appendonly.aof文件
## 觸發Rewrite條件 -- and -- auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb ## 發生重寫時是否支持appendfsync刷寫? 默認爲no,保證數據安全 no-appendfsync-on-rewrite no
使用場景:
共存性:
官方雖然默認關閉AOF功能,但實質上RDB和AOF是能夠共存的,當Redis同時開啓了AOF和RDB持久化,Redis重啓時會優先讀取AOF文件進行數據恢復,由於AOF比RDB更能保證數據完整性。此外,因爲Redis數據的恢復須要讀取AOF文件或者RDB文件,所以,爲了防止這兩個文件出現損毀或者被惡意修改,Redis提供了兩個修復腳本專門修復這兩個文件
## 修復AOF文件 redis-check-aof --fix appendonly.aof ## 修復RDB文件 redis-check-dump --fix dump.rdb
安全性拓展:
實際生產時,不管是AOF仍是RDB,都須要將生成的appendonly.aof和dump.rdb文件進行異地備份,這樣才能避免單機完全損壞形成的數據不可恢復問題