redis爲何操做速度快?常常被靈魂拷問。雖說僅僅回答一個內存操做會被嗤之以鼻,但不能否認的是內存的操做確定是redis速度快的一個主要緣由。內存操做數據安全確定沒有數據記錄到磁盤那麼高,redis針對內存中的數據提供了rdb、aof、rdb/aof混合的三種持久化方式redis
rdb持久化內容是某一時刻內存快照。將內存中某一時刻對象信息保存在二進制壓縮文件中數組
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
複製代碼
策略配置中提到了修改鍵數量,這個數量記錄在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;
};
複製代碼
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持久化內容是增量記錄redis寫操做的命令,當redis執行數據修改命令時都會將其記錄在aof文件中。內存中對象的恢復就能夠經過從新執行aof文件恢復操作系統
redis執行的命令在aof開啓後會記錄一份到aof緩衝區中,緩衝區依然位於內存。將緩衝區內容寫入磁盤就是aof持久化,該操做提供以下三個策略:code
# always 每次命令執行都會寫入磁盤
# everysec每秒執行一次aof持久化
# no 持久化操做交給操做系統決定是否執行
# appendfsync always
appendfsync everysec
# appendfsync no
複製代碼
redis.conf文件中針對aof持久化提供了很多配置參數,以下所示:server
# aof默認不開啓,打開須要修改如下參數爲yes
appendonly yes
# aof文件名稱
appendfilename "appendonly.aof"
# aof持久化策略
# appendfsync always
appendfsync everysec
# appendfsync no
複製代碼
aof持久化很大的缺點就是持久化文件大,好比當一個key寫入、刪除後aof文件中會記錄兩條命令,確定的這兩條命令是無效的。爲了解決aof持久化文件膨脹問題,redis中提出aof重寫即bgrewriteaof對象
redis.conf文件中提供對應策略實現:
# 參數100表示當前aof文件超過上次aof重寫後aof文件的2倍
auto-aof-rewrite-percentage 100
# aof文件超過64M進行重寫
auto-aof-rewrite-min-size 64mb
複製代碼
rdb和aof持久化策略對比有如下各自特色:
持久化策略 | 保存數據樣式 | 載入速度 | 文件大小與一致 | 適用場景 |
---|---|---|---|---|
RDB | 二進制數據 | 快,直接解析二進制數據 | 相對於AOF文件較小,可是數據一致性偏差可能較大 | 作冷數據長期備份 |
AOF | 文本協議命令 | 慢,依靠僞客戶端執行命令 | 文件隨時間臃腫,依靠BGREWRITEAOF瘦身,數據差距就在1s左右的命令 | 數據完整性高適合作平常持久化維護 |
redis4.0版本中提出了混合持久化的策略,即結合rdb和aof一塊兒作redis的持久化。這樣就能夠吸收兩種持久化策略的優勢。實現方式也比較簡單,就是在執行aof重寫時先作一次rdb快照存儲到aof中,而後增量的命令使用命令的方式寫入aof。打開混合持久化策略參數以下:
aof-use-rdb-preamble yes
複製代碼