什麼是持久化?簡單來說就是將數據放到斷電後數據不會丟失的設備中,也就是咱們一般理解的硬盤上。緩存
首先咱們來看一下數據庫在進行寫操做時到底作了哪些事,主要有下面五個過程:安全
Redis持久化方式分爲RDB和AOF。bash
RDB(Redis DataBase)持久化是在指定的時間間隔內將內存中的數據集快照寫入磁盤。同時也是默認的持久化方式。服務器
save m n # 表示m秒內數據集存在n次修改時,自動觸發bgsave
例如,如下能夠同時配置:app
# 900秒內執行1次更新 save 900 1 # 300秒內執行10次更新 save 300 10 # 60秒內執行10000次更新 save 60 10000
# 指定本地數據庫文件名,通常採用默認的dump.rdb dbfilename dump.rdb # 備份文件存放目錄,通常也用默認配置 dir ./
配置存儲至本地數據庫時是否壓縮數據,默認爲yes
。Redis採用LZF壓縮方式,但佔用了一點CPU的時間。若關閉該選項,但會致使數據庫文件變的巨大。建議開啓。性能
rdbcompression yes
AOF(Append only file)持久化是以獨立日誌的方式記錄每次命令,重啓時再從新執行AOF文件中的命令達到恢復數據的目的。操作系統
AOF的主要做用是解決了數據持久化的實時性。線程
AOF直接採用文本協議格式(兼容性好),開啓AOF後,全部寫入命令都包含追加操做,直接採用文本協議格式,避免了二次處理開銷。3d
AOF的工做流程操做:命令寫入(append)、文件同步(sync)、文件重寫(rewrite)、重啓加載(load)。
流程以下:
默認不開啓,啓用AOF持久化方式
appendonly yes # AOF文件名稱 appendfilename "appendonly.aof" # 備份文件存放路徑,同RDB dir ./ # 同步頻率 appendfsync everysec
appendfsync同步頻率配置參考:
aof_buf
後調用fsync
操做同步到AOF文件,fsync
完成後線程返回,每一個 Redis 命令都要同步寫入硬盤,這樣會嚴重下降 Redis 的性能。aof_buf
後調用系統write
操做,write
完成後線程返回。fsync
同步文件操做由專門線程每秒調用一次。每秒執行一次同步,顯式地將多個寫命令同步到硬盤。aof_buf
後調用系統write
操做,不對AOF文件作fsync
同步,同步硬盤操做由操做系統負責,一般週期周長30秒。操做系統同步AOF文件的週期不可控,會加大每次同步硬盤的數據量,數據安全性沒法保證。隨着命令不斷寫入AOF,文件會愈來愈大,爲了解決這個問題,Redis引入AOF重寫機制壓縮文件體積。AOF文件重寫是把Redis進程內的數據轉化爲寫命令同步到新AOF文件的過程。
重寫後的AOF文件爲何能夠變小?有以下緣由:
del key1
、hdel key2
、srem keys
、set a1111
、set a222
等。重寫使用進程內數據直接生成,這樣新的AOF文件只保留最終的數據寫入命令。lpuh list a
、lpush list b
、lpush list c
能夠轉化爲:lpush list a b c
。爲了防止單條命令過大形成客戶端緩衝區溢出,對於list
、set
、hash
、zset
等類型操做,以64個元素爲界拆分爲多條。AOF重寫不只下降了文件佔用空間,並且更小的AOF文件能夠更快地被Redis加載。
觸發方式:
bgrewriteaof
命令;auto-aof-rewrite-min-size:表示運行AOF重寫時文件最小體積,默認爲64MB。 auto-aof-rewrite-percentage:表明當前AOF文件空間(aof_current_size)和上一次重寫後AOF文件空間(aof_base_size)的比值。 自動觸發時機=aof_current_size>auto-aof-rewrite-minsize&&(aof_current_size-aof_base_size) /aof_base_size>=auto-aof-rewritepercentage
流程說明:
日誌:
* DB loaded from append only file: 5.841 seconds
* DB loaded from disk: 5.586 seconds
因爲RDB持久化和AOF持久化都有各自的優缺點,所以在很長一段時間裏,如何選擇合適的持久化方式成了不少Redis用戶面臨的一個難題。爲了解決這個問題,Redis從4.0版本開始引入RDB-AOF混合持久化模式,這種模式是基於AOF持久化模式構建而來的。