你必须知道的Redis持久化机制-RDB快照

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
日志服务 SLS,月写入数据量 50GB 1个月
简介: 记录命令,持久化的数据量不大。但是在AOF日志恢复时,需要把日志的每条命令都执行一遍。如果日志很多,恢复过程就会变得很漫长。因此,Redis提供了另一种持久化机制,那就是RDB快照。

前言

我们都知道,Redis有两大持久化机制:AOF日志和RDB快照。AOF方法每次执行只记录命令,持久化的数据量不大。但是在AOF日志恢复时,需要把日志的每条命令都执行一遍。如果日志很多,恢复过程就会变得很漫长。因此,Redis提供了另一种持久化机制,那就是RDB快照。

RDB快照写入规则

和AOF记录命令不同,RDB记录的当前的数据。Redis有提供2个命令来生成RDB快照文件,分别是save和bgsave。

  • save: 这种方式在主线程执行,容易导致阻塞;
  • bgsave: 创建一个子进程来执行RDB写入工作。这种方式可避免主线程的阻塞(默认配置)

这里你可能有疑问,快照过程中,如果有数据做了修改,RDB是怎么做的呢?这里就要介绍下写时复制了。

写时复制技术

写时复制是操作系统提供的功能,Redis在执行RDB快照时,依然能正常处理写操作。这样说可能不够明朗,详细点说说bgsave这个过程:

image.png

bgsave子进程是由主线程fork生成的,而且可以共享主线程的所有内存数据。主线程和子进程bgsave是互不干扰的。

当主线程要修改一块数据,这块数据就会复制一份到副本上,然后主线程在这个副本上修改。同时呢,bgsave子进程可继续将原来的数据写入RDB文件。这样就能某时刻快照的完整性,也不影响redis同时对当时数据的操作。

写到这,你是否认为RDB快照这样设计就完美了呢?答案是否定的。我们仔细想想,如果每次快照都是将全量数据备份,数据量大了之后,会有什么后果:

  • 全量数据写入RDB文件,磁盘压力增大。可能存在前一个快照没执行完,后一个又开始了。
  • bgsave子进程虽不阻塞主线程,但它是由主线程fork出来的。fork的过程是会阻塞主线程的。

基于这两大问题,Redis提供了增量快照的方式。

RDB增量快照

增量快照,就是指第一次全量快照后,后续RDB快照都是只记录修改过的数据记录,这样就可以避免很多开销。实现的方法就是 第一次全量快照后,数据修改后,会记录下来。这样在下一次增量快照时就知道哪些数据被修改了。

和AOF相比,RDB快照恢复速度快。但是快照的频率设置需要注意了。如果设置的频率很高,宕机可能就会丢失较多数据;频率太低的话,开销也会很大。

AOF和RDB混用

我们在考虑持久化时,肯定希望它恢复速度快,同时开销尽量小,而且尽量丢失少一点的数据。因此,在Redis4.0之后,支持了AOF和RDB混用的方式。

这种方式就是RDB以设定的频率执行,比如每30秒执行一次。然后没有执行快照的时间内,就用AOF日志去记录这段时间内的操作命令。这样一来,就解决了上述对持久化的期望。

小结

对于RDB快照和AOF文件,我们可根据实际需要去选择。提供一下选择参考:

数据可靠性要求高,少丢失: 选择RDB快照和 AOF 混用;

  • 允许分钟级别的数据丢失: 可以只使用 RDB;
  • 只用 AOF: 优先考虑 everysec 的配置(可靠性和性能之间的平衡)
相关实践学习
基于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
相关文章
|
10天前
|
存储 NoSQL 安全
Redis的两种持久化方式---RDB、AOF
通过本文的介绍,我们详细讲解了Redis的两种主要持久化方式:RDB和AOF。每种方式都有其独特的优缺点和适用场景。在实际应用中,可以根据具体需求选择合适的持久化方式,或者同时启用RDB和AOF,以达到最佳效果。希望本文能帮助您更好地理解和应用Redis的持久化机制,构建高效、可靠的数据存储解决方案。
124 79
|
1月前
|
NoSQL API Redis
在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描
通过上述步骤,可以在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描。利用LevelDB的迭代器,可以高效地遍历和处理数据库中的大量键值对。该实现方法不仅简单易懂,还具有良好的性能和扩展性,希望能为您的开发工作提供实用的指导和帮助。
44 7
|
2月前
|
存储 NoSQL Redis
Redis 持久化揭秘:选择 RDB、AOF 还是混合持久化?
Redis 是一个内存数据库,意味着它主要将数据存储在内存中,从而能够提供极高的性能。然而,作为内存数据库,Redis 默认情况下的数据不会永久保存。为了确保数据在重启或故障后能够恢复,Redis 提供了几种 **持久化机制**。这些机制允许 Redis 将内存中的数据保存到硬盘上,从而实现数据持久化。
153 22
Redis 持久化揭秘:选择 RDB、AOF 还是混合持久化?
|
2月前
|
NoSQL 安全 Redis
redis持久化策略
Redis 提供了两种主要的持久化策略:RDB(Redis DataBase)和AOF(Append Only File)。RDB通过定期快照将内存数据保存为二进制文件,适用于快速备份与恢复,但可能因定期保存导致数据丢失。AOF则通过记录所有写操作来确保数据安全性,适合频繁写入场景,但文件较大且恢复速度较慢。两者结合使用可增强数据持久性和恢复能力,同时Redis还支持复制功能提升数据可用性和容错性。
73 5
|
7月前
|
canal 缓存 NoSQL
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;先删除缓存还是先修改数据库,双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
|
8月前
|
存储 缓存 JSON
Redis-持久化-淘汰机制-IO策略
Redis-持久化-淘汰机制-IO策略
|
9月前
|
NoSQL Redis
03- Redis的数据持久化策略有哪些 ?
Redis的数据持久化包括两种策略:RDB(全量快照)和AOF(增量日志)。RDB在指定时间间隔将内存数据集保存到磁盘,而AOF记录所有写操作形成日志。从Redis 4.0开始,支持RDB和AOF的混合持久化,通过设置`aof-use-rdb-preamble yes`。
74 1
|
9月前
|
存储 NoSQL 关系型数据库
Redis持久化策略AOF、RDB详解及源码分析
Redis持久化策略AOF、RDB详解及源码分析
|
存储 NoSQL 关系型数据库
Redis的持久化策略(RDB、AOF、RDB-AOF混合持久化)
Redis的持久化策略(RDB、AOF、RDB-AOF混合持久化)
204 0
|
NoSQL Redis
深入了解Redis持久化与备份策略
本篇深入介绍了Redis的持久化和备份机制,为读者提供了全面的了解和实际操作示例。我们首先探讨了RDB持久化方式,通过将数据集的快照保存到磁盘文件,实现了数据的定期备份和恢复。接着,详细介绍了AOF持久化,将每个写操作记录到日志文件中,确保了数据的持久性和安全性。我们还讨论了混合持久化,将RDB和AOF结合,兼顾了快速恢复和持久化的需求。
577 0