[TOC]
持久化 、 RDB 快照存儲、 AOF 只追加文件
- redis可以將數(shù)據(jù)寫入到磁盤中,在停機或宕機后,再次啟動redis時,將磁盤中的備份數(shù)據(jù)加載到內(nèi)存中恢復使用。這是redis的持久化。持久化有如下兩種機制。
RDB 快照存儲
redis可以將內(nèi)存中的數(shù)據(jù)寫入磁盤進行持久化。在進行持久化時,redis會創(chuàng)建子進程來執(zhí)行。
redis默認開啟了快照持久化機制。
-
機制:
- fork出一個
子進程,專門進行數(shù)據(jù)持久化, 將內(nèi)存中所有數(shù)據(jù)保存到單個rdb文件中(默認為dump.rdb) - redis重啟后, 會加載rdb文件中的數(shù)據(jù)到內(nèi)存中
- fork出一個
-
觸發(fā)方式
- 配置中設(shè)置
自動持久化策略 -
SAVE|BGSAVE|SHUTDOWN(前提是設(shè)置了自動持久化策略) - BGSAVE:執(zhí)行
BGSAVE命令,手動觸發(fā)RDB持久化 - SHUTDOWN:關(guān)閉redis時觸發(fā)
- 配置中設(shè)置
-
相關(guān)配置
save 60 1000 # 多久執(zhí)行一次自動快照操作 60秒內(nèi)如果更新了1000次, 則持久化一次 stop-writes-on-bgsave-error no # 創(chuàng)建快照失敗后,是否繼續(xù)執(zhí)行寫命令 rdbcompression yes # 是否對快照文件進行壓縮 dbfilename dump.rdb # 如何命名快照文件 dir ./ # 快照文件保存的位置 save # 關(guān)閉RDB機制 -
優(yōu)點:
- 方便數(shù)據(jù)備份
: 由于保存到單獨的文件`中, 易于數(shù)據(jù)備份 (可以使用定時任務(wù), 定時將文件發(fā)送給數(shù)據(jù)備份中心) - 寫時復制`: 子進程單獨完成持久化操作, 父進程不參與IO操作, 最大化redis性能
- 恢復大量數(shù)據(jù)時, 速度優(yōu)于 AOF
- 方便數(shù)據(jù)備份
-
缺點:
- 不是實時保存數(shù)據(jù)`, 如果redis意外停止工作(如電源斷電等), 則可能會丟失一段時間的數(shù)據(jù)
- 數(shù)據(jù)量大時, fork進程會比較慢, 持久化時使redis響應(yīng)速度變慢
AOF 只追加文件
redis可以將執(zhí)行的所有指令追加記錄到文件中持久化存儲,這是redis的另一種持久化機制。
redis默認未開啟AOF機制。
-
Append-only file 只追加文件
- 只追加
而 不是全部重新寫入 -
追加命令, 而不是數(shù)據(jù)
- 只追加
-
機制
- 主線程將
寫命令追加到aof_buf(緩沖區(qū))中, 根據(jù)使用的策略不同,子線程將緩存區(qū)的命令寫入到aof文件中 (不使用子進程) - 當redis重啟時, 會重新執(zhí)行aof文件中的命令來恢復數(shù)據(jù)
- 如果同時開啟了 RDB, 則優(yōu)先使用 AOF
- 主線程將
-
文件修復
如果AOF出錯 (磁盤滿了/寫入中途宕機等), 則redis重啟時會拒絕使用該AOF文件
-
修復步驟
- 首先備份AOF文件
- 使用redis-check-aof工具進行修復 (一般會刪除末尾無法恢復的命令)
- 重啟redis服務(wù)器, 自動載入修復后的AOF文件, 進行數(shù)據(jù)恢復
-
文件重寫/壓縮
- AOF 提供了重寫/壓縮機制(優(yōu)化命令), 以避免AOF文件過大
- fork子進程來完成 AOF 重寫
-
相關(guān)配置
appendonly no # 是否開啟AOF機制 appendfsync everysec # 多久將寫入的內(nèi)容同步到硬盤 每秒一次 no-appendfsync-on-rewirete no # 重寫aof文件時是否執(zhí)行同步操作 auto-aof-rewrite-percentage 100 # 多久執(zhí)行一次aof重寫, 當aof文件的體積比上一次重寫后的aof文件大了一倍時 auto-aof-rewrite-min-size 64mb # 多久執(zhí)行一次aof重寫,當aof文件體積大于64mb時 appendfilename appendonly.aof # aof文件名 dir ./ # aof文件保存的位置(和rdb文件共享該配置) AOF機制記錄操作的時機 # appendfsync always # 每個操作都寫到磁盤中 appendfsync everysec # 每秒寫一次磁盤,默認 # appendfsync no # 由操作系統(tǒng)決定寫入磁盤的時機 -
優(yōu)點
- 更可靠` 默認每秒同步一次操作, 最多丟失一秒數(shù)據(jù)
- 提供了三種策略, 還可以不同步/每次寫同步
- 可以進行
文件重寫, 以避免AOF文件過大
- 更可靠` 默認每秒同步一次操作, 最多丟失一秒數(shù)據(jù)
-
缺點:
- 相同數(shù)據(jù)集, AOF文件比RDB
體積大,恢復速度慢 - 除非是不同步情況, 否則普遍要比RDB `速度慢
- 相同數(shù)據(jù)集, AOF文件比RDB
如何選擇持久化
對于
更新頻繁, 一致性要求不是非常高的數(shù)據(jù)可以選擇使用redis進行持久化存儲-
RDB or AOF
- 數(shù)據(jù)安全性要求高, 都打開
- 可以接受短時間的數(shù)據(jù)丟失, 只使用 RDB
- 即使使用 AOF, 最好也開啟 RDB, 因為便于備份并且回復速度快, bug更少
-
項目中的應(yīng)用
-
使用redis進行一部分數(shù)據(jù)的持久化存儲
- 用戶的閱讀歷史/搜索歷史
-