RDB持久化触发机制

article/2025/8/29 17:31:31

RDB持久化

触发机制

手动触发

手动触发分别对应save和bgsave命令:

  • save命令:同步,在主线程中保存快照;阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用;

  • bgsave命令:异步,Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。堵塞只发生在fork阶段,一般时间很短;BGSAVE命令是针对SAVE堵塞问题做的优化。因此Redis内部所有的设计RDB的操作都采用BGSAVE的方式,而save命令已经废弃。
    在这里插入图片描述

  • bgsave的执行流程:

  • 在这里插入图片描述

1) 执行bgsave命令,Redis父进程首先判断:当前是否在执行save,或bgsave/bgrewriteaof(aof文件重写命令)的子进程,如果在执行则bgsave命令直接返回。bgsave/bgrewriteaof 的子进程不能同时执行,主要是基于性能方面的考虑:两个并发的子进程同时执行大量的磁盘写操作,可能引起严重的性能问题。

2)父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞的,Redis不能执行来自客户端的任何命令;通过info stats命令查看lastest_fork_usee选项,可以获取最近一个fork操作的耗时,单位为微秒。

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

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

5)子进程发送信号给父进程表示完成,父进程更新统计信息。

自动触发

自动触发最常见的情况是在配置文件中通过save m n,指定当m秒内发生n次变化时,会自动触发bgsave。
查看Redis默认配置文件 redis.conf,如下配置信息:

在这里插入图片描述
其中save 900 1的含义是:当时间到900秒时,如果Redis数据发生了至少1次变化,则执行bgsave;save 300 10和save 60 10000同理。
注意:当三个save条件满足任意一个时,都会引起bgsave的调用。

save m n的实现原理

首先是将数据先存储在内存,然后当数据累计达到某些设定的伐值的时候,就会触发一次DUMP操作,将变化的数据一次性写入数据文件(RDB文件)。

RDB实际是在Redis内部一个定时器事件,每隔固定时间去检查当前数据发生的改变次数与时间是否满足配置的持久化触发的条件,如果满足则通过操作系统fork调用来创建出一个子进程,这个子进程默认会与父进程共享相同的地址空间,这时就可以通过子进程来遍历整个内存来进行存储操作,而主进程则仍然可以提供服务,当有写入时由操作系统按照内存页(page)为单位来进行copy-on-write保证父子进程之间不会互相影响。

具体实现:Redis的save m n,是通过serverCron函数、dirty计数器、和lastsave时间戳来实现的。

serverCron是Redis服务器的周期性操作函数,默认每隔100ms执行一次;该函数对服务器的状态进行维护,其中一项工作就是检查 save m n 配置的条件是否满足,如果满足就执行bgsave。

dirty计数器是Redis服务器维持的一个状态,记录了上一次执行bgsave/save命令后,服务器状态进行了多少次修改(包括增删改);而当save/bgsave执行完成后,会将dirty重新置为0。

例如,如果Redis执行了set mykey helloworld,则dirty值会+1;如果执行了sadd myset v1 v2 v3,则dirty值会+3;注意dirty记录的是服务器进行了多少次修改,而不是客户端执行了多少修改数据的命令。

lastsave时间戳也是Redis服务器维持的一个状态,记录的是上一次成功执行save/bgsave的时间。

save m n的原理如下:每隔100ms,执行serverCron函数;在serverCron函数中,遍历saveparams数组,只要有一个条件满足,就进行bgsave。对于每一个save m n条件,只有下面两条同时满足时才算满足:

(1)当前时间-lastsave > m

(2)dirty >= n

其他触发机制

除了save m n以外,还有一些其他情况会触发bgsave:

  • 如果从节点执行全量复制操作,主节点自动执行BGSAVE生成RDB文件并发送给从节点。
  • 执行debug reload命令重新加载Redis时,也会自动触发save操作。
  • 默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行BGSAVE。

http://chatgpt.dhexx.cn/article/GFonrkvv.shtml

相关文章

Redis RDB 和 AOF

导读 RDB 和 AOF 对比: 持久化方式选择 如果对数据安全性要求极高,应该同时使用两种持久化方式。 如果可以承受若干时间内的数据丢失,可以只使用 RDB 持久化。 不建议只使用 AOF 持久化,因为定时生成 RDB 快照(s…

java读取rdb_剖析Redis RDB文件

通过redis-cli中执行save或者bgsave可以得到RDB文件(文件名由配置文件中dbfilename指定,例如dbfilename "dump.rdb"),这个文件包含Redis实例中全量的数据,那么dump.rdb的文件格式大概是什么样的呢? RDB文件定义 获取RDB…

Redis RDB文件解析

Redis RDB是什么 Redis rdb是Redis快照存储持久化方式,具体就是将Redis某一时刻的内存数据保存到硬盘的文件当中,默认保存的文件名为dump.rdb,而在Redis服务器启动时,会重新加载dump.rdb文件的数据到内存当中恢复数据&#xff0c…

RDB 持久化详解

文章目录 持久化的执行SAVE:阻塞服务器并创建RDB文件BGSAVE:以非阻塞方式创建RDB文件通过配置文件自动创建RDB文件查看最近持久化时间 RDB优化配置1. save2. stop-write-on-bgsave-error3. rdbcompression4. rdbchecksum5. sanitize-dump-payload6. dbfi…

RDB持久化

RDB持久化 一、RDB快照实现二、快照用法三、执行快照时的数据修改四、RDB 和 AOF 合体 一、RDB快照实现 Redis 是内存数据库,但是它为数据的持久化提供了两个技术。 分别是「 AOF 日志和 RDB 快照」。 这两种技术都会用各用一个日志文件来记录信息,但…

RDB底层原理

Redis服务器自动保存功能的实现原理及文件中的各个组成部分 因为Redis是内存数据库,它将自己的数据库状态储存在内存里 面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面, 那么一旦服务器进程退出,服务器中的数据库…

Redis持久化原理(RDB)

在上一篇文章中,介绍了Redis的内存模型很重要,从这篇文章开始,将依次介绍Redis高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。 本文将先说明上述几种技术分别解决了Redis高可用的什么问题;然后详细介绍Redis的…

运行程序时出现 应用程序无法启动,因为应用程序的并行配置不正确

最近发布给客户的程序中,双击exe程序出现“应用程序无法启动,因为应用程序的并行配置不正确”,下面提示使用sxstrace跟踪调试应用程序运行时需要的动态库的版本和路径。 于是有以下操作: 步骤: 1.利用管理员身份运行命…

谷歌浏览器出现应用程序无法启动,因为应用程序的并行配置不正确....(亲测完美解决)

电脑开机 完整报错提示为: 应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行 sxstrace.exe 工具。 刚开始也在网上找了N久的解决方案(如:启动windws Mod…

成功解决“tesseral应用程序无法打开,因为运行程序并行配置不正确”

目前网上流传的两种方法1是启动Windows Modules Installer并重启 但我的并没有处于禁用状态。 第二种是查看日志安装对应库,比较麻烦。 无意中发现第三种方式,操作更为简单。 我的tesseral版本是7.0.6,初次打开会提示如题报错,…

chrome 应用程序无法启动,因为应用程序的并行配置不正确

方法一: 开始 - 运行(输入services.msc)- 确定或回车,打开:服务(本地); 我们在服务(本地)窗口找到:Windows Modules Installer服务&#…

exe应用程序无法启动,因为应用程序的并行配置不正确

问题:exe应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行 sxstrace.exe 工具。 原因查找: 1)开始→所有程序→附件→右键命令提示符→以管理员身份运…

STM32CubeMx开发之路—在线升级OTA

文章目录 运行环境简介基础知识(1/4)STM32中的程序在哪儿?进行分区总体流程图 BootLoader程序流程图分析程序编写和分析 App程序流程图分析程序编写和分析Ymodem协议代码分析 结果验证代码的下载BootLoader的下载App1的下载生成App2的.bin文件使用Xshell进行文件传输 总结源代…

基于FPGA的在线升级

基于FPGA的在线升级 在线升级的意义在线升级的策略整体框架总结参考文献结束语 在线升级的意义 首先什么是FPGA的在线升级? 所谓FPGA的在线升级其实就是不对FPGA进行常规意义下的下载程序,便可以通过一些手段更新FPGA中的程序,一般用到的工具…

MCU通过UART实现OTA在线升级流程

关注星标公众号,不错过精彩内容 素材来源 | 网络 OTA升级已经不是什么新鲜事,现在大多数物联网终端设备,基本具备这个功能。 今天以AT32为例给大家分享一下OTA升级的详细流程。 概述 空中下载技术OTA(Over-the-Air Technology&…

Qt 在线升级功能

开源QSimpleUpdater是一个Qt在线升级模块 ,但是QSimpleUpdater 由于使用了很久以前的版本,并且近几年没有维护,因此其内部好多Qt的widget文件,这些QWidget与项目的整体风格不符合,说白了就是很丑,现在用QML…

stm32-IAP(在线升级程序)

第一章 背景知识 什么是IAP? IAP的知识网上的各种资料也说的比较明白,在此简单介绍一下。IAP( In Application Programming)即在线应用编程,也就是用户可以使用自己的程序对单片机的User Flash的某一区域&#xff08…

【Android】轻松实现 APK 在线升级

【Android】轻松实现 APK 在线升级 APK 在线升级 APK 在线升级几乎是所有程序必备的功能。 在线升级功能能解决已有的问题并提供更丰富的新功能。 基本的流程是: 检测到新版本信息弹出升级提示窗口点击 No 不进行升级,完毕!点击 Yes 后台…

车载Linux固件升级,一种车载系统固件在线升级方法与流程

本发明涉及汽车系统升级技术领域,尤其涉及一种车载系统固件在线升级方法。 背景技术: 随着汽车智能化、网联化的发展趋势,车联网的技术进步带来汽车软件系统的复杂度不断增加,升级迭代的速度越来越快,软件的不稳定性风险不可避免。统计数据显示,当前市场一半以上的汽车召…

51单片机IAP在线升级

51单片机IAP在线升级 爱矽半导体E85F3325单片机IAP在线升级教程,此处可查看更新及demo下载 文章目录 前言一、ROM资源二、KEIL有关知识1.BL51连接器:2.LX51连接器: 三、Keil其他相关项说明:四、MCU启动文件说明:五、例…