Redis之二:RDB持久化和AOF持久化

来源:互联网 发布:csol笔记本显卡优化 编辑:程序博客网 时间:2024/06/06 23:07

Redis是一个键值对数据库服务器,服务器中通常又包含若干个非空的数据库。我们将服务器的非空数据库以及它们的键值对统称为数据库状态。Redis是内存数据库,它将自己的数据库状态存储在内存里面,如果不想办法将数据库状态保存到磁盘中,则服务器进程一旦退出,则服务器的数据库状态将消失不见。因此,为了解决这个问题,Redis提供了两种持久化技术:RDB持久化和AOF持久化。

RDB持久化

RDB持久化功能可以将Redis在内存中的数据库状态保存到磁盘里。RDB持久化功能所生成的RDB文件是一个经过压缩的二进制文件。需要强调的是,RDB文件中保存的是Redis服务器所有数据库中的所有键值对数据

RDB文件的创建和载入

有两个命令可以生成RDB文件,一个是SAVE,一个是BGSAVE。SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器阻塞期间,服务器不能处理任何命令请求。BGSAVE命令不会阻塞服务器进程,它会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程继续处理命令请求。

并没有专门载入RDB文件的命令,RDB文件的载入工作是在服务器启动时自动执行的。值得一提的是,因为AOF文件的更新频率通常比RDB文件的更新频率高,所以:

  • 如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原服务器状态。
  • 只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原服务器状态。

自动性间隔保存

BGSAVE命令可以在不阻塞服务器进程的情况下进行。所以Redis允许用户通过设定服务器配置的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令。
例如:

save 900 1 //服务器在900秒之内,对数据库至少进行了1次修改save 300 10 //服务器在300秒之内,至少对数据库进行了10次修改save 60 10000 //数据库在60秒之内,至少对数据库进行了10000次修改

只要上面的任意一个条件满足,都会执行BGSAVE命令。

RDB文件结构

REDIS db_version databases EOF check_sum

  • REDIS: REDIS是RDB文件的最开头部分,这个部分包括5个字节,保存着“REDIS”五个字符。通过这五个字符,程序可以在载入文件时,快速检查所载入的文件是否是RDB文件。
  • db_version:db_version的长度是4个字节,它的值是一个字符串表示的整数,这个值记录了RDB文件的版本号。
  • databases:databases部分包含着零个或者多个数据库,包含各个数据库中的键值对数据。如果数据库状态为空,那么这部分也会为空。
  • EOF:EOF常量的长度是1个字节,这个常量标志着RDB文件正文内容的结束。
  • check_sum:check_sum是一个8字节长度的无符号整数,保存着一个校验和。服务器在载入RDB文件时,会将载入数据所计算出的校验和与check_sum进行对比,以此来检查RDB文件是否有出错或者损坏的情况。

AOF持久化

与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库的状态的。

AOF持久化的实现

AOF持久化的实现可以分为命令追加(append)、文件写入、文件同步三个步骤。

  • 命令追加:当AOF持久化功能处于打开状态时,服务器在执行完一个写命令之后,会议协议格式将被执行的命令追加到服务器状态的aof_buf缓冲区的末尾。
  • 文件写入:Redis的服务器进程就是一个事件循环,在服务器每次结束一个事件循环之前,它都会调用flushAppendOnlyFile函数,考虑是否将aof_buf缓冲区中的内容写入和保存到AOF文件里。
  • 文件同步:系统提供了fsync和fdatasync两个同步函数,它们可以将之让操作系统立即将缓冲区中的数据写入到硬盘里,从而确保写入数据的安全性。

AOF文件的载入和还原

服务器只要读入并重新执行一遍AOF文件里保存的写命令,就可以还原服务器关闭之前数据库状态。

Redis读取AOF文件并还原数据库状态的步骤如下:

  1. 创建一个不带网络连接的伪客户端;
  2. 从AOF文件中分析并读取写一条写命令;
  3. 使用伪客户端执行被读出的写命令;
  4. 执行执行步骤2和步骤3,知道AOF文件中的所有写命令都被处理完毕为止。

AOF重写

AOF文件的重写主要为了解决AOF文件膨胀的问题。Redis服务器会创建衣蛾新的AOF文件替代现有的AOF文件,新旧两个AOF文件保存的数据库状态相同,但新AOF文件不会包含任何浪费空间的冗余命令。

AOF重写程序是放在子进程程序中执行的,因此不会阻塞服务器进程;子进程是带有服务器进程的数据副本;AOF重写功能是通过读取数据库中的键值对来实现的,程序无须对现有AOF文件进行任何读入、分析或者写入操作。

原创粉丝点击