05 Redis的RDB日志

05 Redis的RDB日志05Redis 的 RDB 日志前言一 Redis 做内存数据快照的数据二 Redis 生成 RDB 文件的命令 save 和 bgsave 三 Redis 生成 RDB 文件时的写时复制技术四 Redis 生成 RDB 文件时的快照连拍五 Redis 生成 RDB 文件时的增量快照六 Redis 的混合使用 AOF 日志和内存快照 RDB 总结前言 Redis 避免数据丢失的 AOF 方法的好处是每次执行只需要记录操作命令 需要持久化的数据量不大 只要采用的不是 always 的持久化策略 就不会对性能造成太大影响 但是因为

前言

Redis 避免数据丢失的 AOF 方法:

  • 优点:每次执行只需要记录操作命令,需要持久化的数据量不大。只要采用的不是 always 的持久化策略,就不会对性能造成太大影响。
  • 缺点:因为记录的是操作命令,而不是实际的数据,所以用 AOF 方法进行故障恢复的时候,需要逐一把操作日志都执行一遍。如果操作日志非常多,Redis 就会恢复得很缓慢,影响到正常使用。

为避免此问题,Redis提供了另一种持久化方法:内存快照,指内存中的数据在某一个时刻的状态记录。这就类似于照片,当你给朋友拍照时,一 张照片就能把朋友一瞬间的形象完全记下来。

Redis 实现类似照片记录效果的方式,把某一时刻的状态以文件的形式写到磁盘上,也就是快照。即使宕机,快照文件也不会丢失,数据的可靠性也就得到了保证。这个快照文件就称为 RDB ( Redis DataBase)文件。

和 AOF 相比,RDB 记录的是某一时刻的数据,并不是操作,所以在做数据恢复时,可以直接把 RDB 文件读入内存,很快地完成恢复。

一、Redis 做内存数据快照的数据

Redis 的数据都在内存中,为了提供所有数据的可靠性保证,它执行的是全量快照,把内存中的所有数据都记录到磁盘中,这就类似于给 100 个人拍合影,把每一个人都拍进照片里,一次性记录了所有数据,一个都不少。

给一个人拍照时,只用协调一个人就够了,但是拍 100 人的大合影,却需要协调 100 个人的位置、状态,等等,这当然会更费时费力。给内存的全量数据做快照, 把它们全部写入磁盘也会花费很多时间。而且全量数据越多,RDB 文件就越大,往磁盘上写数据的时间开销就越大。

二、Redis 生成 RDB 文件的命令save 和 bgsave

Redis 的单线程模型就决定了,要尽量避免所有会阻塞主线程的操作,RDB 文件的生成是否会阻塞主线程,这就关系到是否会降低 Redis 的性能。

Redis 提供了两个命令来生成 RDB 文件:

  • save:在主线程中执行,会导致阻塞;
  • bgsave:创建一个子进程,专门用于写入 RDB 文件,避免了主线程的阻塞,这也是 Redis RDB 文件生成的默认配置。

可以通过 bgsave 命令来执行全量快照,这既提供了数据的可靠性保证,也避免了对 Redis 的性能影响。

三、Redis 生成RDB文件时的写时复制技术

在给别人拍照时一旦对方动了,那么这张照片就拍糊了就需要重拍,所以希望对方保持不动。对于内存快照而言,也不希望数据“动”。

在时刻 t 给内存做快照,假设内存数据量是 4GB,磁盘的写入带宽是 0.2GB/s,至少需要 20s(4/0.2 = 20)才能做完。如果在时刻 t+5s 时,一个还没有被写入磁盘的内存数据 A,被修改成了 A’,那么就会破坏快照的完整性,因为 A’不是时刻 t 时的状态。因此和拍照类似,在做快照时也不希望数据“动”,也就是不能被修改

但是如果快照执行期间数据不能被修改,是会有潜在问题的。在做快照的 20s 时间里,如果这 4GB 的数据都不能被修改,Redis 就不能处理对这些数据的写操作,就会给业务服务造成巨大的影响。

虽然可以用 bgsave 可以避免阻塞,避免阻塞和正常处理写操作并不是一回事。主线程的确没有阻塞,可以正常接收请求,为了保证快照完整性,它只能处理读操作,因为不能修改正在执行快照的数据。

为了快照而暂停写操作,肯定是不能接受的,Redis 就会借助操作系统提供的写时复制技术(Copy-On-Write, COW),在执行快照的同时,可以正常处理写操作。

bgsave 子进程是由主线程 fork 生成的,可以共享主线程的所有内存数据。 bgsave 子进程运行后,开始读取主线程的内存数据,并把它们写入 RDB 文件。

  • 如果主线程对这些数据也都是读操作(例如图中的键值对 A),那么主线程和 bgsave 子进程相互不影响。
  • 如果主线程要修改一块数据(例如图中的键值对 C), 那么这块数据就会被复制一份,生成该数据的副本。然后bgsave 子进程会把这个副本数据写入 RDB 文件,而在这个过程中,主线程仍然可以直接修改原来的数据。

这既保证了快照的完整性,也允许主线程同时对数据进行修改,避免了对正常业务的影响。

写时复制机制保证快照期间数据可修改

四、Redis 生成RDB文件时的快照连拍

对于快照来说,所谓“连拍”就是指连续地做快照。快照的间隔时间变得很短,即使某一时刻发生宕机了,因为上一时刻快照刚执行,丢失的数据也不会太多。但是,这其中的快照间隔时间就很关键了。

如图,先在 T0 时刻做了一次快照,然后又在 T0+t 时刻做了一次快照,在这期间,数据块 5 和 9 被修改了。如果在 t 这段时间内机器宕机了,只能按照 T0 时 刻的快照进行恢复。数据块 5 和 9 的修改值因为没有快照记录,就无法恢复了。

所以要想尽可能恢复数据,t 值就要尽可能小,t 越小,就越像“连拍”。

快照机制下的数据丢失

五、Redis 生成RDB文件时的增量快照

当然也不是t越小越好,虽然 bgsave 执行时不阻塞主线程,但是频繁地执行全量快照也会带来两方面的开销

  • 频繁将全量数据写入磁盘,会给磁盘带来很大压力,多个快照竞争有限的磁盘带宽,前一个快照还没有做完,后一个又开始做了,容易造成恶性循环。
  • bgsave 子进程需要通过 fork 操作从主线程创建出来。虽然子进程在创建后不会再阻塞主线程,但是fork 这个创建过程本身会阻塞主线程,而且主线程的内存越大,阻塞时间越长。如果频繁 fork 出 bgsave 子进程,这就会频繁阻塞主线程了。

Redis提供了增量快照:做了一次全量快照后,后续的快照只对修改的数据进行快照记录,避免每次全量快照的开销。

在第一次做完全量快照后,T1 和 T2 时刻如果再做快照,只需要将被修改的数据写入快照文件就行。但是这么做的前提是需要记住哪些数据被修改了,需要使用额外的元数据信息去记录哪些数据被修改了,这会带来额外的空间开销问题。

增量快照示意图
缺点

  • 如果对每一个键值对的修改都做个记录,那么如果有 1 万个被修改的键值对,就需要有 1 万条额外的记录。
  • 有的键值对非常小,比如只有 32 字节,而记录它被修改的元数据信息,可能就需要 8 字节,为了“记住”修改,引入的额外空间开销比较大。这对于内存资源宝贵的 Redis 来说,有些得不偿失。

跟 AOF 相比,快照的恢复速度快,但是,快照的频率不好把握,如果频率太低,两次快照间一旦宕机,就可能有比较多的数据丢失。如果频率太高, 又会产生额外开销。

六 Redis 的混合使用 AOF 日志和内存快照RDB

Redis 4.0 中提出了一个混合使用 AOF 日志和内存快照的方法。内存快照以一 定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作。

优点:

  • 快照不用很频繁地执行,这就避免了频繁 fork 对主线程的影响。
  • AOF 日志也只用记录两次快照间的操作,不需要记录所有操作了,就不会出现文件过大的情况了,也可以避免重写开销。

如图,T1 和 T2 时刻的修改,用 AOF 日志记录,等到第二次做全量快照时,就可以清空 AOF 日志,因为此时的修改都已经记录到快照中了,恢复时就不再用日志了。

既能享受到 RDB 文件快速恢复的好处,又能享受到 AOF 只记录操作命令的简单优势。

内存快照和AOF混合使用

总结

Redis 用于避免数据丢失的内存快照方法:

  • 优点:可以快速恢复数据库,只需要把 RDB 文件直接读入内存,避免了 AOF 需要顺序、逐一重新执行操作命令带来的低效性能问题;
  • 缺点:内存快照的局限性。它拍的是一张内存的“大合影”,不可避免地会耗时耗力。虽然Redis 设计了 bgsave 和写时复制方式,尽可能减少了内存快照对正常读写的影响,但是频繁快照仍然是不太能接受的。

混合使用 RDB 和 AOF,正好可以取两者之长,避两者之短,以较小的性能开销保证数据可靠性和性能。

使用AOF 和 RDB 的建议:

  • 数据不能丢失时:内存快照和 AOF 的混合使用是一个很好的选择;
  • 允许分钟级别的数据丢失:可以只使用 RDB;
  • 只用 AOF:优先使用 everysec 的配置选项,因为它在可靠性和性能之间取了一个平衡。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203805.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午9:32
下一篇 2026年3月19日 下午9:33


相关推荐

  • Yarn 安装与使用详细介绍「建议收藏」

    Yarn 安装与使用详细介绍「建议收藏」背景什么是Yarn速度快离线模式可靠可确定性网络优化扁平化模式版本控制其他关于Yarn的介绍Yarn安装windowsmac方式一方式二Yarn换源背景在Node生态系统中,依赖通常安装在项目的node_modules文件夹中。然而,这个文件的结构和实际依赖树可能有所区别,因为重复的依赖可以合并到一起。npm客户端把依…

    2022年5月26日
    62
  • php 依据字符串生成相应数组方法

    php 依据字符串生成相应数组方法

    2022年1月30日
    45
  • java verifycode_JavaWeb基础—VerifyCode源码

    java verifycode_JavaWeb基础—VerifyCode源码1packagecom.jiangbei.verifycodeutils;23importjava.awt.BasicStroke;4importjava.awt.Color;5importjava.awt.Font;6importjava.awt.Graphics2D;7importjava.awt.image.BufferedImage;8importjava.io.IOExce…

    2022年7月15日
    31
  • 试题库管理系统–数据库设计[通俗易懂]

    试题库管理系统–数据库设计[通俗易懂]一、概要设计1.1背景和意义目前,许多高校绝大多数课程还采用考教统一的模式来完成教学过程,这种传统的考试模式在教学到实施考试的过程带有很大的主观随意性和不规范性。另外随着各高校近年来学生规模的扩大,教学任务日益繁重,教师的工作量相应的不断增加。迫切需要计算机辅助教学系统来打破这种传统的教学模式,减轻教师的工作负担,提高教学质量。因此,本文研究设计了一个试题库管理系统,来解决和缓解高校课程

    2022年6月16日
    33
  • Linux中的pycharm配置问题「建议收藏」

    Linux中的pycharm配置问题「建议收藏」1.pycharm的图标问题解决方法:在终端输入以下命令行:sudogedit/usr/share/applications/Pycharm.desktop进入gedit文档界面然后将里面的内容复制成:[DesktopEntry]Type=ApplicationName=PycharmGenericName=Pycharm3Comment=Pycharm3:…

    2022年8月26日
    10
  • OpenClaw高级配置和自动化教程

    OpenClaw高级配置和自动化教程

    2026年3月13日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号