返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >浅谈Redis中的RDB快照
  • 937
分享到

浅谈Redis中的RDB快照

2024-04-02 19:04:59 937人浏览 薄情痞子
摘要

目录一、概述二、快照怎么用?三、执行 bgsava 快照时,数据能被修改吗?四、RDB 和 AOF 合体一、概述 所谓的快照,就是记录某一个瞬间东西,比如当我们给风景拍照时,那一个瞬

一、概述

所谓的快照,就是记录某一个瞬间东西,比如当我们给风景拍照时,那一个瞬间的画面和信息就记录到了一张照片。

所以,RDB 快照就是记录某一个瞬间的内存数据,记录的是实际数据,而 AOF 文件记录的是命令操作的日志,而不是实际的数据。

因此在 Redis 恢复数据时, RDB 恢复数据的效率会比 AOF 快些,因为直接将 RDB 文件读入内存就可以了,不需要像 AOF 那样还需要额外执行操作命令的步骤才能恢复数据。

接下来,就来具体聊聊 RDB 快照 。

二、快照怎么用?

要熟悉一个东西,先看看怎么用是比较好的方式。

Redis 提供了两个命令来生成 RDB 文件,分别是 savebgsave,他们的区别就在于是否在「主线程」里执行:

  • 执行了 save 命令,就会在主线程生成 RDB 文件,由于和执行操作命令在同一个线程,所以如果写入 RDB 文件的时间太长,会阻塞主线程;
  • 执行了 bgsava 命令,会创建一个子进程来生成 RDB 文件,这样可以避免主线程的阻塞;

RDB 文件的加载工作是在服务器启动时自动执行的,Redis 并没有提供专门用于加载 RDB 文件的命令。

Redis 还可以通过配置文件的选项来实现每隔一段时间自动执行一次 bgsava 命令,默认会提供以下配置:

save 900 1

save 300 10

save 60 10000

别看选项名叫 sava,实际上执行的是 bgsava 命令,也就是会创建子进程来生成 RDB 快照文件。

只要满足上面条件的任意一个,就会执行 bgsava,它们的意思分别是:

  • 900 秒之内,对数据库进行了至少 1 次修改;
  • 300 秒之内,对数据库进行了至少 10 次修改;
  • 60 秒之内,对数据库进行了至少 10000 次修改。

这里提一点,Redis 的快照是全量快照,也就是说每次执行快照,都是把内存中的「所有数据」都记录到磁盘中。

所以可以认为,执行快照是一个比较重的操作,如果频率太频繁,可能会对 Redis 性能产生影响。如果频率太低,服务器故障时,丢失的数据会更多。

通常可能设置至少 5 分钟才保存一次快照,这时如果 Redis 出现宕机等情况,则意味着最多可能丢失 5 分钟数据。

这就是 RDB 快照的缺点,在服务器发生故障时,丢失的数据会比 AOF 持久化的方式更多,因为 RDB 快照是全量快照的方式,因此执行的频率不能太频繁,否则会影响 Redis 性能,而 AOF 日志可以以秒级的方式记录操作命令,所以丢失的数据就相对更少。

三、执行 bgsava 快照时,数据能被修改吗?

那问题来了,执行 bgsava 过程中,由于是交给子进程来构建 RDB 文件,主线程还是可以继续工作的,此时主线程可以修改数据吗?

如果不可以修改数据的话,那这样性能一下就降低了很多。如果可以修改数据,又是如何做到到呢?

直接说结论吧,执行 bgsava 过程中,Redis 依然可以继续处理操作命令的,也就是数据是能被修改的。

那具体如何做到到呢?关键的技术就在于写时复制技术(Copy-On-Write, COW)。

执行 bgsava 命令的时候,会通过 fork() 创建子进程,此时子进程和父进程是共享同一片内存数据的,因为创建子进程的时候,会复制父进程的页表,但是页表指向的物理内存还是一个。

只有在发生修改内存数据的情况时,物理内存才会被复制一份。

这样的目的是为了减少创建子进程时的性能损耗,从而加快创建子进程的速度,毕竟创建子进程的过程中,是会阻塞主线程的。

所以,创建 bgsave 子进程后,由于共享父进程的所有内存数据,于是就可以直接读取主线程里的内存数据,并将数据写入到 RDB 文件。

当主线程对这些共享的内存数据也都是只读操作,那么,主线程和 bgsave 子进程相互不影响。

但是,如果主线程要修改共享数据里的某一块数据(比如键值对 A)时,就会发生写时复制,于是这块数据的物理内存就会被复制一份(键值对 A'),然后主线程在这个数据副本(键值对 A')进行修改操作。与此同时,bgsave 子进程可以继续把原来的数据(键值对 A)写入到 RDB 文件。

就是这样,Redis 使用 bgsave 对当前内存中的所有数据做快照,这个操作是由 bgsave 子进程在后台完成的,执行时不会阻塞主线程,这就使得主线程同时可以修改数据。

细心的同学,肯定发现了,bgsave 快照过程中,如果主线程修改了共享数据,发生了写时复制后,RDB 快照保存的是原本的内存数据,而主线程刚修改的数据,是被办法在这一时间写入 RDB 文件的,只能交由下一次的 bgsave 快照。

所以 Redis 在使用 bgsave 快照过程中,如果主线程修改了内存数据,不管是否是共享的内存数据,RDB 快照都无法写入主线程刚修改的数据,因为此时主线程的内存数据和子线程的内存数据已经分离了,子线程写入到 RDB 文件的内存数据只能是原本的内存数据。

如果系统恰好在 RDB 快照文件创建完毕后崩溃了,那么 Redis 将会丢失主线程在快照期间修改的数据。

另外,写时复制的时候会出现这么个极端的情况。

在 Redis 执行 RDB 持久化期间,刚 fork 时,主进程和子进程共享同一物理内存,但是途中主进程处理了写操作,修改了共享内存,于是当前被修改的数据的物理内存就会被复制一份。

那么极端情况下,如果所有的共享内存都被修改,则此时的内存占用是原先的 2 倍。

所以,针对写操作多的场景,我们要留意下快照过程中内存的变化,防止内存被占满了。

四、RDB 和 AOF 合体

尽管 RDB 比 AOF 的数据恢复速度快,但是快照的频率不好把握:

如果频率太低,两次快照间一旦服务器发生宕机,就可能会比较多的数据丢失; 如果频率太高,频繁写入磁盘和创建子进程会带来额外的性能开销。

那有没有什么方法不仅有 RDB 恢复速度快的优点和,又有 AOF 丢失数据少的优点呢?

当然有,那就是将 RDB 和 AOF 合体使用,这个方法是在 Redis 4.0 提出的,该方法叫混合使用 AOF 日志和内存快照,也叫混合持久化。

如果想要开启混合持久化功能,可以在 Redis 配置文件将下面这个配置项设置成 yes:

aof-use-rdb-preamble yes

混合持久化工作在 AOF 日志重写过程。

当开启了混合持久化时,在 AOF 重写日志时,fork 出来的重写子进程会先将与主线程共享的内存数据以 RDB 方式写入到 AOF 文件,然后主线程处理的操作命令会被记录在重写缓冲区里,重写缓冲区里的增量命令会以 AOF 方式写入到 AOF 文件,写入完成后通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的的 AOF 文件。

也就是说,使用了混合持久化,AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据。

这样的好处在于,重启 Redis 加载数据的时候,由于前半部分是 RDB 内容,这样加载的时候速度会很快。

加载完 RDB 的内容后,才会加载后半部分的 AOF 内容,这里的内容是 Redis 后台子进程重写 AOF 期间,主线程处理的操作命令,可以使得数据更少的丢失。

以上就是浅谈Redis RDB快照的详细内容,更多关于Redis RDB的资料请关注编程网其它相关文章!

--结束END--

本文标题: 浅谈Redis中的RDB快照

本文链接: https://lsjlt.com/news/129367.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅谈Redis中的RDB快照
    目录一、概述二、快照怎么用?三、执行 bgsava 快照时,数据能被修改吗?四、RDB 和 AOF 合体一、概述 所谓的快照,就是记录某一个瞬间东西,比如当我们给风景拍照时,那一个瞬...
    99+
    2024-04-02
  • 图解Redis,谈谈Redis的持久化,RDB快照与AOF日志
    目录 专栏导读 一、RDB持久化 1、自动触发 2、手动触发 3、设置保存条件 4、加解密 5、R...
    99+
    2023-09-21
    redis 数据库 分布式
  • Redis持久化之RDB快照
    什么是RDB?1.Redis数据存储在内存中,通过save或bgsave可以在硬盘上创建一个rdb的二进制文件。这个rdb文件相当于redis的数据的快照。2.Redis 重启后,会将硬盘中rdb文件内容...
    99+
    2024-04-02
  • redis怎么开启rdb快照
    redis开启rdb快照的示例:在redis.conf中创建快照的配置如下:# 时间策略save 900 1save 300 10save 60 10000# ...
    99+
    2024-04-02
  • 浅谈为什么单线程的redis那么快
    目录redis单机QPS为什么这么快内存型数据库简单的数据结构单线程IO多路复用总结redis单机QPS ./redis-benchmark -t set,lpush -n 1...
    99+
    2024-04-02
  • 浅谈redis在项目中的应用
    redis在项目中的应用 ps:PHP 会自动 关redis连接 不需要手动关 对于临时的数据 可以不经过数据库直接redis上操作 public function insertinfo(){ ...
    99+
    2022-06-04
    浅谈 项目 redis
  • redis中RDB(Redis Data Base)的机制
    目录一、RDB(Redis Data Base)1.1、配置文件  1.2、操作步骤 1.3、数据丢失演示 1.4、检查dump.rdb文件是否损坏 1.5、禁用RDB快...
    99+
    2023-04-06
    redis RDB
  • redis中RDB(RedisDataBase)的机制
    目录一、RDB(Redis Data Base)1.1、配置文件  1.2、操作步骤 1.3、数据丢失演示 1.4、检查dump.rdb文件是...
    99+
    2023-05-14
    redis RDB
  • 浅谈Redis的异步机制
    目录前言一、Redis 的阻塞点4 类交互对象和具体的操作之间的关系:切片集群实例交互时的阻塞点二、可以异步执行的阻塞点三、异步的子线程机制总结前言 命令操作、系统配置、关键机制、硬...
    99+
    2024-04-02
  • 浅谈Redis中的自动过期机制
    目录Redis中的自动过期机制一、使用Redis Key自动过期机制二、SpringBoot整合key失效监听Redis中的自动过期机制 实现需求:处理订单过期自动取消,比如下单30...
    99+
    2024-04-02
  • redis中的快照持久化是什么
    redis中的快照持久化是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存...
    99+
    2024-04-02
  • 浅谈redis缓存在项目中的使用
    背景 Redis 是一个开源的内存数据结构存储系统。 可以作为数据库、缓存和消息中间件使用。 支持多种类型的数据结构。 Redis 内置了 复制(replication),LUA脚...
    99+
    2024-04-02
  • 浅谈Redis位图(Bitmap)及Redis二进制中的问题
    Redis位图(Bitmap)及二进制的问题 SETBIT key offset value 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。位的设置或清除取决于...
    99+
    2024-04-02
  • 浅谈Redis的几个过期策略
    目录概述设置过期时间三种过期策略定时删除懒汉式式删除定期删除Redis采用的过期策略总结概述 设置过期时间 expire key time(以秒为单位) 这是最常用的方式 setex...
    99+
    2024-04-02
  • 浅谈Redis的事件驱动模型
    Redis 作为一个 Client-Server 架构的数据库,其源码中少不了用来实现网络通信的部分。而你应该也清楚,通常系统实现网络通信的基本方法是使用Socket编程模型,,包括...
    99+
    2024-04-02
  • 浅谈Redis阻塞的9种情况
    目录命令阻塞SAVE 阻塞同步持久化AOF 重写AOF 日志大 Key 问题查找大 key删除大 key清空数据库集群扩容前两天去美团面试的陈同学回来了,看他满脸泄气的样子,准是没拿到 Offer。 听了他面试的经过,真...
    99+
    2023-03-24
    Redis 阻塞
  • 浅谈JVM中的JOL
    目录JOL简介使用JOL分析VM信息使用JOL分析String使用JOL分析数组使用JOL分析自动装箱使用JOL分析引用关系总结JOL简介 JOL的全称是Java Object La...
    99+
    2024-04-02
  • 浅谈Unity中的Shader
    目录一、Shader基础知识1.1、什么是Shader1.2、OpenGL的渲染流程1.3、shader的种类1.4、shader的开发语言二、Unity中Shader知识介绍2.1...
    99+
    2024-04-02
  • Redis中RDB和AOF的示例分析
    这篇文章将为大家详细讲解有关Redis中RDB和AOF的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis 有两种持久化方案,RDB (Redis Data...
    99+
    2024-04-02
  • redis怎么读取rdb中的数据
    如何从 redis rdb 中读取数据停止并备份 redis 服务器。使用 redis-rdb-tools 解析 rdb 文件。使用 python 库 redisrdb 或 c 库 re...
    99+
    2024-04-08
    python redis 键值对
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作