Redis是一个高性能的内存数据库,它支持多种数据结构和多种持久化策略。持久化是指将内存中的数据保存到磁盘上,以防止数据丢失。Redis提供了两种主要的持久化方式:RDB和AOF。
RDB(Redis Database)是指定时将内存中的数据生成一个快照文件(snapshot)并保存到磁盘上。RDB的优点是文件体积小,恢复速度快,适合做备份和灾难恢复。RDB的缺点是可能会丢失最近一次快照之后的数据,而且快照过程可能会影响Redis的性能。
AOF(Append Only File)是指将每个写入操作记录到一个日志文件中,并实时或定期地同步到磁盘上。AOF的优点是可以保证数据的完整性,即使发生故障也只会丢失最后一次同步之后的数据,而且可以根据需要重写日志文件以减少体积。AOF的缺点是文件体积大,恢复速度慢,而且同步过程可能会影响Redis的性能。
为了兼顾RDB和AOF的优势,Redis从4.0版本开始引入了一种新的持久化方式:混合持久化(Mixed Persistence)。混合持久化是指在生成RDB快照的同时,将快照之后的AOF日志记录到一个单独的文件中,并在恢复数据时先加载RDB文件再加载AOF文件。这样既可以利用RDB的高效恢复,又可以利用AOF的高可靠性。
要启用混合持久化,需要在redis.conf文件中设置以下参数:
1.rdb-preamble yes 表示在AOF文件中包含RDB文件的元信息
2.aof-use-rdb-preamble yes 表示在恢复数据时使用RDB文件作为前缀
3.save \"\" 表示禁用RDB单独保存
4.appendonly yes 表示启用AOF保存
5.appendfsync everysec 表示每秒同步AOF文件到磁盘
启用混合持久化后,当执行BGSAVE命令或满足save参数条件时,Redis会执行以下步骤:
1. fork一个子进程来生成RDB文件
2. 在主进程中继续处理写入操作,并将这些操作记录到一个缓冲区中
3. 当子进程完成RDB文件后,将其发送给主进程,并通知主进程开始写入AOF文件
4. 主进程先将RDB文件的元信息写入AOF文件,然后将缓冲区中的写入操作追加到AOF文件中
5. 主进程继续处理写入操作,并将这些操作追加到AOF文件中
当需要恢复数据时,Redis会执行以下步骤:
1. 读取AOF文件中的RDB文件元信息,并根据其路径和校验和找到对应的RDB文件
2. 加载RDB文件中的数据到内存中
3. 读取AOF文件中除了RDB文件元信息之外的写入操作,并依次执行到内存中
通过这种方式,混合持久化可以实现在不影响Redis性能的前提下,保证数据的完整性和一致性。