問:Redis如何作持久化redis
AOF (Append-Only-File) 持久化:保持寫狀態數據庫
- 記錄下除了查詢之外的全部變動數據庫狀態的指令
- 以append的形式追加保存到aof文件中
默認redis.conf 是關閉的app
always 老是寫 操作系統
everysec 每秒寫一次(最經常使用)3d
no 將寫入操做交給操做系統決定,操做系統通常等到緩衝區滿了才寫入磁盤日誌
ps:保存配置 重啓生效blog
問:日誌重寫解決AOF文件大小不斷增大的問題?進程
原理以下:內存
- 調用fork(),建立一個子進程
- 子進程把新的AOF寫到一個臨時文件裏,不依賴原來的AOF文件
- 主進程持續將新的變更同時寫到內存和原來的AOF裏
- 主進程獲取子進程重寫AOF的完成信號,往新AOF同步增量變更
- 使用新的AOF文件替換掉舊的AOF文件
重寫也能夠手動觸發(和bgsave同樣)使用bgrewrite 指令同步
RDB和AOF文件共存狀況下的恢復流程:
RDB和AOF的優缺點:
- RDB優勢:全量數據快照(二進制文件),文件小,恢復快
- RDB缺點:沒法保存最近一次快照以後的增量數據
- AOF優勢:可讀性高,適合保存增量數據,數據不易丟失(刷盤是由appendfsync控制)
- AOF缺點:文件體積大,恢復時間長(人類可讀的文本體積大,重啓時指令回放,使用rewirte防止磁盤空間被撐滿)
RDB-AOF混合持久化模式(redis 4.0以後支持,默認配置)
- bgsave作鏡像全量持久化,AOF作增量持久化(bgsave的時候耗時較長,不夠實時,在停機的時候會致使大量丟失數據,因此須要aof來配合使用。在redis實例重啓時,優先使用aof來恢復內存的狀態,若是沒有aof日誌,就會使用rdb文件來恢復)