Redis 的持久化

Redis 支持RDB和AOF两种持久化机制,持久化可以避免因进程退出而造成数据丢失

RDB

RDB持久化把当前进程数据生成快照(.rdb)文件保存到硬盘的过程,有手动触发和自动触发。
手动触发有 save 和 bgsave 两种命令

  • save:阻塞当前 Redis,直到 RDB 持久化过程完成为止,若内存实例比较大会造成长时间阻塞,线上环境不建议用它。
  • bgsave:Redis 进程执行 fork 操作创建子线程,由子线程完成持久化,阻塞时间很短(微秒级),是 save 的优化,在执行redis-cli shutdown 关闭 redis 服务时,如果没有开启 AOF 持久化,自动执行bgsave。
    Redis 的持久化

相关操作

  • 更改 .db 文件路径:
    更改配置文件 redis.conf,搜索 dir,更改成你想要的的路径:
    Redis 的持久化
    默认与配置文件在同一目录下。
  • 手动备份:bgsave
  • 备份恢复:需要将 .db 放在与配置文件同一目录下。所以,默认情况下,下次登录能看到上次遗留下来的信息。

优点

  • 压缩后的二进制文,适用于备份、全量复制,用于灾难恢复
  • 加载RDB恢复数据远快于AOF方式

缺点

  • 无法做到实时持久化,每次都要创建子进程,频繁操作成本过高
  • 保存后的二进制文件,存在老版本不兼容新版本 .rdb 文件的问题

AOF

针对RDB不适合实时持久化,Redis 提供了 AOF 持久化方式来解决。

流程

  1. 所有的写入命令会append 追加到 aof_buf 缓冲区中
  2. AOF 缓冲区向硬盘做 sync 同步
  3. 随着 AOF 文件越来越大,需定期对AOF文件 rewrite 重写,达到压缩
  4. 当 redis 服务重启,可 load 加载 AOF 文件进行恢复

Redis 的持久化

redis.conf 配置

  • 开启:appendonly yes(默认不开启,为no)
    Redis 的持久化
  • 文件名:
    Redis 的持久化
  • 同步策略:
    always:每收到写命令,立即写入。不推荐
    everysec:每秒写一次。默认
    no:完全依赖操作系统完成同步。同步没有保证
    Redis 的持久化
  • 进行 rewrite 时,是否不 append:一般设置为 yes,不 append,避免阻塞主进程,但要承担宕机时丢数据的风险。
    Redis 的持久化
  • 自动 aof 重写出发百分比:默认100,aof 文件大小每提升 100% 重写一次。
    Redis 的持久化
    自动 aof 重写最小大小:默认至少到了 64M 重写 aof

Redis 的持久化

redis 重启时恢复流程

  1. 当AOF和RDB文件同时存在时,优先加载 AOF
  2. 若关闭了AOF,加载RDB文件
  3. 加载AOF/RDB成功,redis重启成功
  4. AOF/RDB存在错误,redis启动失败并打印错误信息

Redis 的持久化

参考:James——笔记-第一节课Redis