Redis持久化(RDB、AOF、混合持久化)

news2024/9/18 11:42:13

目录

1、持久化机制

(1)RDB

(2)AOF

2、混合持久化

3、总结


为什么需要持久化?

Redis 是一个基于内存的键值存储系统,它提供了非常快的数据访问速度,因为它不需要像传统的磁盘存储那样进行物理 I/O 操作

然而,这也意味着 Redis 中的数据是易失性的,即一旦 Redis 服务停止或者机器重启,所有的数据都会丢失

如果没有持久化机制,那么Redis中的数据将会丢失无法恢复。有了持久化机制,Redis在下次重启时可以利用之前持久化的文件进行数据恢复

1、持久化机制

Redis支持的两种持久化机制:

54bedb6184264a47b5bbf437d080406b.png

RDB:RDB文件是一个经过压缩的二进制文件

AOF:AOF则是以追加写的方式记录Redis执行的每一条写命令。

RDB 是 Redis 默认的持久化方式(AOF默认是关闭的)

RDB 和 AOF 是可以同时开启的,在这种情况下,当Redis重启的时候会优先载入 AOF 文件来恢复原始的数据

(1)RDB

RDB(Redis DataBase):把当前全部数据生成快照保存在硬盘上

RDB在指定的时间间隔内将内存中的数据集快照写入磁盘,它恢复时是将快照文件直接读到内存里

优点:生成的RDB文件较小,恢复数据的速度快且简单,适用于大规模数据备份和恢复

缺点数据可能会丢失,因为 Redis 只会在指定的时间点生成快照文件。如果Redis进程在持久化过程中发生意外中断,可能会导致数据丢失

RDB持久化可以手动触发,也可以自动触发,savebgsave命令都可以手动触发RDB持久化

  • save:save 命令会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求。

  • bgsave:bgsave 命令会 fork 一个子进程(注意是子进程,不是子线程)在后台生成快照文件,不会阻塞 Redis 服务器,服务器进程(父进程)可以继续处理命令请求。

当客户端发服务发出bgsave命令时,Redis服务器主进程会forks一个子进程来数据同步问题,在将数据保存到rdb文件之后,子进程会退出

简而言之RDB持久化的步骤:

  1. Redis会定期fork一个子进程
  2. 子进程会首先将数据集写入一个临时文件
  3. 当临时文件写入完成后,Redis会用这个临时文件替换上次持久化的

配置示例:

RDB可以通过配置自动触发快照的频率,例如在N秒内执行了M次写操作时

在Redis配置文件(redis.conf)中配置RDB的保存方式和频率,如下所示:

save 900 1         # 在900秒内,如果至少有1个键被修改,则执行一次RDB快照
2save 300 10        # 在300秒内,如果至少有10个键被修改,则执行一次RDB快照
3save 60 10000      # 在60秒内,如果至少有10000个键被修改,则执行一次RDB快照

(2)AOF

AOF(Append Only File):记录每次对数据的操作到硬盘上

AOF持久化是把每次写命令追加写入日志中,当需要恢复数据时重新执行AOF文件中的命令就可以了。AOF解决了数据持久化的实时性,也是目前主流的Redis持久化方式,采用先写内存,后写日志

优点:数据更加持久,可以保证每一条写入命令都被持久化

缺点:生成的AOF文件较大,恢复数据的速度相对较慢

配置示例:

appendonly yes                # 启用AOF持久化
appendfsync everysec          # 每秒钟将写操作同步到AOF文件
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

从持久化中恢复数据

如果选择持久化方案,可以这样选择:

  1. 业务对于数据丢失不敏感,选 RDB

  2. 业务对数据完整性要求比较高,选 AOF

如果一台服务器上有既有RDB文件,又有AOF文件,该加载谁呢?==>优先AOF

数据的备份、持久化做完了,我们如何从这些持久化文件中恢复数据呢?

其实想要从这些文件中恢复数据,只需要重新启动Redis即可

📌选择合适的持久化方式

🔴RDB 通常用于需要快速恢复数据的情况,因为它只需要加载一个文件即可恢复数据。

🔴AOF 更适合需要更高数据完整性的场景,因为它可以记录每一次写操作,从而提供接近实时的数据恢复能力。

2、混合持久化

RDB、AOF持久化都有所弊端:

  • RDB 持久化能够快速地储存和恢复数据,但是在服务器停机时可能会丢失大量数据。

  • AOF 持久化能够有效地提高数据的安全性,但是在储存和恢复数据方面却要耗费大量的时间

为了让用户能够同时拥有上述两种持久化的优点

Redis 4.0 中提出了 RDB-AOF 混合持久化,混合使用 AOF日志和内存快照的方法

简单来说,内存快照以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作

类似下面这样:

这样一来,快照不用很频繁地执行,这就避免了频繁 fork 对主线程的影响。而且,AOF 日志也只用记录两次快照间的操作

也就是说,不需要记录所有操作了,就不会出现文件过大的情况了,也可以避免重写开销

配置方式:

appendonly yes。           # 启用AOF持久化
aof-use-rdb-preamble yes   

3、总结

Redis 需要持久化主要是为了保证数据的安全性和持久性,防止数据丢失

Redis 持久化功能默认是开启的,这样做的目的也是为了保证程序的稳定性,防止缓存雪崩、缓存击穿等以及保证数据不丢失。

若要手动关闭 Redis 持久化,需要将 RDB、AOF 和混合持久化全部关闭才行,并且关闭之后需要重启 Redis 服务才能生效

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

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

相关文章

竞猜足球核心算法源码

需要实现的功能如下: 仅用于学习 竞猜足球核心算法源码 package com.lotterysource.portsadmin.service; import com.aliyun.oss.common.utils.DateUtil; import com.fasterxml.jackson.core.type.TypeReference; import com.lotterysource.portsadmin.dbprovid…

进存销系统

摘 要 伴随着我国全面推动信息化的趋势,我国的很多行业都在朝着互联网的方向进发。商品销售行业也有很多挑战。这次论文介绍的进存销系统就是为了能够解决当前传统商品进存销存在的问题,使得商品进存销能够更加有效率。电商智能化管理必不可少的帮手有进…

功能安全实战系列02-RamTst(RamTest)开发介绍

本文框架 前言1. What(RamTst相关概念)1.1 后台检测1.2 前台检测1.3 RamTst对应状态机2.How?2.1 接口调用2.2 配置开发2.3 测试模式选择前言 在本系列笔者将结合工作中对功能安全实战部分的开发经验进一步介绍常用,包括Memory(Flash,Ram)失效检测,程序运行时序时间检测,及…

数字模拟IC设计前端、后端、前仿、后仿新版虚拟机

虚拟化平台:VMware Workstation 15 Pro以上版本 操作系统:CentOS Linux release 7.9.2009 (Core) 一、射频模拟IC设计必备软件 Cadence IC06.18.350/IC23.10.080(virtuoso) Cadence SPECTRE23.10.538-isr10 Cadence ASSURA04.…

Python优化算法15——麻雀搜索算法(SSA)

科研里面优化算法都用的多,尤其是各种动物园里面的智能仿生优化算法,但是目前都是MATLAB的代码多,python几乎没有什么包,这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考:Python优化算…

Mozilla为本地音频到文本翻译开发Whisperfile引擎

Mozilla Ocho 小组正进行 Mozilla 的"创新和实验"。Llamafile 用于将大型语言模型以单个文件的形式发布,以便在不同的硬件/软件间轻松执行。Whisperfile 是一项将音频轻松转化为文本的新引擎。 正如其名称所暗示的,Whisperfile 是围绕 OpenAI…

嵌入式UI开发-lvgl+wsl2+vscode系列:10、控件(Widgets)(三)

1、scale(标尺) 示例1 #include "../../lv_examples.h" #if LV_USE_SCALE && LV_BUILD_EXAMPLES/*** 简单的水平标尺*/ void lv_example_scale_1(void) {lv_obj_t * scale lv_scale_create(lv_screen_active());lv_obj_set_size(sca…

MyBatis源码(6)拦截器

1、目标 本文的主要目标是学习MyBatis拦截器的源码,本文将以插入操作为例debug拦截器相关的源码 2、拦截器源码分析 调用mapper接口的insert插入记录方法,会调用SqlSession对象的insert方法 SqlSession执行insert方法 Spring容器会创建SqlSessionTemp…

Python画笔案例-011 绘制草帽

1、绘制草帽 通过 python 的turtle 库绘制一个草帽的图案,如下图: 2、实现代码 绘制以上草帽的图案,代码如下: """草帽.py """ import turtle # 导入海龟模块turtle.delay(20) …

多动症的孩子有哪些症状表现?

在星启帆自闭症儿童康复机构,我们不仅关注自闭症儿童的成长与康复,也深刻认识到多动症对儿童日常生活、学习和社交的深远影响。多动症,全称注意缺陷多动障碍,是一种常见于儿童时期的神经发育性疾病,其症状表现多种多样…

Python优化算法16——鲸鱼优化算法(WOA)

科研里面优化算法都用的多,尤其是各种动物园里面的智能仿生优化算法,但是目前都是MATLAB的代码多,python几乎没有什么包,这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考:Python优化算…

ChatGPT不同模型在论文写作中的优势和应用

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 ChatGPT在论文写作中的应用日益广泛。作为OpenAI开发的先进语言模型,ChatGPT有多个版本,包括GPT-3.5、GPT-4.0和GPT-4.0-mini,每个版本在性能和应用方…

如何解决Docker启动时报Status: unknown flag: --graph问题

最近在进行Docker环境迁移时,用二制对Docker进行了重新安装,一切配置好之后,启动Docker时,服务启动不起来,使用journalctl -xe命令查看,报出以下错误: [rootapp docker]# journalctl -xe 8月 2…

【css】伪元素实现图片悬停文字聚焦效果

实现重点: 文字覆盖在图片上: 通过使用 position: absolute 将 .box 文字盒子定位在图片上方。父容器 .img-wrap 使用了 position: relative 确保子元素的绝对定位在父容器的边界内生效。 创建悬停效果: 通过使用 &::before 和 &::…

Android PopupWindow弹窗动态显示在View的上下方,

序、周末不加班, 效果图如下。 我们要弹出的PopupWindow在View的下方,如果下方区域不够,则弹出在上方。 实现方案思路 我们在显示的时候,首先去计算一下弹窗高度。使用屏幕的高 - popupwind的高并且和popup的高做对比&#xff0…

ASP.NET Core SignalR 构建高效实时通信应用

目录 前言 SignalR的基本概念及其工作原理 1、核心概念 2、工作原理 前端环境准备 1、安装SignalR 2、创建SignalR连接 3、设置自动重新连接 4、监听连接状态 5、初始化连接 后端环境准备 1、注册SignalR 2、设置Hub 3、配置路由 4、发送和接收消息 实现聊天应用…

GraphRAG层级多标签文本分类任务实战(1)

1.概述 GraphRAG的本质是调用LLM生成知识图谱,然后在回答问题时检索相关内容输到prompt里,作为补充知识来辅助回答。那么有没有可能将这运用到层级多标签文本分类(HMTC)任务中呢? 当然,乍一听有一点天方夜谭&#xf…

3 pytest Fixture

目录 3.1 通过 conftest.py 共享 fixture3.2 使用 fixture 执行配置及销毁逻辑3.3 使用 --setup-show 回溯 fixture 的执行过程3.4 使用 fixture 传递测试数据3.5 使用多个 fixture3.6 指定 fixture 作用范围3.7 使用 usefixtures 指定 fixture3.8 为常用 fixture 添加 autouse…

vue开发区分开发环境和生产环境,以及预发布环境

vue开发区分开发环境和生产环境,以及预发布环境 在根目录创建 .env[mode] 文件,在项目执行 npm run dev 的时候vite会自动去读取.env.development文件里面的配置,执行npm runbuild进行打包之后也会自动将.env.production的内容打包进去&…

MyBatis使用:拦截器,SpringBoot整合MyBatis

1、目标 本文的主要目标是学习使用MyBatis拦截器,并给出拦截器的实例 2、拦截器的使用 2.1 Intercepts注解和Signature注解 Intercepts注解,指定拦截哪个拦截器的哪个方法,还要指定参数,因为可能发生方法重载 按照顺序可以拦…