ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
>[info] Redis持久化概述 持久化的功能:Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从 内存保存到硬盘。 当下次Redis重启 时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程 位置。Redis持久化分为 RDB持久化和AOF持久化,前者将当前数据保存到硬盘,后者则是将每次执行 的写命令保存到硬盘。 >[info] RDB RDB是一种快照存储持久化方式,具体就是将Redis某一时刻的内存数据保存到硬盘的文件当中,默认保 存的文件名为dump.rdb,而在Redis服务器启动时会重新加载dump.rdb文件的数据到内存当中恢复数据。 触发 RDB 持久化过程分为 **手动触发** 和 **自动触发**。 >[info] 触发机制 ### **手动触发分别对应 save 和 bgsave 命令:** **save 命令:** 阻塞当前 Redis 服务器,直到 RDB 过程完成为止,对于内存比较大的实例会 **造成长时间阻塞**,线上环境不建议使用。 ***** **save 命令执行时的服务器状态:** 前面提到过,当SAVE命令执行时,Redis 服务器会被阻塞,所以当SAVE命令正在执行时,客户端发送的所有命令请求都会被拒绝。 只有在服务器执行完SAVE命令、重新开始接受命令请求之后,客户端发送的命令才会被处理。 ***** **bgsave 命令:** Redis 进程执行 fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结 束。阻塞只发生在 fork 阶段,一般时间很短。 显然 bgsave 命令是针对save阻塞问题做的优化。因此Redis内部所有的涉RDB的操作都采用 bgsave 的方式。 >[info] 流程说明 bgsave 是主流的触发 RDB 持久化方式,根据下图了解它的运作流程: ![](https://img.kancloud.cn/d1/7d/d17d569a0b765bfabbdb050ee327d460_798x611.png) **流程解析:** 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_* 相关选项。 >[info] 配置和工作原理 RDB就像是一台专门给Redis数据存储拍照的照相机。当满足触发策略时,Redis会通过将所有数据 转储到本地磁盘上-一个文件中的方式给Redis中的数据拍一张“照片”。在详细介绍上述过程前,我们先 来解释一下save 参数的含义。save参数决定了上一节中提到的RDB触发策略,这个值的格式是 X1,y1,X2,y2,...,其含义是,如果超过y个键发生改变且此时没有转储正在发生,则在x秒后进行数据转储。 ***** **redis.conf 默认配置:** ``` save 900 1 save 300 10 save 60 10000 ``` >[info] RDB 文件的处理 >[info] RDB方式的优缺点 **优点:** 1. RDB 是一个非常紧凑的文件,它保存了 Redis 在某个时间点上的数据集。 这种文件非常适合用于进行备份: 比如说,你可以在最近的 24小时内,每小时备份一次 RDB 文件,并且在每个月的每一天,也备份一个RDB 文件。 这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。 2. .RDB 可以最大化 Redis 的性能:父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子进程,然后 这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O 操作。 3. RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。 **缺点:** 1. RDB 方式数据没办法做到实时持久化/秒级持久化 如果服务器宕机的话,采用RDB的方式会造成某个时段内数据的丢失,比如我们设置10分钟同步一次或5分钟达到1000次写入就同步一次,那么如果还没达到触发 条件服务器就死机了,那么这个时间段的数据会丢失。 2. 使用 bgsave 命令在forks子进程时,如果数据量太大,forks的过程也会发生阻塞,另外,forks子进程会耗费内存。 针对 RDB 不适合实时持久化的问题,Redis 提供了 AOF 持久化方式来解决。