Redis—持久化机制

news2024/11/25 2:22:11

Redis持久化机制

  • 1. RDB
    • 1.1 实现方式
    • 1.2 实现原理
  • 2. AOF
    • 2.1 实现方式
    • 2.2 AOF文件载入
    • 2.3 AOF重写
    • 2.4 重写触发
  • 3. RDB vs AOF
    • 3.1 RDB
    • 3.2 AOF
    • 3.3 如何选择?
  • 4. Redis 4.0 混合持久化

Redis的持久化机制有两种持久化机制,分别是 RDB 和 AOF

1. RDB

Redis Database Backup file(RDB),也被称为Redis数据快照,RDB将内存中的数据都记录在磁盘上,当Redis 出现意外,可以通过重启 Redis 加载该文件来恢复数据。

RDB 默认开启,既可以手动执行,也可以根据服务器配置选项定期 自动执行。

服务器在恢复数据库数据(载入RDB文件)时,会一直处于阻塞状态,直到载入完成为止。

1.1 实现方式

手动执行

  • SAVE命令:阻塞 Redis 进程,直到 RDB 文件创建完成为止,这个阶段服务器无法处理任何命令请求
save <时间间隔> <执行指定次数更新操作>
  • BGSAVE命令:创建一个子进程来创建RDB文件,这个阶段服务器可以处理请求,但是会拒绝SAVE、BGSAVE、BGREWRITEAOF命令

SAVE是阻塞式的,因此其可用性欠佳,如果在数据量较少的情况下,基本上体会不到两个命令的差别,建议使用BGSAVE

自动执行

BGSAVE是非阻塞的,所以Redis允许通过配置 redis.conf 文件中的 save 配置,让服务器每隔一段时间自动执行一次 BGSAVE 命令,可以设置多个保存条件,比如以下3个默认条件

# 将数据库保存到磁盘上:
#   save <秒数> <更改数>
#   如果满足给定的秒数和对数据库的写操作次数,则保存数据库。
#   在下面的示例中,行为将是:
#   当至少有1个键发生更改时,每900秒(15分钟)保存一次
#   当至少有10个键发生更改时,每300秒(5分钟)保存一次
#   当至少有10000个键发生更改时,每60秒保存一次
#   注意:您可以通过注释掉所有的 "save" 行来完全禁用保存功能。
#   也可以通过添加一个只有一个空字符串参数的保存指令来删除所有先前配置的保存点,如下面的示例:
#   save ""
save 900 1   #在900秒(15分钟)之内,对数据库进行了至少1次修改,则执行一次BGSAVE
save 300 10  #在300秒(5分钟)之内,对数据库进行了至少10次修改,则执行一次BGSAVE
save 60 10000 #在60秒之内,对数据库进行了至少10000次修改,则执行一次BGSAVE

1.2 实现原理

当Redis服务启动时,用户可以通过指定配置文件或者传入启动参数的方式设置save选项

如果没有主动设置,服务器就会使用redis.conf文件中默认的条件(上述3个默认条件)。

接着,服务器会根据save的选项所设置的保存条件,设置服务器状态 redisServer 结构的 saveparams 属性,除此之外,还有一个 dirty 计数器lastsave 属性

struct redisServer{
    //....
    //记录了保存条件的数组
    struct saveparam *saveparams;
    //修改计数器
    long long dirty;
    //上一次执行保存的时间
    time_t lastsave;
    //.....
};
  • saveparams属性:是一个数组,每个 saveparams 结构都保存了一个save选项设置的保存条件:
struct saveparam{
    //秒数
    time_t seconds;
    //修改数
    int changes;
};
  • dirty 属性:记录上一次成功成功执行 SAVE 命令或 BGSAVE 命令之后,服务器对数据库(全部数据库)进行了多少次修改(包括写入、删除、更新等操作)

  • lastsave 属性:是一个UNIX时间戳,记录服务器上一次成功执行 SAVE 或 BGSAVE 命令的时间。

Redis的服务器有一个周期性操作函数serverCron,它每隔100ms就会执行一次,该函数用于对正在运行的服务器进行维护,其中的一项工作就是检查save选项所设置的保存条件是否已满足,如果满足就执行BGSAVE命令。

2. AOF

Append Only File,采用日志的形式来记录每个写操作,并追加到文件中。

默认不开启,可在redis.conf文件中配置

Redis 重启会根据日志文件的内容将写命令从前到后执行一遍来恢复数据,解决生成 RDB 文件后数据不能实时一致的问题

2.1 实现方式

AOF持久化功能的实现可以分为命令追加(append)、文件写入、文件同步(sync)三个步骤

  • 命令追加:服务器在执行完一个写命令后,会将被写命令追加到服务器状态的aof_buf缓冲区的末尾

  • 文件写入:将aof缓冲区的数据写入到AOF文件,此时数据并没有写入到硬盘,而是拷贝到了内核缓冲区page cache(操作系统),等待内核将数据写入硬盘;具体内核缓冲区的数据什么时候写入到硬盘,由内核决定。

  • 文件同步:将内核缓冲区中的数据写入到硬盘中的AOF文件中。

如果由内核决定将内核数据写入硬盘的话,如果服务器宕机,那么就会丢失数据。为了解决这个问题,系统提供了 fync 和 fdatasync 两个同步函数,它们可以强制让操作系统立即将缓冲区中的数据写入到硬盘,以及三种策略:

  • always:同步写回,每个写命令执行完立刻同步地将日志写回磁盘。(性能最差,最多丢失一个写指令的数据)
  • everysec(默认):每秒执行一次。(是性能和数据安全性的折中方案,最多也就丢一秒的数据)
  • no:根据操作系统和资源的情况,一定时间执行一次,时间不确定。(性能最好,可能会丢失上次同步AOF文件之后的所有写命令数据)

2.2 AOF文件载入

因为AOF文件里包含了所有写命令,所以服务器只要读入并重新执行一遍AOF文件里面的命令,就可以还原服务器关闭之前的数据,详细步骤如下:

  1. 创建一个不带网络连接的伪客户端(fake client):因为Redis的命令只能在客户端上下文中执行,而载入AOF文件时所使用的命令直接来源于AOF文件而不是网络连接,所以服务器使用了一个没有网络连接的伪客户端来执行AOF文件保存的写命令,伪客户端执行命令的效果和带网络连接的客户端执行命令的效果完全一样。
  2. 从AOF文件中分析并读取出一条写命令。
  3. 使用伪客户端执行被读出的写命令。
  4. 一直执行步骤2和步骤3,直到AOF文件中的所有写命令都被处理完毕为止。

当完成以上步骤之后,AOF文件所保存的数据库状态就会被完整地还原出来,流程如下图所示:
在这里插入图片描述

2.3 AOF重写

AOF 持久化是通过保存被执行的写命令来记录数据库状态的,所以随着服务器运行时间的流逝,AOF文件中的内容会越来越多,文件的体积也会越来越大

Redis重写功能的大致流程如下:

  • Redis 会启动一个 AOF 重写子进程,负责执行 AOF 重写操作。同时,Redis 会继续处理新的写入命令,并将这个写命令发送给AOF缓冲区和AOF重写缓冲区。
  • 子进程会按照一定的规则,读取当前数据库的键值对,并将其转化为合适的命令格式,保存到AOF重写缓冲区中。
  • 子进程在遍历完整个数据库之后,就完成了重写工作。
  • 接着,服务器父进程就会执行以下操作:
    • 将AOF重写缓冲区中的所有内容写入到新的AOF文件中,使得新的AOF文件于当前数据库中的数据一致。
    • 对新的AOF文件进行改名,原子地(atomic)覆盖现有的AOF文件,完成新旧两个AOF文件的替换。
  • 最后,Redis 会关闭并销毁旧的 AOF 文件。

AOF缓冲区:无论重不重写都有这个缓冲区,AOF日志写入是AOF缓冲区->AOF文件
AOF重写缓冲区:AOF重写子进程启动后开始使用。

2.4 重写触发

手动触发:手动执行 BGREWRITEAOF 命令,开始重写 aof 文件
自动触发:可以在 redis.conf 文件中修改对应的配置,让服务器自动执行 BGREWRITEAOF 命令。

3. RDB vs AOF

RDB 和 AOF 在数据可靠性、性能、存储空间、使用场景等方面都有不同的优缺点,具体可以根据实际业务需求和硬件条件选择合适的持久化机制,或者同时使用两种持久化机制来实现更高的数据可靠性

3.1 RDB

优点:

  1. 只有⼀个紧凑的⼆进制文件 dump.rdb ,非常适合备份、全量复制的场景
  2. 容灾性好,可以把 RDB 文件拷贝道远程机器或者⽂件系统张,用于容灾恢复。
  3. 恢复速度快,RDB 恢复数据的速度远远快于 AOF 的⽅式

缺点:

  1. 实时性低,RDB 是间隔⼀段时间进行持久化,没法做到实时持久化、秒级持久化。如果在这⼀间隔事件发生故障,数据会丢失。
  2. 存在兼容问题,Redis 演进过程存在多个格式的 RDB 版本,存在老版本 Redis 无法兼容新版本 RDB 的问题。

3.2 AOF

优点:

  1. 实时性好,aof 持久化可以配置 appendfsync 属性,有 always ,每进行⼀次命令操作就记录到 aof 文件中⼀次。
  2. 通过 append 模式写⽂件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据⼀致性问题

缺点:

  1. AOF 文件比 RDB 文件大,且恢复速度慢
  2. 数据集大的时候,比 RDB 启动效率低

3.3 如何选择?

  • 一般来说, 如果想达到足以媲美数据库的 数据安全性,应该同时使用两种持久化功能。在这种情况下,当 Redis 重启的时候会优先载入 AOF 文件来恢复原始的数据,因为在通常情况下 AOF文件保存的数据集要比 RDB 文件保存的数据集要完整。
  • 如果 可以接受数分钟以内的数据丢失,那么可以 只使用 RDB 持久化
  • 有很多用户都只使用 AOF 持久化,但并不推荐这种方式,因为定时生成 RDB 快照 (snapshot)非常便于进行数据备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快,除此之外,使用 RDB 还可以避免 AOF 程序的 bug。
  • 如果只需要数据在服务器运行的时候存在,也可以不使用任何持久化方式

4. Redis 4.0 混合持久化

重启 Redis 时,我们很少使用 RDB 来恢复内存状态,因为会丢失大量数据。

我们通常使用 AOF 日志重放,但是重放 AOF 日志性能相对 RDB 来说要慢很多,这样在 Redis 实很大的情况下,启动需要花费很长的时间。

Redis 4.0 为了解决这个问题,带来了一个新的持久化选项–混合持久化

将 rdb 文件的内容和增量的 AOF 日志文件存在一起。

这里的 AOF 日志不再是全量的日志,而是 自持久化开始到持久化结束 的这段时间发生的增量 AOF 日志,通常这部分 AOF 日志很小,如下图所示
在这里插入图片描述
于是在 Redis 重启的时候,可以先加载 rdb 的内容,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放,重启效率因此大幅得到提升。

优点:混合持久化结合了 RDB 和 AOF 持久化的优点,开头为RDB格式,可以使Redis启动的更快,同时结合AOF的优点,又降低了大量数据丢失的风险。

缺点:在 AOF 文件中添加了 RDB 格式的内容,使得 AOF 文件的可读性变得很差;如果开始混合持久化,那么混合持久化的 AOF 是不能在旧版本中用的,不能向下兼容


参考《Redis设计与实现》& 二哥的面渣逆袭,加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2061565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python和MATLAB谐波生成导图

&#x1f3af;要点 绘制三次谐波生成透射功率谱、对数对数图表示半导体曲面二次谐波生成&#xff0c;分析判断材料特性谐波均值估计计算边际似然&#xff08;贝叶斯统计&#xff09;二次谐波散射分析胶体染料分子结构交流电谐波波形傅立叶分析分析旋转各向异性谐波高次谐波非线…

TMGM:7月日本贸易收支可能受到显著走强的日元影响

经济学家和市场参与者预计今年将再次加息美联储可能助推美元/日元的看跌延续 7月日本贸易平衡可能受到显著走强的日元影响7月日本的贸易平衡比预期更差&#xff0c;但赤字大约是5月的一半&#xff0c;约为1月的三分之一。7月进口量增长超出预期&#xff0c;而较强的日元可能影…

模型 闭环原理

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。反馈驱动&#xff0c;持续循环&#xff0c;缺陷亦被放大。 1 闭环原理的应用 1.1 闭环原理解读 AI自我训练&#xff0c;从人工智能变成人工智障 这里主要使用闭环原理来解释 AI 自我训练导致的问题。…

基于STM32F103的FreeRTOS系列(十一)·信号量·二值信号量与计数信号量详细使用以及移植教程

目录 1. 信号量简介 1.1 同步和互斥 1.1.1 同步 1.1.2 互斥 1.1.3 总结 1.2 分类 1.2.1 二值信号量 1.2.2 计数信号量 1.2.3 互斥信号量 1.2.4 递归信号量 2. 信号量控制块 3. 常用信号量API函数 3.1 创建信号量函数 3.1.1 创建二值信号量 xSemap…

实验七:独立按键实验

硬件电路图和题目; LED1-LD8是 P2口8个管脚 mian.c #include<reg52.h>sbit But1=P3^1 ; sbit But2=P3^0 ; sbit But3=P3^2 ; sbit But4=P3^3 ;sbit LED1 =P2^0 ; sbit LED2 =P2^1 ; sbit LED3 =P2^2 ; sbit LED4 =P2^3 ;#define PRESS_1 1 #define PRESS_…

数据库多表设计:深入理解一对多、一对一、多对多关系 【后端 12】

数据库多表设计&#xff1a;深入理解一对多、一对一、多对多关系 在数据库设计中&#xff0c;表之间的关系决定了如何组织和存储数据。常见的表关系包括一对多、一对一和多对多。在不同的业务场景下&#xff0c;我们会选择不同的关系模式进行数据库设计。本文将通过具体案例介绍…

linux Qt QkeyEvent及驱动键盘按键捕获

基于正点原子 QT中有专门的类处理键盘事件的类QKeyEvent 1.include “QKeyEvent” 查看它的说明中的描述 也就是说接受按键事件在keyPressEvent和keyReleaseEvent这两个函数&#xff0c;继续查看 重构这个函数 查看输入的QKeyEvent类&#xff0c;发现有一个方法key返回哪一个按…

MinerU pdf文档解析markdown格式、内容提取

参考&#xff1a; https://github.com/opendatalab/MinerU/blob/master/README_zh-CN.md demo在线网址&#xff1a; https://opendatalab.com/OpenSourceTools/Extractor/PDF/detail

Robot Operating System——创建动态链接文件项目的步骤

大纲 初始化环境创建Package代码添加依赖&#xff08;package.xml&#xff09;修改编译描述find_package寻找依赖库指定代码路径和编译类型&#xff08;动态库&#xff09;设置头文件路径链接依赖的库 编译测试参考资料 在 《Robot Operating System——创建可执行文件项目的步…

大数据-93 Spark 集群 Spark SQL 概述 基本概念 SparkSQL对比 架构 抽象

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

VMware虚拟机nat无法联通主机

VMware在nat模式下主机无法ping通虚拟机 原因&#xff1a; 虚拟机和对应的网卡不在一个网段 虚拟机开启了防火墙 解决方法: 首先判断虚拟机的网络ip是否和网卡在一个网段上 判断虚拟机使用的网卡 nat模式在VMware虚拟机中一般只有一个对应的网卡 如图笔者的nat网卡为VM…

基于机器学习的二手房房价数据分析与价格预测模型

有需要本项目的可以私信博主&#xff0c;提供远程部署讲解 本研究聚焦重庆二手房市场&#xff0c;通过创新的数据采集和分析方法&#xff0c;深入探讨影响房价的关键因素&#xff0c;并开发了预测模型。 我们首先利用Python编写的爬虫程序&#xff0c;巧妙规避了链家网站的反…

ClickHouse实时探索与实践 京东云

1 前言 京喜达技术部在社区团购场景下采用JDQFlinkElasticsearch架构来打造实时数据报表。随着业务的发展 Elasticsearch开始暴露出一些弊端&#xff0c;不适合大批量的数据查询&#xff0c;高频次深度分页导出导致ES宕机、不能精确去重统计&#xff0c;多个字段聚合计算时性能…

初识Linux · 权限

目录 前言&#xff1a; 1 预备知识 2 权限 2.1 文件的基本权限 2.2 修改权限的第一种做法 2.3 修改权限的第二种做法 2.4 权限的对比 2.5 文件类型 前言&#xff1a; 继上文我们将常用的指令介绍的七七八八了&#xff0c;本文着重探索Linux文件中的权限部分&#xff0…

docker部署postgresSQL 并做持久化

先安装docker&#xff0c;安装docker 方法自行寻找方法 然后安装pgsql 拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres:latest运行容器 docker run -it --name postgres --privileged --restart always -e POSTGRES_PASSWORDZ6n8g4zJzC3mr…

手动与自动修复mfc140u.dll丢失的解决方法,mfc140u.dll在电脑中是什么样的存在

当您遇到“mfc140u.dll丢失”的错误时&#xff0c;通常意味着计算机上缺少Microsoft Foundation Class (MFC) 库的特定版本&#xff0c;该库是Visual Studio 2015的一部分。这种问题往往在启动某些应用程序或游戏时出现&#xff0c;并显示如“无法启动该程序&#xff0c;因为计…

可变参数模板(C++11)

这篇文章讲解的是C11的特性之一——可变参数模板&#xff0c;适合有一定基础的同学学习&#xff0c;如果是刚入门的同学可以看我过往的文章&#xff1a;C基础入门 可变参数模板&#xff08;Variadic Templates&#xff09;是C的一种高级特性&#xff0c;它允许你编写接受任意数…

8.20T3 无损加密(线性代数转LGV+状压dp+高维前缀和)

http://cplusoj.com/d/senior/p/NODSX2301C 对于式子&#xff1a; 这个神秘的线性代数形式比较难处理&#xff0c;但我们可以考虑其组合意义。行列式现存的可用组合意义之一就是LGV&#xff08;矩阵式不太可用&#xff09; 先把原先的矩阵转化为一个有向图。现在我们要构造一…

笔记本电脑无线网卡突然没有了

目录 笔记本电脑无线网卡突然没有了最优解决方案 笔记本电脑无线网卡突然没有了 记录一次笔记本无线网卡突然没有了的解决方案 显示黄色感叹号&#xff0c;试了几个安装驱动的软件都不行 最优解决方案 找到网卡的厂商官网&#xff0c;官网上下载驱动 比如我的无线网卡是Int…

【Hot100】LeetCode—146. LRU 缓存

目录 1-思路1-1 LRU知识点1-2 实现思路LRU的子数据结构① 双向链表 DLinkedNode 结点定义② 其他字段 LRU实现的方法① 初始化——LRUCache中初始化② public int get(int key) 取元素方法③ public void put(int key, int value) 存元素方法 2-实现⭐146. LRU 缓存——题解思路…