数据库
首页 > 数据库> > redis持久化

redis持久化

作者:互联网

一、RDB

  RDB持久化通过保存数据库中的键值对记录服务器状态。

1、生成RDB文件  

  两个命令用于生成RDB文件,一个是SAVE,一个是BGSAVE。

  两者区别:

    1) SAVE命令会阻塞redis服务器进程,直到RDB文件创建完毕为止

      调用函数:

      def SAVE():

        rdbSave()

    2) BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求。

      调用函数:

      def BGSAVE():

        pid=fork()

        if pid==0:

          rdbSave()

          signal_parent()  //完成后向父进程发送信号

        else pid > 0:

          handle_request_and_wait_signal()  //父进程继续处理命令请求毛病通过轮训等待子进程的信号

        else:

           handle_fork_error()      //处理出错情况

 注意:

  1、因为AOF文件更新频率通常比RDB文件的更新频率搞,所以

    1)如果服务器开启了AOF持久化功能,那么服务器优先使用AOF文件还原数据库状态。

    2)只有AOF持久化功能处于关闭时,服务器才会使用RDB文件来还原数据库状态。

  2、考虑到性能方面,SAVE、BGSAVE、BGREWRITEAOF三个命令无法同时存在。

 

2、自动间隔性保存

  因为BGSAVE不会阻塞服务器进程,因此允许用户设置服务器配置的save选项(可以设置多个),让服务器在满足选项条件的情况下(只需满足一条即可),每隔一段时间自动执行一次BGSAVE命令。

  例如:

    save 900 1

    save 300 10

    服务器在900秒之内,对数据库进行至少1次修改(包括写入、删除、更新等操作),则BGSAVE命令会被执行。

    服务器在300秒之内,对数据库进行至少10次修改,则BGSAVE命令会被执行。

  dirty计数器和lastsave属性

    dirty计数器:距离上次成功执行SAVE或者BGSAVE命令之后,成功的修改次数

    lastsave属性:UNIX时间戳,记录上一次服务器成功执行SAVE或者BGSAVE命令的时间

3、RDB文件结构

REDIS db_version databases EOF check_sum

  REDIS:

    RDB文件最开头是REDIS部分,这部分长度为5字节,保存着‘REDIS’五个字符。在程序载入文件时,可以通过该字符检查文件是否为RDB文件。

    注意:RDB文件保存的是二进制数据,不是C字符串。

  db_version:4字节,字符串表示的整数,记录RDB文件的版本号。

  databases:包含零个或任意多个数据库,以及数据库中的键值对数据。

      databases结构:

SELECTDB db_number key_value_pairs

      key_value_pairs结构(不带过期时间):

TYPE key value

      value:保存了一个值对象,每个值对象类型由与之对应的TYPE记录,可以是:字符串对象、列表对象、哈希对象、集合对象、有序集合对象。

  EOF:1字节,标志RDB文件正文结束。

  check_sum:8字节长无符号整数,保持着一个校验和。

打印RDB文件:

  $ od -cx dum.rdb

  以ASCII编码和十进制打印RDB文件

 

二、AOF

  AOF持久化通过保存Redis服务器所执行的写命令来记录服务器状态,即将服务器执行的SET、SADD、RPUSH等命令保存到AOF文件中。

  被写入AOF文件的所有命令都是以redis的命令请求协议格式保存。

 

1、AOF持久化实现

  命令追加、文件写入、文件同步

  1)命令追加

    服务器执行完一个写命令后,会以协议格式将被执行的谢明丽追加到服务器状态的aof_buf缓冲区的末尾

  2)文件写入和同步

    appendfsync选项:

      always / eveysqc / no:  eveysqc:每次都将aof缓冲区中的所有内容写入到AOF文件,并且每隔一秒就要在子线程中对AOF文件进行一次同步。

 

2、AOF文件的载入和数据还原

  1)创建一个不带网络连接的伪客户端

  2)从AOF文件中分析并读取一条写命令

  3)使用伪客户端执行被读出的写命令

  4)一直执行步骤2和步骤3,直到文件中的所有写命令被处理完毕。

 

3、AOF重写(BGREWRITEAOF命令)

  1)意义和实现

     为了解决AOF文件体积膨胀问题,redis提供了AOF文件重写功能,服务器可以创建一个新的AOF文件来替代现有的AOF文件。

       注意:AOF文件重写并不需要对现有的AOF文件进行任何读取、分析或者写入操作,这个功能是通过读取服务器当前的数据库状态来实现。

      另外,如果集合带有多个元素的键时,会检查所包含的元素数量,如果超过了规定值,重写程序将使用多条命令来记录键的值,而不只是一条。

  2)AOF后台重写

      AOF重写程序调用aof_rewrite函数来完成创建一个新AOF文件的任务,因此这个函数会进行大量的写入操作,调用这个函数的线程将被长时间阻塞,所以AOF重写

    程序会放到子进程执行。

      在子进程执行AOF重写期间,服务器进程执行三个工作

      1、执行客户端发来的命令

      2、将执行后的写命令追加到AOF缓存区

      3、将执行后的写命令追加到AOF重写缓冲区。

标签:文件,持久,AOF,BGSAVE,redis,命令,RDB,服务器
来源: https://www.cnblogs.com/socks/p/16083207.html