ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

redis持久化

2022-03-31 18:33:13  阅读:185  来源: 互联网

标签:文件 持久 AOF BGSAVE redis 命令 RDB 服务器


一、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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有