RDB
RDB是Redis默认的持久化方式,它将整个数据集保存到磁盘上的一个压缩快照中。当Redis要进行RDB快照操作时,它将内存中的数据集写入到临时文件中,然后再原子地将生成的RDB文件重命名为新的RDB文件来取代旧的RDB文件。这意味着在任何时候都只有一个RDB文件存在于磁盘上,减少了磁盘空间的使用。
RDB有两种触发方式:
- 自动触发:Redis可以根据您的配置自动执行RDB快照,例如在一定的时间间隔或者执行一定数量的写命令后。
- 手动触发:您可以通过向Redis发送SAVE或BGSAVE命令来手动执行RDB快照。但是需要注意,手动进行快照可能会影响性能,因为它需要对整个Redis实例进行快照,而且在执行BGSAVE快照命令时,Redis将自动 fork 出一个子进程来进行快照操作,可能会占用大量的CPU和内存资源。
RDB持久化的优点是速度快、压缩效率高,适合用于大规模的数据集。但其缺点是可能会丢失一定量的数据,因为如果Redis服务崩溃,最后一次快照之后产生的数据将丢失。
AOF
AOF将每个写操作都保存到一个文件中,可以根据需要重构原始数据集来完全重新执行保存的命令。因为AOF记录的是生成该数据集的所有操作,因此该文件越来越大。为此,Redis提供了两种解决方案。
- 定期重写:Redis启动一个新进程来重写AOF文件,以删除文件中旧数据的命令,并将其替换为生成相同数据集所必需的命令。这个过程没有中断Redis的正常操作,并且可以配置为每隔一定时间或者写入指定数量的命令后执行。
- 文件压缩:Redis可以在AOF文件不断增长的情况下,使用BGREWRITEAOF命令进行压缩。该命令会对AOF文件进行重写,并且优化其中的命令以减小文件大小。与定期重写不同,文件压缩将删除所有旧数据,并用重写后的数据替换AOF文件。
一般来说,AOF比RDB更可靠,因为它记录了数据的所有修改记录,所以在Redis重启时,可以通过重放AOF文件中的写命令来准确地还原数据集。另外,由于可将AOF文件以只读方式传送到备份副本,所以AOF也是一种备份数据的好方法。
但AOF也有一些缺点。由于AOF文件需要记录每个写操作,因此它会比RDB更占用磁盘空间,而且在AOF文件不断增长时,重写AOF文件并压缩它可能会对Redis的性能产生不好的影响,尤其在写负载非常大的情况下。