Redis7 实现持久化的三种方式

1、概述

1.1、Redis持久化的重要性

  1. 数据恢复:Redis是一个内存数据库,如果系统或服务宕机,内存中的数据将会丢失。Redis的持久化机制可以把数据保存到磁盘上,以便在系统重启后恢复数据。这是Redis持久化最基本也是最重要的功能。
  2. 故障恢复:持久化机制可以帮助Redis在出现系统或数据崩溃时,安全地复原所有数据,避免可能出现的数据丢失。这对于维护企业级Web应用系统的稳定性和可用性至关重要。
  3. 保证数据一致性:通过定期持久化,可以确保即使在数据更新频繁的情况下,也能保持数据的一致性。这对于需要保证数据准确性的应用来说是非常重要的。
  4. 支持备份和恢复:持久化文件可以定期备份到其他存储设备,这样在遇到灾难性故障时,可以从备份中恢复数据,减少损失。

1.2、持久化对Redis性能的影响

在选择和使用Redis的持久化机制时,需要根据实际的应用场景和需求来权衡持久化和性能之间的关系。例如,可以通过调整持久化的频率、使用更快的磁盘、优化磁盘I/O等方式来减少持久化对Redis性能的影响。同时,也需要关注Redis的监控和调优,及时发现和解决性能问题。

  1. 写操作的延迟:由于持久化需要将数据写入磁盘,这会导致写操作有一定的延迟。特别是在使用AOF持久化时,每次写操作都需要追加到磁盘上的日志文件,这可能会增加写操作的延迟。
  2. CPU和内存资源的占用:在进行持久化操作时,Redis需要fork一个子进程来处理持久化任务。这个过程会消耗一定的CPU和内存资源,对Redis的性能有一定的影响。尤其是在大数据量的情况下,fork操作本身可能会消耗较多的系统资源。
  3. 磁盘I/O的影响:持久化需要将数据写入磁盘,这会受到磁盘I/O性能的影响。如果磁盘性能较差,或者磁盘I/O负载较高,那么持久化操作可能会成为Redis性能的瓶颈。
  4. 数据恢复的时间:在Redis重启时,需要加载持久化文件来恢复数据。这个过程可能会消耗一定的时间,导致Redis在启动时的性能下降。

1.3、Redis的三种持久化方式概述

Redis提供了三种持久化方式,分别是RDB(Redis DataBase)持久化、AOF(Append Only File)持久化和混合持久化。下面简要概述这三种方式的工作原理和特点:

  1. RDB持久化:RDB持久化生成的快照文件是一个紧凑压缩的二进制文件,占用空间较小,适用于备份和全量复制等场景。同时,由于快照文件是完整的数据备份,因此恢复速度较快。但是,RDB持久化可能存在数据丢失的风险,因为它只保存了某个时间点的数据快照,无法记录数据的变化过程。
  2. AOF持久化:AOF持久化可以记录数据的变化过程,因此即使出现宕机等故障,也只会丢失最后一次持久化之后的数据,保证了数据的可靠性。同时,AOF文件是以文本形式存储的,易于阅读和解析。但是,AOF持久化可能会产生较大的I/O开销,并且在数据恢复时可能需要较长的时间。
  3. 混合持久化:混合持久化结合了RDB和AOF两种持久化方式的优点,既保证了数据的可靠性,又提高了数据恢复的速度。但是,混合持久化可能会增加持久化文件的复杂性和管理难度。

2、RDB持久化

RDB持久化是通过生成数据快照(Snapshot)的方式,将当前Redis进程的数据持久化到磁盘上。触发RDB持久化的方式可以是手动触发(如使用SAVE或BGSAVE命令),也可以是自动触发(如根据配置文件中指定的时间间隔和键值对数量进行触发)。

RDB持久化的方式:定时持久化(Save)、触发持久化(Save、Bgsave)。

2.1、RDB持久化的优缺点

(1)优点:

  • 数据紧凑:RDB生成的数据快照是一个紧凑的二进制文件,占用空间较小,这对于存储和传输都非常有利。
  • 恢复速度快:由于RDB文件是完整的数据备份,因此在恢复数据时,只需要加载RDB文件即可,恢复速度较快。
  • 适合备份:RDB文件非常适合用于进行备份和灾难恢复,特别是在数据量大且对恢复时间要求较高的场景下。

(2)缺点:

  • 数据丢失风险:RDB持久化只能保存某个时间点的数据快照,如果Redis进程在两次快照之间宕机,那么这期间的数据变更将会丢失。因此,RDB持久化可能无法满足对数据完整性要求较高的应用。
  • fork操作开销大:在生成RDB快照时,Redis需要fork一个子进程来进行持久化操作。这个fork操作可能会消耗较多的CPU和内存资源,对Redis的性能有一定的影响。特别是在大数据量的情况下,fork操作可能会成为性能瓶颈。
  • 版本兼容性问题:由于RDB文件使用特定二进制格式保存,因此在Redis版本更新过程中,可能存在老版本Redis服务无法兼容新版RDB格式的问题,导致数据无法正确恢复。

2.2、实现方式

(1)自动触发
修改Redis配置文件。

SAVE seconds changes
// 在seconds秒内触发了changes次写操作,就自动触发持久化

(2)手动触发
在客服端命令行中直接敲命令,redis服务器重启后失效。

SAVE // 在Redis主进程中进行数据持久化,会阻塞Redis服务器。
BGSAVE // 开辟一个Redis服务(fork)进行同步,不会造成Redis主服务器阻塞。

2.3、总结

  1. RDB持久化模式是全量持久化方式,在N秒后并且满足K条写操作,就会将这个时间段内的所有数据持久化到磁盘中的dump.rdb文件中。
  2. 尽量不要吧备份文档(dump.rdb)和Redis服务器放在同一台机器上,以防止物理机损坏后备份文件也损坏。

3、AOF持久化

AOF持久化是通过记录Redis服务器接收到的所有写操作命令,并以文本的形式追加到磁盘上的AOF文件中。当Redis重启时,会通过重新执行AOF文件中的命令来恢复数据。

在这里插入图片描述

  • Redis默认是没有开启AOF持久化的,需要在配置文件中配置:appendonly,改为yes重启服务就可以了。
  • AOF文件有一个膨胀合并的操作,当AOF文件的大小达到阈值的时候就会进行命令压缩,也就是AOF重写
  • AOF缓存区会根据写回策略将缓存区中的命令写回磁盘AOF文件中。

3.1、AOF持久化的优缺点

(1)优点:

  • 更高的数据安全性:AOF持久化可以记录Redis服务器接收到的所有写操作命令,因此即使Redis进程意外宕机,也只会丢失最后一次持久化之后的数据,从而保证了数据的可靠性。
  • 易于数据恢复:由于AOF文件以文本形式存储了所有的写操作命令,因此在数据恢复时,只需要重新执行这些命令即可,恢复过程相对简单。
  • 对Redis性能影响较小:AOF持久化在进行写操作时,只是简单地将命令追加到AOF文件中,而不会像RDB持久化那样需要fork子进程进行数据快照的生成,因此对Redis性能的影响较小。

(2)缺点:

  • 文件体积较大:由于AOF文件记录了所有的写操作命令,因此随着时间的推移,AOF文件的体积可能会变得非常大,这可能会占用大量的磁盘空间。
  • 恢复速度较慢:在Redis重启进行数据恢复时,需要逐行执行AOF文件中的命令,这可能会导致恢复速度较慢,特别是在AOF文件体积较大的情况下。
  • 可能存在数据不一致的风险:如果AOF文件在写入过程中发生错误或者损坏,可能会导致数据恢复时出现不一致的情况。此外,如果AOF文件的同步策略配置不当,也可能会导致数据丢失。

3.2、实现方式

在 Redis 中 AOF 持久化功能默认是不开启的,需要我们修改 redis.conf 配置文件中的以下参数:

appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"

3.3、写回策略

写回策略需要修改配置文件中的appendfsync指令。

appendfsync everysec  // 默认
  1. always:同步写回,每个命令执行完毕后立刻同步回磁盘。这种策略可以确保数据的完整性和安全性,因为即使Redis进程意外宕机,也不会丢失任何数据。但是,由于每次写操作都需要同步写回磁盘,会对Redis的性能产生一定的影响,特别是在高并发场景下。
  2. everysec:默认值,每隔一秒将缓存区中的命令写入磁盘AOF文件中。可以在一定程度上平衡数据的安全性和性能。但是,如果Redis进程在某一秒内意外宕机,那么这一秒内的数据将会丢失。
  3. no:由操作系统决定什么时候同步到磁盘中,这种策略可以最大化地提高Redis的性能,因为写回操作完全由操作系统控制,不会受到Redis进程的影响。但是,这也意味着数据的安全性完全依赖于操作系统的写回策略,如果操作系统出现故障或者宕机,可能会导致数据丢失。

3.4、AOF重写机制

当AOF文件的大小超过所设置的阈值后,redis就会自动启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。
可以在redis.conf文件中查看阈值:

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

或者手动使用命令来执行重写机制:bgrewriteaof

4、混合持久化

混合持久化是Redis 4.0之后新增的一种方式,结合了RDB和AOF的优点。在写入时,先将当前的数据以RDB的形式写入文件的开头,再将后续的操作命令以AOF的格式存入文件。这样既能保证Redis重启时的速度,又能降低数据丢失的风险。

在同时开启RDB和AOF时,Redis重启的时候只会加载AOF文件,而不会加载RDB文件,AOF文件的优先级比RDB文件的优先级高,只有AOF文件不存在的时候才会读取RDB文件。

在这里插入图片描述

  1. RDB做全量持久化。
  2. AOF做增量持久化。

4.1、混合模式的优缺点

(1)优点:

  • 结合了RDB和AOF的优点:混合持久化结合了RDB持久化的数据紧凑性和AOF持久化的数据安全性,既保证了数据的可靠性,又提高了数据恢复的速度。
  • 降低了数据丢失的风险:由于混合持久化结合了AOF持久化,因此即使Redis进程在RDB快照生成之后宕机,也可以通过AOF文件来恢复数据,降低了数据丢失的风险。
  • 提高了重启速度:混合持久化在AOF文件的前半部分包含了RDB格式的全量数据,这使得Redis在重启时可以先加载RDB快照,快速恢复到宕机前的状态,然后再通过AOF文件中的增量命令来恢复后续的数据变更,从而提高了重启速度

(2)缺点:

  • AOF文件可读性变差:由于混合持久化在AOF文件的前半部分添加了RDB格式的全量数据,这使得AOF文件的可读性变差,不易于阅读和解析。
  • 版本兼容性问题:混合持久化是Redis 4.0之后引入的新特性,因此在使用混合持久化时,需要确保Redis的版本支持混合持久化。如果Redis版本过低,可能无法正确加载混合持久化生成的AOF文件。
  • 可能增加持久化文件的复杂性:混合持久化生成的AOF文件既包含了RDB格式的全量数据,又包含了AOF格式的增量命令,这使得AOF文件的结构和内容变得更加复杂。在管理和维护时可能需要更多的注意和操作。

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

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

相关文章

JCL中IEFBR14和COND

JCL中IEFBR14和COND ​ COND CODE,就是反映JCL中STEP运行状态的参数,JCL正常终了的COND CODE 是0000,另外笔者在执行某些工具JCL时候,比方说简单一个COMPARE吧,可能会出现0012、0004或者0016,0001&#xf…

数据结构:栈和队列的实现附上源代码(C语言版)

目录 前言 1.栈 1.1 栈的概念及结构 1.2 栈的底层数据结构选择 1.2 数据结构设计代码(栈的实现) 1.3 接口函数实现代码 (1)初始化栈 (2)销毁栈 (3)压栈 (4&…

金三银四求职攻略:如何在面试中脱颖而出

随着春天的脚步渐近,对于众多程序员来说,一年中最繁忙、最重要的时期也随之而来。金三银四,即三月和四月,被广大程序员视为求职的黄金时段。在这段时间里,各大公司纷纷开放招聘,求职者们则通过一场又一场的…

初阶数据结构之---栈和队列(C语言)

引言 在顺序表和链表那篇博客中提到过,栈和队列也属于线性表 线性表: 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构。线性表在逻辑上是线性结构,也就是说是连…

xxl-job--02--可视化界面各功能详细介绍

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 可视化界面1 新增执行器2.新增任务**执行器**:**任务描述**:**路由策略**:**Cron**:cron表达式**运行模式**JobHandl…

java Springboot vue 健身房系统,简单练手项目

该项目主要分为管理员和会员模块 管理员具有:会员管理,器材管理,员工管理,健身课程管理 会员模块,可以在线报名健身课程,查看自己课程 采用VUE前端开发和springboot后端开发,极简代码编写,没…

ubuntu20.04安装docker及运行

ubuntu20.04安装docker及运行 ubuntu环境版本 Ubuntu Focal 20.04 (LTS) 查看系统版本 rootubuntu20043:~# cat /proc/version Linux version 5.15.0-78-generic (builddlcy02-amd64-008) (gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0, GNU ld (GNU Binutils for Ubuntu) …

Vue(黑马学习笔记)

Vue概述 通过我们学习的htmlcssjs已经能够开发美观的页面了,但是开发的效率还有待提高,那么如何提高呢?我们先来分析下页面的组成。一个完整的html页面包括了视图和数据,数据是通过请求从后台获取的那么意味着我们需要将后台获取…

通过XML调用CAPL脚本进行测试(新手向)

目录 0 引言 1 XML简介 2 通过XML调用CAPL脚本 0 引言 纪念一下今天这个特殊日子,四年出现一次的29号。 在CANoe中做自动化测试常用的编程方法有CAPL和XML两种,二者各有各的特色,对于CAPL来说新手肯定是更熟悉一些,因为说到在C…

Vue开发实例(五)修改项目入口页面布局

修改项目入口 一、创建新入口二、分析代码,修改入口三、搭建项目主页面布局1、Container 布局容器介绍2、创建布局3、布局器铺满屏幕4、创建Header页面5、加入Aside、Main和Footer模块 一、创建新入口 创建新的入口,取消原来的HelloWorld入口 参考代码…

剑指offer刷题记录Day2 07.数组中重复的数字 ---> 11.旋转数组的最小数字

名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 1、重建二叉树①代码实现(带注释&am…

【重温设计模式】职责链模式及其Java示例

职责链模式的介绍 在开发过程中,我们经常会遇到这样的问题:一个请求需要经过多个对象的处理,但是我们并不知道具体由哪个对象来处理,或者说,我们希望由接收到请求的对象自己去决定如何处理或者是将请求传递给下一个对…

【深度学习笔记】计算机视觉——锚框

锚框 目标检测算法通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整区域边界从而更准确地预测目标的真实边界框(ground-truth bounding box)。 不同的模型使用的区域采样方法可能不同。 这里…

吴恩达deeplearning.ai:正则化对于偏方差的影响制定用于性能评估的基准

以下内容有任何不理解可以翻看我之前的博客哦:吴恩达deeplearning.ai专栏 这节我们看看正则化系数 文章目录 以线性回归为例交叉验证误差对于确定 λ \lambda λ的作用 指定用于性能评估的基准语音识别的例子 以线性回归为例 让我们举一个例子: 模型&am…

Outlook邮箱IMAP密码怎么填写?账户设置?

Outlook邮箱IMAP密码是什么?Outlook如何设置IMAP? 许多用户会选择通过IMAP协议将邮箱与各种邮件客户端进行连接。而在设置过程中,填写IMAP密码是必不可少的一步。那么,Outlook邮箱的IMAP密码应该如何填写呢?接下来&am…

【Linux】深入理解ls命令

🍎个人博客:个人主页 🏆个人专栏:Linux ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 基本用法 常用选项 示例 高级用法 结语 我的其他博客 前言 在 Linux 系统中,ls 命令是一个强大而又基础的工具&am…

高刷显示器 - HKC VG253KM

🔥🔥 今天来给大家揭秘一款电竞神器 - HKC VG253KM 高刷电竞显示器!这款显示器可是有着雄鹰展翅般的设计灵感,背后的大鹏展翅鹰翼图腾让人过目难忘。那么,这款显示器到底有哪些过人之处呢?一起来看看吧&…

【MySQL】基于Docker搭建MySQL一主二从集群

本文记录了搭建mysql一主二从集群,这样的一个集群master为可读写,slave为只读。过程中使用了docker,便于快速搭建单体mysql。 1,准备docker docker的安装可以参考之前基于yum安装docker的文章[1]。 容器相关命令[2]。 查看正在…

Pod和容器设计模式

为什么需要 Pod; Pod 的实现机制; 详解容器设计模式。 一、为什么需要 Pod 容器的基本概念 现在来看第一个问题:为什么需要 Pod?我们知道 Pod 是 Kubernetes 项目里面一个非常重要的概念,也是非常重要的一个原子调…

144. 二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3]示例 2: 输入:root [] 输出:[]示例 3: 输入:root [1] 输出&am…