你必须知道的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
相关文章
|
15天前
|
存储 NoSQL Redis
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
Redis持久化、RDB和AOF方案、Redis主从集群、哨兵、分片集群、散列插槽、自动手动故障转移
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
|
1月前
|
NoSQL 关系型数据库 Redis
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
这篇文章深入探讨了Redis事务的概念、命令使用、错误处理机制以及乐观锁和悲观锁的应用,并通过WATCH/UNWATCH命令展示了事务中的锁机制。
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
|
1月前
|
存储 缓存 NoSQL
【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)
【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)
|
1月前
|
NoSQL Redis
Redis 临时manifest修改问题之确保被持久化到磁盘如何解决
Redis 临时manifest修改问题之确保被持久化到磁盘如何解决
|
1月前
|
NoSQL Redis
【Azure Redis】Redis导入备份文件(RDB)失败的原因
【Azure Redis】Redis导入备份文件(RDB)失败的原因
|
1月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Azure Cache for Redis 服务的导出RDB文件无法在自建的Redis服务中导入
【Azure Redis 缓存】Azure Cache for Redis 服务的导出RDB文件无法在自建的Redis服务中导入
|
1月前
|
NoSQL Redis
Redis——设置最大内存 | key淘汰机制
Redis——设置最大内存 | key淘汰机制
41 0
|
14天前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
1月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Redission客户端连接Azure:客户端出现 Unable to send PING command over channel
【Azure Redis 缓存】Redission客户端连接Azure:客户端出现 Unable to send PING command over channel
|
30天前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
58 0