Redis学习笔记(4)——持久化

Redis持久化机制

  • Redis是内存数据库,一旦服务器意外关闭将会丢失数据,因此需要持久化方式将数据保存到磁盘里。Redis支持RDB和AOF两种持久化方式。
  • 比较:RDB是快照式的全量备份,体积小、恢复快,但时效性不好,常用于主从同步;AOF是追加写入的持续增量备份,体积大、恢复慢,实时性好,按照everysec策略最多丢失1秒的数据,是主流的持久化方案。
  • Redis4.0混合持久化:将RDB的增量内容通过AOF的方式追加写入AOF日志,既得到了RDB的高性能,也得到了AOF的实时性。

RDB持久化

  • RDB持久化是是快照持久化,是Redis默认的持久化方式。它将内存数据在某个时间点上创建快照保存在硬盘里(已过期的键会被忽略)。它生成的RDB文件是一个经过压缩的二进制文件,通过它可以将服务器还原至生成RDB文件时的状态。
  • 生成RDB文件可以通过配置定期自动执行,也可以手动执行。手动生成RDB文件的命令有SAVEBGSAVE
    • SAVE命令会阻塞Redis服务器进程,直到RDB文件生成完毕,期间服务器不能处理任何请求。
    • BGSAVE命令会fork一个子进程负责创建RDB文件,服务器在此期间可以继续处理请求。
  • 服务器使用RDB文件恢复时,会一直处于阻塞状态。如果以主服务器模式载入RDB,会忽略已过期的键;如果以从服务器模式载入RDB,不论键是否过期都会被载入。
  • RDB持久化的特性和使用场景:恢复快,高性能,时效性不好,适合冷备。

AOF持久化

  • AOF持久化通过保存Redis服务器执行的写命令来记录数据库状态,因此AOF文件是纯文本格式。
  • AOF持久化的实现分为三个步骤:命令追加、文件写入、文件同步。当服务器执行完一个命令,会将被执行的命令写入aof_buf缓冲区的末尾,然后依据appendfsync选项的值来决定是否将aof_buf中的内容保存到AOF文件中。
  • appendfsync选项的值有:
    • always:每次修改aof_buf都同步到AOF文件,最慢,但最安全。
    • everysec(默认值):每秒同步一次AOF文件,足够快,即便Redis故障停机也最多丢失一秒钟的数据。
    • no:由操作系统决定是否同步。
  • 使用AOF文件还原时,会创建一个伪客户端向服务器发送AOF文件保存的写命令,直到文件中的所有命令都被处理完毕为止。
  • 为了防止AOF文件体积过大,Redis提供了AOF重写功能,生成的新的AOF文件不会保存冗余的指令。已过期的键不会保存到重写后的AOF文件中。
  • 已过期的键在被惰性删除或定期删除之前不会对AOF造成影响,当它被删除时会在AOF文件追加DEL命令,显式记录该键被删除。
  • 如果服务器开启了AOF持久化,则会优先使用AOF文件来还原数据库状态。只有在AOF关闭时才会用RDB文件恢复。
  • AOF持久化的优点:对服务器的性能影响小,速度快,时效性好,消耗的内存少;缺点:日志文件大,需要不断AOF重写,恢复速度慢。