Redis作为一款高性能的键值对数据库,其数据主要存储在内存中以实现极高的访问效率。然而,内存存储意味着在服务器重启、故障或其他意外情况发生时,如果没有适当的保护措施,数据可能会丢失。因此,Redis设计并提供了两种核心的持久化机制来确保数据的长期安全性和可靠性,即RDB(Redis Database)持久化和AOF(Append-Only File)持久化。此外,还有一种结合两者优点的混合使用(RDB + AOF)策略。
1、RDB持久化
RDB持久化是一种基于快照的机制,它将某个时刻的Redis数据集以二进制的形式序列化到磁盘上的一个文件(通常名为dump.rdb)。Redis采用的是全量快照。
优点:
(1)数据紧凑:RDB文件通过压缩算法进行存储,具有较小的体积,便于传输和备份。
(2)恢复速度快:由于RDB文件仅包含数据集的完整快照,所以在 Redis 重启时,可以直接读取该文件进行快速数据加载,恢复过程高效。
(3)资源友好:创建RDB文件的过程通常是异步且fork-based的,对主线程影响较小,不会显著阻塞 Redis 的服务响应。bgsave命令生成RDB快照,会创建一个子进程,专门用于写入RDB文件,避免阻塞主线程。而save命令是在主线程执行的。
虽然bgsave不阻塞主线程,但是还是有影响的,bgsave子进程共享主线程的所有内存数据,此时主线程对数据进行读操作时,两者互不影响;但是如果是写操作,就会影响了,Redis 会借助操作系统提供的写时复制技术(Copy-On-Write, COW),在执行快照的同时,正常处理写操作。如下图所示[1]:

缺点:
(1)可能的数据丢失:RDB持久化是周期性进行的,取决于配置的保存策略(如save或bgsave命令触发),在两次快照之间发生的数据变更如果未被同步到磁盘,可能在故障时丢失。
(2)资源消耗:虽然创建RDB时对主线程影响较小,但fork子进程和压缩操作仍需消耗一定的CPU和内存资源。
触发时机:
RDB持久化可以通过以下方式触发:
(1)执行bgsave命令手动触发。
(2)配置文件中预设的save规则满足时(如一定时间内数据发生特定数量的更改)。
(3)在主从复制场景下,当从节点首次连接主节点时,主节点会发送最新的RDB文件给从节点。
2、AOF持久化
AOF持久化采取日志记录的方式,将Redis服务器执行的所有写命令(包括数据添加、修改、删除等操作)以文本格式追加到一个名为appendonly.aof的文件中。这种方式提供了更为详细的更新历史记录,确保了更高的数据一致性。AOF日志是写内存命令执行后才写入磁盘的,如下图:

优点:
(1)数据安全性高:AOF记录了所有写操作,即使在故障时只部分写入了磁盘,也能通过重放未完成的命令尽可能恢复到最新状态,数据丢失的可能性相对较小。
(2)可调整的持久化级别:AOF支持多种写回策略(如always、everysec、no-每秒fsync一次(always策略),也可以配置为每次写命令立即同步(everysec)或由操作系统决定何时同步(no)),允许用户根据实际需求在数据安全性与性能之间做出权衡。
缺点与挑战:
(1)文件体积增长较快:随着操作的积累,AOF文件大小可能会比RDB文件更大,尤其是在使用低级别的持久化策略时。
不过Redis有AOF重写机制,会合并写入命名,比如两次set A的命令会合并为1条,从而减少日志文件大小。每次 AOF 重写时,Redis 会先执行一个内存拷贝,用于重写;然后,使用两个日志保证在重写过程中,新写入的数据不会丢失。而且,因为 Redis 采用额外的线程进行数据重写,所以,这个过程并不会阻塞主线程。如下图[1]:

(2)恢复速度较慢:在Redis重启时,需要重新执行AOF文件中的所有写命令才能恢复数据集,相较于直接加载RDB文件,可能耗时更长。
(3)潜在的数据不一致风险:在极少数情况下,如AOF文件损坏或命令解析出错,可能导致数据恢复不完全或出现错误。
触发时机:
AOF持久化默认为everysec策略,根据always、everysec、no策略选择写入时机不同。此外,执行BGREWRITEAOF命令可以触发AOF重写,优化文件大小并合并重复命令。
如果同时分别开启RDB和AOF时,会优先使用AOF文件进行恢复,因为相比RDB,AOF文件保存的命令操作通常更全些。
3、混合持久化(RDB+AOF)
为了同时利用RDB的快速恢复能力和AOF的高数据安全性,Redis 4.0中提出了一个混合使用 AOF 日志和内存快照的方法。简单来说,内存快照以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作。
在这种模式下,Redis在重启时首先加载RDB文件以快速初始化数据集,然后重放AOF文件中自最后一次RDB快照以来的增量更新命令。这种组合方式既保证了快速恢复,又最大限度地减少了数据丢失的风险。
结语
Redis提供了RDB、AOF以及混合持久化三种持久化机制,以适应不同应用场景对数据安全、性能和存储空间的需求。面试者在理解和掌握这些机制的基础上,应能根据实际业务场景分析优劣,并合理选择和配置持久化策略。
数据不能丢失时,内存快照和 AOF 的混合使用是一个很好的选择;如果允许分钟级别的数据丢失,可以只使用 RDB;如果只用 AOF,优先使用 everysec 的配置选项,因为它在可靠性和性能之间取得一个平衡。
参考:
[1]https://time.geekbang.org/column/article/271839
本篇文章来源于微信公众号: 程序员Aike
微信扫描下方的二维码阅读本文

Comments NOTHING