Skip to content

Redis persistence Explanation - RDB and AOF

RDB

redis.conf 中配置,x秒内大于y次修改自动bgsave

save x y

manually trigger

# block the whole process
save
# block fork and non-block the rest
bgsave
# 最后一次生成RDB的时间戳
lastsave

auto trigger

  1. 触发 RDB 生成配置
  2. 全量复制
  3. debug reload 重新加载
  4. 未开启 AOF 时,执行 shutdown

generate RDB process

  1. 判断是否有正在执行的子进程
  2. 父进程fork创建子进程 (20ms/GB)
  3. 子进程创建 RDB 文件,根据父进程内存生成快照,并替换原 RDB 文件
  4. 子进程发送信号给父进程,更新 info persistence
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1631974350
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:0

Ops command

# 修改 RDB 文件目录
config set dir
# 修改 RDB 文件名
config set dbfilename
# RDB 是否压缩,默认 yes
config set rdbcompression yes|no
# 检查 RDB 文件错误
redis-check-dump

AOF

redis.conf 中配置

# 开启
appendonly yes
# 刷盘频率,默认 everysec
appendfsync everysec|no|always

generate AOF process

  1. 所有写命令追加到 aof_buf
  2. AOF 缓冲区根据策略刷盘
  3. 启动Redis时加载

AOF rewrite

# 手动触发
bgrewriteaof
# 配置触发
## 增长百分比 
auto-aof-rewrite-percentage 100
## 默认64M
auto-aof-rewrite-min-size 67108864
## 批量写盘控制,默认为yes,一次写入32MB
aof-rewrite-incremental-fsync yes|no
## 是否禁止AOF重写期间fsync,默认no
no-appendfsync-on-rewrite no|yes

AOF rewrite process

  1. 判断是否有正在执行的子进程
  2. 父进程fork创建子进程,然后继续响应请求,并将写请求保存到AOF重写缓冲区
  3. 子进程根据内存快照,合并写请求到新的 AOF 文件
  4. 子进程发信号给父进程更新 info persistence
  5. 父进程把AOF重写缓冲区数据写入新的 AOF 文件
  6. 使用新的 AOF 文件替换原有 AOF 文件
aof_enabled:1
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:0
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:311296

fix broken aof

修复损坏aof
redis-check-aof --fix appendonly.aof

Load order

  1. AOF 开启且存在 AOF 文件时,加载 AOF 后启动
  2. AOF 开启且不存在 AOF 文件时,加载 RDB 后启动
  3. AOF 未开启,加载 RDB 后启动

Disclaimer
  1. License under CC BY-NC 4.0
  2. Copyright issue feedback me#imzye.me, replace # with @
  3. Not all the commands and scripts are tested in production environment, use at your own risk
  4. No privacy information is collected here
Try iOS App