当前位置: 首页 > news >正文

【从零开始学习Redis | 第十一篇】快速介绍Redis持久化策略

前言: 

        Redis 作为一种快速、高效的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景。然而,由于其特性是基于内存的,一旦服务器进程退出,内存中的数据就会丢失。为了解决这一问题,Redis 提供了持久化功能,可以将内存中的数据保存到硬盘上,以便在服务器重启时恢复数据。持久化是 Redis 的关键特性之一,对于确保数据的安全性和可靠性至关重要。本文将深入探讨 Redis 的持久化策略,包括常用的持久化方式以及各自的优缺点

目录

前言: 

RDB:

执行方式: 

缺点:

AOF:

工作原理:

执行方式:

总结:


当Redis崩溃之后,Redis中的数据就会丢失掉。在Redis重建缓存的过程中,如果有大量请求访问,就会直接打到MySQL中,有可能会导致MySQL崩溃。

归根结底是因为:我们没有给Redis中的数据做持久化。而Redis本身它是有持久化策略的,那就是RDBAOF

RDB:

RDB  的全称是Redis Database Backup file(Redis数据备份文件),也叫做Redis数据快照。

  1. 工作原理

    • Redis 在指定的时间间隔内(由用户配置),将内存中的数据库状态以快照的形式保存到磁盘上。
    • Redis 会 fork 出一个子进程来执行保存操作,父进程继续处理客户端请求。这样可以避免阻塞主进程,保证了服务的正常响应。
  2. 生成的文件

    • RDB 文件是一个经过压缩的二进制文件,通常以 .rdb 为扩展名。
    • RDB 文件记录了 Redis 在某个时间点上的数据库状态,包括所有的键值对、过期时间、数据库配置等信息。

执行方式: 

手动执行RDB:

Redis主进程执行RDB,阻塞其他命令

SAVE

 Redis子进程执行RDB,主进程仍然可以接收命令

BGSAVE

自动执行RDB:

Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

这里官方为我们提供了三种RDB的触发频率:

  • 每 3600 秒(1 小时),如果至少有 1 次写操作;
  • 每 300 秒(5 分钟),如果至少有 100 次写操作;
  • 每 60 秒,如果至少有 10000 次写操作。

 BGSAVE的命令流程:

BGSAVE有一个问题:当我们开启子进程去写RDB文件的时候,此时主进程仍然是可以接受用户命令的。在这个过程中就可能会出现脏数据。 

缺点:

  1. 全量备份

    • RDB 是一种全量备份方式,它只会保存生成 RDB 文件时的数据库状态。这意味着如果 Redis 服务器意外崩溃,最后一次保存后的所有数据更改都将丢失。对于一些对数据完整性要求极高的应用,这种全量备份的方式可能不够理想。
  2. 数据丢失风险

    • RDB 持久化的保存间隔可以设置得很长,例如默认的每小时一次,或者更长。如果 Redis 服务器在两次保存之间崩溃,将会丢失整个时间段内的所有更改,导致数据丢失的风险。
  3. 性能开销

    • 在执行 RDB 持久化时,Redis 会 fork 出一个子进程来执行保存操作。这个过程中需要消耗一定的系统资源和时间,可能会影响 Redis 服务器的性能。特别是在数据量较大、保存频率较高的情况下,保存操作可能会导致系统负载升高,甚至影响到用户请求的响应时间。
  4. 不适合实时备份

    • 由于 RDB 是全量备份,生成 RDB 文件的过程可能会消耗大量的时间和资源,因此不适合在实时或高频率的数据备份场景中使用。如果需要实时备份,可能需要考虑其他方式,比如使用 AOF(Append-Only File)持久化方式。
  5. 可用性和恢复时间

    • 在使用 RDB 持久化时,恢复数据通常需要加载整个 RDB 文件,这可能会导致较长的恢复时间,尤其是当数据量较大时。这会影响 Redis 服务器的可用性,特别是在紧急情况下需要快速恢复服务时。

我们可以简单的理解把RDB理解为定期持久化内存数据库中的所有数据

AOF:

AOF全程叫做 Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF中,可以看作是命令日志文件。

工作原理:

  1. 追加写入

    • Redis 将每个写操作以追加的方式记录到 AOF 文件末尾,而不是像 RDB 那样周期性地保存整个数据集的快照。这意味着 AOF 文件包含了重放服务器写操作所需的所有信息。
  2. 重放恢复

    • 当 Redis 重新启动时,它会按顺序重放 AOF 文件中的写操作,以恢复服务器的状态。通过逐行执行 AOF 文件中的命令,Redis 可以将数据集恢复到最后一次保存时的状态。
  3. 重写机制

    • 为了避免 AOF 文件过大而影响性能,Redis 提供了 AOF Rewrite 机制。AOF Rewrite 会在后台启动一个子进程,该进程会重新生成一个新的 AOF 文件,但新文件的大小通常会比原始文件小得多,因为它只包含重要的写操作指令。重写后的 AOF 文件可以替代原始文件,以节省磁盘空间并提高性能。

执行方式:

AOF默认是关闭的,我们可以通过修改redis.conf配置文件来开启AOF:

AOF文件的名称: 

 AOF执行策略:

官网一共为我们提供了三种执行策略:

配置项刷盘时机优点缺点
Always同步刷盘可靠性高,几乎不丢数据对性能要求高
everysec每秒刷盘性能适中最多丢失一秒数据
no操作系统控制性能最好可靠性差,可能会丢失大量数据

可以用图来展示AOF的机制 

这里其实就暴漏了AOF的一个问题:可能会记录大量无意义的命令。比如我们记录对一个Key的多次写操作,但是只有最后一次才有意义。

通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同的效果。而Redis也会在阈值触发的时候自动重写AOF文件,阈值也可以在redis.conf中进行配置:

总结:

         Redis 的持久化策略是确保数据安全性和可靠性的重要手段之一。通过持久化,Redis 可以将内存中的数据定期写入到硬盘上,从而在服务器重启时能够恢复数据。本文介绍了 Redis 的两种主要持久化方式:RDB(Redis DataBase)AOF(Append Only File),并分析了它们各自的优缺点。RDB 方式适用于备份和恢复大量数据,而 AOF 方式则适用于实时数据的持久化和灾难恢复。合理选择和配置持久化方式,可以根据业务需求和性能要求来平衡数据的安全性和性能。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

相关文章:

【从零开始学习Redis | 第十一篇】快速介绍Redis持久化策略

前言: Redis 作为一种快速、高效的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景。然而,由于其特性是基于内存的,一旦服务器进程退出,内存中的数据就会丢失。为了解决这一问题,Redis 提供了持久…...

在Ubuntu中如何解压zip压缩包??

2024年5月15日,周三上午 使用 unzip 命令 unzip 文件名.zip这会将压缩包中的内容解压到当前目录。如果想解压到特定目录,可以使用 -d 选项,例如: unzip 文件名.zip -d 目标目录使用 7-zip 还可以安装 7-zip 工具来解压 ZIP 文件。…...

LeetCode 126题:单词接龙 II

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣! 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航: LeetCode解锁100…...

5.14(Vue2)

1.单页应用程序是指所有功能都在一个html页面上 单页面应用程序,之所以开发效率高,性能好,应用体验好,最大的原因就是:页面按需更新。 2.Vue中的路由 路径和组件的映射关系 Vue中的路由插件:VueRouter&…...

使用openssl生成自签名证书

使用openssl生成自签名证书 1. 交互式生成2. 一步生成参考 1. 交互式生成 自签名 SSL 证书的生成涉及一个简单的 3 步过程: 步骤 1:创建服务器私钥 openssl genrsa -out cert.key 2048步骤 2:创建证书签名请求 (CSR) openssl req -new -k…...

【java】泛型

文章目录 1. 什么是泛型?1.1 背景1.2 泛型的概念1.3 泛型的好处 2. 泛型类、接口...2.1 泛型类2.2 从泛型类派生子类2.2.1 子类也是泛型类,子类和父类的泛型类型要一致2.2.2 子类不是泛型类,父类要明确泛型的数据类型 2.3 泛型接口2.4 泛型方…...

计算思维的理解

2006年,卡内基梅隆大学周以真教授首次系统性地定义了计算思维。这一年,她在美国计算机权威期刊《Communications of the ACM》上发表了题为《Computational Thinking》的论文,由此开启了计算思维大众化的全新历程。 周以真(Jeanne…...

Python中tkinter编程入门4

在Python中tkinter编程入门3-CSDN博客中创建了Button控件,点击该控件就会产生一个点击事件,在创建Button控件时指定该点击事件的处理程序后,按键控件就会对用户的点击事件产生响应。 1 定义事件处理器 定义事件处理器就是一个自定义的函数。…...

Milvus的系统架构

简介 Milvus的构建在许多知名的向量搜索库比如Faiss, HNSW, DiskANN, SCANN等之上的,它针对稠密向量数据集的相似搜索而设计,能支持百万、十亿甚至万亿级别的向量搜索。 Milvus支持数据分片,流式数据插入,动态schema&#xff0c…...

MFC中关于CMutex类的学习

MFC中关于CMutex类的学习 最近在项目中要实现两个线程之间的同步,MFC中提供了4个类,分别是CMutex(互斥量)、CCriticalSection(临界区)、CEvent(事件对象)、CSemaphore(信号量)。有关这4个类的说明,大家可以参考微软官方文档: CM…...

删除表空间

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 当某个表空间中的数据不再需要时,或者新创建的表空间不符合要求时,可以考虑删除这个表空间。若要删除表空间,则需要用户具有 DROP TABLESP…...

下载element-ui报错

此错误表示尝试从npm注册表下载“resize observer polyfill”包时超时。这可能是由于网络连接问题或npm注册表服务器的问题。 要解决此问题,您可以尝试以下步骤: 1.重试npm install命令:有时,网络问题会导致临时超时。再次运行npm…...

[原创](Modern C++)现代C++的std::bind花式绑定,使用方式大全.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…...

Unity射击游戏开发教程:(13)如何在Unity中播放音效

在本文中,我将向大家展示一些为游戏添加声音的不同方法。 我们为游戏添加声音的第一种方法是播放背景音乐。在此,我们将创建游戏对象(“音频管理器”)并创建一个子游戏对象(“背景音乐”)。该子游戏对象将是播放音乐的对象,因此需要向其添加音频源组件。如果没有音频源组…...

Swift—手写防抖、手写图片预加载与多张图片拼接

什么是防抖,为什么要防抖? 比如我们在文档在线编辑中修改文档内容,总不能打一个字就发送一次更新请求吧,用户疯狂点击一个按钮,总不能一直触发按钮的逻辑吧。防抖被用于避免频繁触发的事件。 Swift实现防抖代码&…...

Redis过期键删除策略

Redis有三种过期键的删除策略。 定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除策略。惰性删除:放任键过期不管,但每次从键空间获取键时&#xff0c…...

413 Request Entity Too Large

问题 平台上传文件接口报:413 Request Entity Too Large。 原因 从字面意思就能看出来,是上传文件过大导致的。 一般解决 一般情况下修改nginx配置文件中client_max_body_size参数的大小就行了。可以在http{ }中设置。也可以在server{ }中设置。还可…...

工业无风扇计算机的优点

无风扇计算机往往采用紧凑且密封的外形,使其坚固耐用,使其能够在需要现场工程师进行维护之前承受恶劣的环境数年。机载移动部件较少或没有移动部件会降低组件无法按预期运行的可能性,或者更糟糕的是发生故障和损坏。采用工业组件和较低的散热…...

个人学习计划

vue前端(一周) 05/14 - 05/19 Html、css复习、vue基础复习、axios复习 05/14 ElementUI学习 05/15 JWT集成验证码、token 05/16 vue-route多角色登录 05/17 增删查改、文件下载 05/18 Echart饼状图 05/19 📌 附加学习: 父子传值三…...

【电控实物-LK电机】

参数 Kt 0.11 N.M/A...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

云计算——弹性云计算器(ECS)

弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

Kafka入门-生产者

生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...