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
目录
相关文章
|
6月前
|
NoSQL 关系型数据库 MySQL
Redis持久化机制 RDB 和 AOF 的选择
Redis持久化机制 RDB 和 AOF 的选择
98 0
|
6月前
|
存储 缓存 NoSQL
Redis之持久化(RDB和AOF)
Redis之持久化(RDB和AOF)
141 0
|
6月前
|
NoSQL Redis 数据库
Redis持久化之RDB和AOF操作
【1月更文挑战第9天】 无论是面试还是工作,持久化都是重点! Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以Redis提供了持久化功能!——RDB(Redis DataBase)和AOF(Append Only File)
175 6
Redis持久化之RDB和AOF操作
|
6月前
|
NoSQL 关系型数据库 MySQL
Redis 两种持久化方式 AOF 和 RDB
Redis 两种持久化方式 AOF 和 RDB
|
6月前
|
存储 移动开发 NoSQL
Redis 中的 RDB 和 AOF 持久化机制
Redis 的持久化功能是区别于 Memcached 显著特性,数据持久化可以保证系统在发生宕机和重启后数据不会丢失,对于 redis 这种存储在内存中的数据库显得尤为重要。 在 Redis 4.0 以前数据持久化的方式主要有RDB和AOF两种
85 0
Redis 中的 RDB 和 AOF 持久化机制
|
NoSQL Redis 数据库
Redis持久化RDB和AOF
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里,Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
60 1
|
存储 NoSQL 关系型数据库
Redis的持久化策略(RDB、AOF、RDB-AOF混合持久化)
Redis的持久化策略(RDB、AOF、RDB-AOF混合持久化)
161 0
|
缓存 NoSQL 安全
Redis系列二 rdb 和 aof 持久化的区别
Redis系列二 rdb 和 aof 持久化的区别
92 0
|
存储 NoSQL 关系型数据库
Redis持久化机制AOF和RDB
Redis持久化机制AOF和RDB
58 0
|
存储 NoSQL Redis
Redis持久化方式~RDB 持久化和AOF 持久化
Redis持久化方式~RDB 持久化和AOF 持久化
116 0