【redis知识点整理】 --- Redis的持久化

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



1 RDB持久化 — redis默认开启的持久化方式

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


1.1 RDB持久化机制 — 手动触发

手动触发有 save 和 bgsave两条命令

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

显然 bgsave 是对 save 的优化。


1.2 RDB持久化机制 — 自动触发

自动触发的方式需要在redis.conf里进行配置,redis默认给的自动触发的配置如下:
在这里插入图片描述


1.3 bgsave运行流程 — RDB主流触发方式

bgsave是主流的触发RDB持久化方式,其执行流程如下:

参考了: https://www.jianshu.com/p/d3ba7b8ad964

在这里插入图片描述
1)执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进 程,如RDB/AOF子进程,如果存在bgsave命令直接返回。

2)父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通 过info stats命令查看latest_fork_usec选项,可以获取最近一个fork操作的耗时,单位为微秒

3)父进程fork完成后,bgsave命令返回“Background saving started”信息并不再阻塞父进程,可以继续响应其他命令。

4)子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后 对原有文件进行原子替换。执行lastsave命令可以获取最后一次生成RDB的 时间,对应info统计的rdb_last_save_time选项。

5)进程发送信号给父进程表示完成,父进程更新统计信息,具体见 info Persistence下的rdb_*相关选项。


1.4 RDB恢复方式 + 持久化机制优缺点

命令: config set dir /usr/local //设置 rdb 文件保存路径,一次性的,要想永久生效,还是得在redis.conf文件里进行配置
备份: 在上面的基础上执行bgsave ,就会将 dump.rdb 保存到 usr/local 下
恢复: 将 dump.rdb 放到 redis 安装目 录与 redis.conf 同级目录, 重启 redis 即可


  • 优点:
    • RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间点上的数据 快照。非常适用于备份,全量复制等场景。比如每6小时执行bgsave备份, 并把RDB文件拷贝到远程机器或者文件系统中(如hdfs),用于灾难恢复。
    • 加载 RDB 恢复数据远快于 AOF 方式
  • 缺点:
    • 无法做到实时持久化, 每次都要创建子进程, 频繁操作成本过高
    • 保存后的二进制文件, 存在老版本不兼容新版本 rdb 文件的问题

2 AOF持久化 — redis默认没开启的持久化方式(but 重要)

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

开启: redis.conf 设置: appendonly yes (默认不开启, 为 no)
默认文件名: appendfilename “appendonly.aof”


2.1 AOF 持久化流程

在这里插入图片描述
具体流程如上图,简单说明如下:

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

AOF 持久化流程: 命令写入(append),文件同步(sync),文件重写(rewrite),重启加载(load)


2.2 redis 的 AOF 配置详解(★★★)


  • appendonly yes //启用 aof 持久化方式

  • appendfsync always //每收到写命令就立即强制写入磁盘, 最慢的, 但是保证完全的持久化, 不推荐使用
  • appendfsync everysec //每秒强制写入磁盘一次, 性能和持久化方面做了折中, 推荐
  • appendfsync no //完全依赖 os, 性能最好,持久化没保证(操作系统自身的同步)

  • no-appendfsync-on-rewrite yes //正在导出 rdb 快照的过程中,要不要停止同步 aof

  • auto-aof-rewrite-percentage 100 //aof 文 件大小 比 起上次重写 时 的 大小 , 增 长率100%时,重写
  • auto-aof-rewrite-min-size 64mb //aof 文件,至少超过 64M 时,重写

2.3 如何从AOF恢复

1)设置 appendonly yes;
2)将 appendonly.aof 放到 dir 参数指定的目 录;
3) 启动 Redis, Redis 会自 动加载 appendonly.aof 文件。


3 redis重启时加载AOF与RDB的顺序

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

具体流程可参照下图:
在这里插入图片描述


4 RDB机制和AOF机制生成的持久化文件对比

最后看一下RDB持久化方式生成的文件和AOF持久化方式生成的文件

RDB持久化机制生成的文件 — redis编码后生成的数据文件
在这里插入图片描述

AOF持久化机制生成的文件 — 存放了操作命令
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/nrsc272420199/article/details/106322723