AOF和RDB持久化的区别

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: AOF和RDB持久化的区别

AOF和RDB持久化的区别

redis 作为我们经常使用的工具之一,熟悉它的特性还是很有必要的,这次写这篇文章也是在这方面吃了点亏, 我在参加某计算机考试时,有道题询问了这方面知识,原题我也记不大清楚了,我当时答的不是很好,感觉这种题丢分很不应该,所以写下文章,方便自我反省。

首先就是在开发中这个缓存应该是十分常用的,但是作为开发可能对于一些细节并没有很多的了解,毕竟业务压身,身不由己,有时候过来看看还是因为要面试,实在是惭愧,这篇文章我们先对 AOFRDB 做了一个回顾,然后从几个方面进行说明对比,分析他们的优缺点,选择合适的持久化方式。

AOF和RDB持久化过程回顾

从前两篇文章我们知道了 AOFRDB 持久化的一些细节,忘了的可以再去看看哦!我们再来对比一下,什么环境选择什么持久化方式比较好?首先我们对两种持久化方式的过程进行回顾

AOF持久化过程

AOF 持久化是类似 Mysqlbinlog 日志,记录所有的修改操作,所有客户端发送的命令都以 Redis命令协议 格式进行追加保存, 为了保证文件大小的适当, Redis 还在后台对 AOF 文件进行子进程创建重写,使得 AOF 文件体积不会超出保存数据集状态所需的实际大写,并在服务器启动时,通过执行这些命令来还原数据集,要注意, Redis会优先使用 AOF 文件来还原数据, 因为 AOF 文本保存的数据集一般比 RDB 所保存的数据集更完整,并且 存储的文件一般也比 RDB 的文件大。

RDB持久化过程

RDB 持久化是在指定的时间间隔内生成数据集的时间点快照,当满足配置文件里面的条件时,父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子进程, 然后子进程就会处理接下来所有的工作父进程无须执行任何磁盘 I/O 操作,在保存 Redis 里面的数据集时,它会利用 lzf算法 进行字符压缩,来保证文件大小适当,RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快,它不需要一条一条指令执行。

分析

RDBAOF 的写入上就有不同的特点,一个是追加写入,一个是保存整个数据集,从这两个操作的数据量上面就可以看出, RDB 在进行写入的时候不能太频繁了,要控制好频率,还有一个就是每次 fork 一个子进程,同时也阻塞命令的执行,虽然 fork 创建的子进程不需要拷贝父进程的物理内存空间,但是会复制父进程的空间内存页表。例如对于 10GBRedis 进程,需要复制大约 20MB 的内存页表,因此 fork 操作耗时跟进程总内存量息息相关。对于高流量的 Redis 实例 OPS 可达5万以上,如果 fork 操作耗时在秒级别将拖慢 Redis 几万条命令执行,对线上应用延迟影响非常明显。正常情况下 fork 耗时应该是每 GB 消耗 20毫秒 左右。可以在info stats统计中查 latest_fork_usec 指标获取最近一次 fork 操作耗时,单位微秒。

优缺点总结与分析

RDB的优缺点

优点

  • RDB是一个紧凑压缩的二进制文件,代表 Redis 在某个时间点上的数据快照。非常适用于备份,全量复制等场景。比如每6小时执行 bgsave 备份,并把RDB文件拷贝到远程机器或者文件系统中(如hdfs),用于灾难恢复。
  • Redis 加载RDB恢复数据远远快于AOF的方式。

缺点

  • RDB方式数据没办法做到实时持久化/秒级持久化。因为 bgsave 每次运行都要执行 fork 操作创建子进程,属于重量级操作,频繁执行成本过高。
  • RDB文件使用特定二进制格式保存, Redis 版本演进过程中有多个格式的RDB版本,存在老版本 Redis 服务无法兼容新版RDB格式的问题。
  • 针对 RDB 不适合实时持久化的问题, Redis 提供了AOF持久化方式来解决。

AOF的优缺点

优点

  • 采用 fsync 策略,可以较好地保证数据的完整性
  • 拥有重写可以起到压缩文件大小的效果
  • 执行了 flushall 命令,只要 AOF 文件没有被重写,移除尾部 flushall 命令,重启就可以恢复之前的状态

缺点

  • 采用 fsync 策略会降低性能(这属于一个权衡点)
  • 由于数据较为完整,所以文件也会比 RBD 稍大

我们该如何选择?

如果 redis 里面存储的数据比较重要,你应该同时使用两种持久化功能。如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。

有很多用户都只使用 AOF 持久化, 但我们并不推荐这种方式: 因为定时生成 RDB快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快, 除此之外,可还可以避免一些 AOFBUG

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
打赏
0
0
0
0
340
分享
相关文章
OFDM通信连路仿真学习
OFDM通信连路仿真学习
186 0
聚焦“以技术集成支撑单亩价值创造”与“增加值分配机制区块链存证确权”两大核心本质
“振兴链-技术集成科技小院”以技术集成与区块链为核心,推动农业现代化。通过多维度技术整合(如精准农业、物联网等),突破资源约束,最大化单亩产值;同时利用区块链确权存证,建立透明分配机制,解决传统农业中收益不均问题。技术赋能生产,制度重塑分配,实现效率与公平的平衡,助力乡村振兴与产业升级。典型场景显示,该模式可显著提升单亩价值并确保增值公平分配。
|
6月前
|
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
127 16
Mini but Mighty | 简直就是微调ViT神器,有了Mimi微调方法,别的不用选了!又稳又快!
Mini but Mighty | 简直就是微调ViT神器,有了Mimi微调方法,别的不用选了!又稳又快!
296 1
如何帮助我们改造升级原有架构——基于TDengine 平台
一、简介 TDengine 核心是一款高性能、集群开源、云原生的时序数据库(Time Series Database,TSDB),专为物联网IoT平台、工业互联网、电力、IT 运维等场景设计并优化,具有极强的弹性伸缩能力。同时它还带有内建的缓存、流式计算、数据订阅等系统功能,能大幅减少系统设计的复杂度,降低研发和运营成本,是一个高性能、分布式的物联网IoT、工业大数据平台。 二、TDengine 功能与组件 TDengine 社区版是一开源版本,采用的是 AGPL 许可证,它具备高效处理时序数据所需要的所有功能,包括: SQL 写入、无模式写入和通过第三方工具写入 S标准 SQL 查
183 12
KVM 架构概述
【10月更文挑战第12天】KVM是基于硬件辅助虚拟化技术的虚拟机监控器,核心依赖于CPU的虚拟化支持如Intel VT和AMD-V。
深入探索React Hooks与状态管理
深入探索React Hooks与状态管理
99 2
使用PXD工具一键安装PolarDB-X的体验
这次体验挺有意思的,对PolarDB-X有了更深入的了解,也希望能通过这些建议帮助产品做得更好。
505 2
使用PXD工具一键安装PolarDB-X的体验
【应用服务 App Service】当使用EntityFrameWorkCore访问Sql Server数据库时,在Azure App Service会出现Cannot create a DbSet for ** because this type is not included in the model for the context的错误
【应用服务 App Service】当使用EntityFrameWorkCore访问Sql Server数据库时,在Azure App Service会出现Cannot create a DbSet for ** because this type is not included in the model for the context的错误
127 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等