redis的持久化

            redis持久化

一. RDB持久化

   1.1 RDB持久化的一些特性

   用save(阻塞)和bgsave(非阻塞,派生一个子进程来处理)可以生成RDB文件.

   因为AOF文件的更新频率比RDB高,所以如果开启了AOF会优先使用AOF来还原数据库状态.

   服务器在载入RDB文件期间会一直阻塞,直到完成.

  

   1.2  自动保存间隔

    我们可以在配置文件中配置.

    save 900 1;save 300 1;

   分别代表900秒内进行至少一次修改,300秒内至少一次修改,那么就会执行BGSAVE

   

  1.3 RDB文件结构

     RDB保存的都是二进制文件


redis的持久化
   redis:默认的五个字节的字符

   db_version:长度4个字节,代表RDB文件的版本号

   databases:保存各个数据库的键值对

   EOF:长度为1字节,表示RDB文件结束.

   check_sum:8字节无符号整数,保存着一个校验和.

  

   具体的databases的结构如下图所示

   
redis的持久化
 

  selectdb:默认的常量

  db_number:数据库对应的编号

  key_value_pairs:由类型,键,值组成(type,key,value) 

  1.4  分析RDB文件

   

    在控制台执行od -c dump.rdb命令,可以看到rdb文件的二进制表示

0000000    R   E   D   I   S   0   0   0   7 372  \t   r   e   d   i   s
0000020    -   v   e   r 005   3   .   2   .   8 372  \n   r   e   d   i
0000040    s   -   b   i   t   s 300   @ 372 005   c   t   i   m   e 133
0000060    [   s 216   Z 372  \b   u   s   e   d   -   m   e   m 302 220
0000100    _ 017  \0 377   [ 036   t 240 223   < 300   )                
0000114

二.AOF持久化

  

    与RDB持久化通过保存数据库键值对不同,AOF方式是通过保存执行的写命令来记录数据库状态的.

   

   2.1 AOF持久化功能的实现

       AOF持久化功能的实现分为命令追加(append),文件写入,文件同步(sync)三个步骤.

       redis服务器进程就是一个事件循环,服务器在处理文件事件时可能会执行写命令,使得一些内容被追加到aof缓冲区中,所以每次结束事件处理的时候,都要考虑是否要将AOF缓冲区的内容写入和保存到AOF文件里面.

appendfsync选项        行为
always写入AOF并同步AOF(最安全最慢,最多丢失一条数据)
everysec(默认)写入AOF,如果距离上次同步超过1秒,则同步aof,这个操作由另外一个线程完成(最多丢失1秒的数据)
no写入不同步,何时同步由操作系统决定

    

   2.2 AOF文件的载入与数据还原

      具体还原步骤如下:

       1.创建一个伪客户端.

       2.从AOF中读取命令

       3.使用伪客户端发送命令

   2.3 AOF重写

    随着时间的流逝,AOF文件的体积会越来越大,所以需要重写AOF来精简它.redis服务器会创建一个新的AOF文件代替旧的AOF文件.

    举个例子: 执行1000次 incre  msg 1,AOF会把这1000条命令精简为set msg 1000.

    由于aof重写会阻塞进程,所以通常将AOF重写放到子进程去.以便于进程可以继续处理命令请求,不过这样也有一个问题,AOF重写过程中,新的命令如何同步?

    redis设计了一个AOF重写缓冲区,它在服务器创建子进程之后开始使用,当redis执行完一个写命令的时候,它会同时把这个命令发送给AOF缓冲区和重写缓冲区.

    
redis的持久化
 

   

       

    

相关推荐