Redis的持久化策略

Redis的持久化策略:

  咱们都知道,Redis是一个键值对的数据库服务器,服务器中包含着若干个非空的数据库,每一个非空的数据库中包含任意个键值对,它将本身的数据都存储在内存中,若是咱们不采起措施将在内存中的数据保存到磁盘中的话,若是一旦出现服务器宕机的状况下,服务器中的数据库数据也会随之而消失。这时候,Redis就提供了两种Redis的持久化功能:RDB持久化和AOF持久化。数据库

1、RDB持久化功能

  RDB经过保存数据库中的键值对来记录数据库状态的不一样。服务器

  RDB既能够手动置顶,也能够配置服务器选项进行按期执行,实现是将某个时间点上的Redis数据库中的数据保存到一个RDB文件中,RDB文件是一个通过压缩的二进制文件,经过该文件能够还原生成时的Redis数据库数据。网络

  • 建立文件

  通常的话,是有两个Redis的命令能够用于生成RDB文件,一个是SAVE,一个是BGSAVE。其中SAVE命令在执行是,会阻塞服务器进程,直到RDB文件建立成,在进程阻塞期间,服务器不能进行任何请求操做。另外一个BGSAVE命令的方式则是派生一个子进程,由子进程负责建立RDB文件,服务器进程继续处理请求。建立RDB文件的实际工做由rdb.c/rdbSave函数来执行,两种命令分别以不一样的方式来调用函数执行。app

  • 读取文件

  读取RDB文件是在服务器启动的时候自动完成的,只要再Redis服务器启动的时候有检测到RDB文件的存在,就会自耦东读取RDB文件。函数

  • 计数器(dirty)与最后一次修改(lastsave)属性

  Redis服务器中维持着一个dirty技术区和一个lastsave属性,用来判断是否执行保存命令性能

    • dirty记录着距离上一次执行SAVE或者BGSAVE命令以后服务器对数据库进行的操做次数
    • lastsave属性时一个时间戳,记录着服务器上一次执行SAVE和BGSAVE命令的时间
  • 保存时间间隔

  BGSAVE能够在不阻塞服务器进程的状况下执行,因此咱们能够配置服务器的save选项,让服务器每间隔一段时间自动执行一次BGSAVE命令。服务器默认设置save选项以下:spa

1 save     900     1
2 save     300     10
3 save     60      10000

  对应的意思是:线程

    • 服务器在900秒以内,对数据库进行了超过一次修改,就会执行BGSAVE命令
    • 服务器在300秒以内,对数据库进行了超过10次修改,就会执行BGSAVE命令
    • 服务器在60秒以内,对数据库进行了超过10000次修改,就会执行BGSAVE命令

  咱们能够经过制定配置文件或者传入启动参数的方式来设置save选项code

  • serverCron函数

  一个默认没间隔100毫秒就会执行一次的函数,它的任务之一就是检查save选项所设置的保存条件是否知足,知足的状况下,就执行BGSAVE命令。server

2、AOF持久化功能

  AOF持久化是经过保存Redis服务器所执行的命令来记录数据库状态的,被写入AOF的全部命令都是以Redis的请求协议格式来进行保存的。它的整个执行流程大体分为三步:

    • 命令追加(append):当AOF持久化功能开启的状态下,服务器在执行完一个写命令以后,会以协议格式将被执行的写命令
    • 文件写入:当服务器接收到命令时,会调用一个flushAppendOnlyFile函数,考虑是否将aof_buf缓冲区中的内容写入和保存到AOF文件中。函数的持久化行为由服务器配置的一个appendfsync选项的值来决定,下面是对应关系:
      • always:将aof_buf缓冲区的全部内容写入并同步到AOF文件中
      • everysec:将aof_buf缓冲区的全部内容写入AOF文件中,同时,若是距离上次同步行为间隔一秒钟,name将再次对AOF文件进行同步,服务器分配一个单独的线程来执行这个操做,everysec是默认值
      • no:将aof_buf缓冲区的全部内容写入AOF文件中,但不对AOF文件进行同步,具体的同步时间由系统来决定
    • 文件同步:上面的文件写入只是文件被暂时的存储在一个内存缓冲区中,等到缓冲区的空间被填满,或者超过了必定的时间限制的时候,才会将缓冲区的数据写入到磁盘中,咱们将这个过程成为文件的同步
  • 读取文件

  读取文件的执行点同时是在服务器启动的时候。由于AOF文件中包含了重建数据库的全部命令,因此服务器只要从新执行一遍AOF文件中保存的命令,就能够还原数据库保存以前的数据。Redis经过建立一个没有网络链接的伪客户端来执行AOF中保存的写命令。步骤为:

    • 从AOF文件中分析并读取一条写命令
    • 使用为客户端执行被当初的命令
    • 重复执行前面两个步骤,直到文件中全部的内容都被读取完毕
  •  AOF文件重写

  咱们知道AOF文件中保存的是每一次执行的命令,随着时间的进行,AOF文件的中的内容会愈来愈多,可是当Redis客户端即执行了添加,也执行了删除的语句以后,咱们能够简单的使用一个新的命令也可以达到数据库中数据一致的状态,这时候就讲到了Redis的文件重写功能。

  服务器经过建立一个新的AOF文件来替代原有的AOF文件,新旧两个文件保存相同的数据库状态,可是新的文件不会包含任何冗余的命令,大大减少了AOF文件的体积。

  AOF文件的重写功能是经过读取当前的数据库状态来执行的。并不会对原有的AOF文件进行任何的操做。具体的执行是经过调用aof_rewrite函数来执行的,而为了不影响服务器的性能,这个也是单独开辟线程来执行的,为了不在执行重写过程当中的数据不一致问题,Redis服务器还设置了一个重写缓冲区来执行在重写过程当中追加的命令

3、补充

  AOF文件的更新频率高于RDB文件

  • 只要服务器开启了AOF持久化功能,服务器会有限使用AOF文件来还原数据库状态
  • 只有在AOF持久化功能处于关闭的状况下,服务器才会使用RDB文件来还原数据库状态
相关文章
相关标签/搜索