Redis 的持久化
Redis 的持久化
Redis 支持RDB和AOF两种持久化机制,持久化可以避免因进程退出而造成数据丢失
RDB
RDB持久化把当前进程数据生成快照(.rdb)文件保存到硬盘的过程,有手动触发和自动触发。
手动触发有 save 和 bgsave 两种命令
- save:阻塞当前 Redis,直到 RDB 持久化过程完成为止,若内存实例比较大会造成长时间阻塞,线上环境不建议用它。
- bgsave:Redis 进程执行 fork 操作创建子线程,由子线程完成持久化,阻塞时间很短(微秒级),是 save 的优化,在执行redis-cli shutdown 关闭 redis 服务时,如果没有开启 AOF 持久化,自动执行bgsave。
相关操作
- 更改 .db 文件路径:
更改配置文件 redis.conf,搜索 dir,更改成你想要的的路径:
默认与配置文件在同一目录下。 - 手动备份:bgsave
- 备份恢复:需要将 .db 放在与配置文件同一目录下。所以,默认情况下,下次登录能看到上次遗留下来的信息。
优点
- 压缩后的二进制文,适用于备份、全量复制,用于灾难恢复
- 加载RDB恢复数据远快于AOF方式
缺点
- 无法做到实时持久化,每次都要创建子进程,频繁操作成本过高
- 保存后的二进制文件,存在老版本不兼容新版本 .rdb 文件的问题
AOF
针对RDB不适合实时持久化,Redis 提供了 AOF 持久化方式来解决。
流程
- 所有的写入命令会append 追加到 aof_buf 缓冲区中
- AOF 缓冲区向硬盘做 sync 同步
- 随着 AOF 文件越来越大,需定期对AOF文件 rewrite 重写,达到压缩
- 当 redis 服务重启,可 load 加载 AOF 文件进行恢复
redis.conf 配置
- 开启:appendonly yes(默认不开启,为no)
- 文件名:
- 同步策略:
always:每收到写命令,立即写入。不推荐
everysec:每秒写一次。默认
no:完全依赖操作系统完成同步。同步没有保证 - 进行 rewrite 时,是否不 append:一般设置为 yes,不 append,避免阻塞主进程,但要承担宕机时丢数据的风险。
- 自动 aof 重写出发百分比:默认100,aof 文件大小每提升 100% 重写一次。
自动 aof 重写最小大小:默认至少到了 64M 重写 aof
redis 重启时恢复流程
- 当AOF和RDB文件同时存在时,优先加载 AOF
- 若关闭了AOF,加载RDB文件
- 加载AOF/RDB成功,redis重启成功
- AOF/RDB存在错误,redis启动失败并打印错误信息
参考:James——笔记-第一节课Redis