Redis(三) -- 淺談RDB與AOF持久化

一:摘要概述

redis爲何操做速度快?常常被靈魂拷問。雖說僅僅回答一個內存操做會被嗤之以鼻,但不能否認的是內存的操做確定是redis速度快的一個主要緣由。內存操做數據安全確定沒有數據記錄到磁盤那麼高,redis針對內存中的數據提供了rdb、aof、rdb/aof混合的三種持久化方式redis

二:RDB持久化

2.1 持久化內容

rdb持久化內容是某一時刻內存快照。將內存中某一時刻對象信息保存在二進制壓縮文件中數組

2.2 持久化命令

  • save:阻塞主進程
  • bgsave:不阻塞主進程,經過fork子進程方式進行

2.3 持久化策略

redis.conf配置文件218行開始默認提供三個以下策略,知足一個條件就會進行rdb安全

# 知足下面任何一個條件執行bgsave命令
# 第一個參數表示時間,單位s
# 第二個參數表示修改鍵數量 
# 當60s內修改1000個鍵就進行發起bgsave命令執行rdb持久化
# 當300s內修改10個鍵就進行發起bgsave命令執行rdb持久化
# 當900s內修改1個鍵就進行發起bgsave命令執行rdb持久化
save 900 1
save 300 10
save 60 10000
複製代碼

2.4 持久化源碼

策略配置中提到了修改鍵數量,這個數量記錄在redis安裝文件src源碼目錄中的server.h。文件中描述了redisServer結構對象,該結構對象中存在屬性dirty描述了redis中距離上次rdb操做後修改的鍵數量。位置1098行bash

long long dirty;                /* Changes to DB from the last save */
複製代碼

rdb配置的全部策略都會建立爲一個數組,每一個策略就是一個數組元素。該數組在redisServer中使用saveparam維護,1101行。redis默認策略每過100ms就會輪訓檢查數組中的策略判斷是否執行bgsave。數組元素對象以下所示:app

# seconds 配置的秒數
# changes 配置的修改鍵數量
struct saveparam {
    time_t seconds;
    int changes;
};
複製代碼

2.5 配置參數

redis.conf文件中針對rdb持久化提供了很多配置參數,以下所示:spa

# bgsave策略
save 900 1
save 300 10
save 60 10000
# 當rdb持久化失敗時拒絕寫操做
stop-writes-on-bgsave-error yes
# rdb文件壓縮開啓
rdbcompression yes
# rdb文件損壞校驗
rdbchecksum yes
# rdb文件名稱
dbfilename dump.rdb
# rdb文件目錄位置
dir ./
複製代碼

三:AOF持久化

3.1 持久化內容

aof持久化內容是增量記錄redis寫操做的命令,當redis執行數據修改命令時都會將其記錄在aof文件中。內存中對象的恢復就能夠經過從新執行aof文件恢復操作系統

3.2 持久化策略

redis執行的命令在aof開啓後會記錄一份到aof緩衝區中,緩衝區依然位於內存。將緩衝區內容寫入磁盤就是aof持久化,該操做提供以下三個策略:code

# always 每次命令執行都會寫入磁盤 
# everysec每秒執行一次aof持久化
# no 持久化操做交給操做系統決定是否執行

# appendfsync always
appendfsync everysec
# appendfsync no
複製代碼

3.3 配置參數

redis.conf文件中針對aof持久化提供了很多配置參數,以下所示:server

# aof默認不開啓,打開須要修改如下參數爲yes
appendonly yes
# aof文件名稱
appendfilename "appendonly.aof"
# aof持久化策略
# appendfsync always
appendfsync everysec
# appendfsync no
複製代碼

四:AOF重寫

aof持久化很大的缺點就是持久化文件大,好比當一個key寫入、刪除後aof文件中會記錄兩條命令,確定的這兩條命令是無效的。爲了解決aof持久化文件膨脹問題,redis中提出aof重寫即bgrewriteaof對象

4.1 重寫操做

  • 根據redis當前內存快照對象記錄命令到新aof文件中,注意aof重寫根本不會根據原有aof文件作操做
  • 重寫期間執行的寫操做命令會記錄到重寫緩衝區,快照重寫完成後會記錄到新aof文件中
  • 重寫操做fork子進程進行,不會形成主進程阻塞
  • 重寫阻塞僅僅發生在重寫完成後通知主進程原子替換原有aof文件

4.2 重寫策略

redis.conf文件中提供對應策略實現:

# 參數100表示當前aof文件超過上次aof重寫後aof文件的2倍
auto-aof-rewrite-percentage 100

# aof文件超過64M進行重寫
auto-aof-rewrite-min-size 64mb
複製代碼

五:混合持久化

5.1 rdb/aof對比

rdb和aof持久化策略對比有如下各自特色:

持久化策略 保存數據樣式 載入速度 文件大小與一致 適用場景
RDB 二進制數據 快,直接解析二進制數據 相對於AOF文件較小,可是數據一致性偏差可能較大 作冷數據長期備份
AOF 文本協議命令 慢,依靠僞客戶端執行命令 文件隨時間臃腫,依靠BGREWRITEAOF瘦身,數據差距就在1s左右的命令 數據完整性高適合作平常持久化維護

5.2 混合持久實現

redis4.0版本中提出了混合持久化的策略,即結合rdb和aof一塊兒作redis的持久化。這樣就能夠吸收兩種持久化策略的優勢。實現方式也比較簡單,就是在執行aof重寫時先作一次rdb快照存儲到aof中,而後增量的命令使用命令的方式寫入aof。打開混合持久化策略參數以下:

aof-use-rdb-preamble yes
複製代碼
相關文章
相關標籤/搜索