Redis--RDB和AOF
分类:
文章
•
2024-07-29 08:03:10
Redis--RDB和AOF
-
提出问题
假设我们要将内存中的数据持久化到硬盘中,而这个过程需要10分钟,该怎么做?
- 使用阻塞的方式:在持久化过程中停止服务直到持久化完毕。这个方法在开发和维护项目时是可行的,但在项目上线后显然不合适
- 不使用阻塞的方式:服务正常运行的同时向硬盘中写数据,但这显然会带来数据时点混乱的问题,如下图所示。因此,在Redis中,提供了RDB和AOF两种方式保证持久化时数据的一致性。
-
RDB持久化方式
- 核心机制
- linux中子线程间数据相互隔离
- linux中的fork()函数
- linux中的copy on write 写时复制机制
- 实现原理
- 在持久化开始时,父进程调用fork()函数创建一个用于持久化的子进程,使用另一个服务子进程正常提供服务,持久化子进程仅复制所有指向数据的指针,之后开始往硬盘中持久化数据,当数据修改时,仅修改服务子进程的指针,过程如下图所示

- 优点
1. 由于几乎所有操作都通过指针来完成,所以RDB方式不仅速度快,而且占用内存小
2. RDB持久化数据的方式类似于Java中的序列化,所以恢复数据也相对较快
- 缺点
1. 不支持拉链,只有一个dump.rdb
2. 丢失数据相对多一些,时点与时点之间窗口数据容易丢失,8得到一个rdb,9点刚要落一个rdb,服务器挂机了
- 手动触发RDB持久化
- 使用save指令:阻塞式持久化
- 使用bgsave指令:上面所讲的持久化方式
- 配置自动触发RDB持久化
- vi /etc/redis/6379.conf,找到如下配置

- 服务器在 60 秒之内,对数据库进行了至少 10000 次修改,bgsave执行
- 服务器在 300 秒之内,对数据库进行了至少 10 次修改,bgsave执行
- 服务器在 900 秒之内,对数据库进行了至少 1 次修改,bgsave执行
-
AOF持久化方式
- 使用类似MySQL中binlog日志的方式记录数据,在 redis 4.0 版本以前和 redis 4.0 版本以后有不同的机制
- 4.0版本以前:一直往日志文件中添加数据,在需要重写时,在内核完成重复命令的抵消,并将数据保存到一个新的日志文件中
- 4.0版本以后:先通过RDB方式将旧数据写入到AOF日志文件中,执行此过程时会在内存中完成重复命令的抵消,之后再用以前的方式往日志文件中添加数据,即兼顾了RDB的快又保留了AOF的全量!
- 优点:保证数据完整,但依旧有可能造成0-4k数据的丢失(取决于配置文件中的flush时机)
- 缺点:日志文件体量无限变大;恢复数据较慢
- RDB持久化文件与AOF持久化文件都存储在 /var/lib/redis/6379 目录中