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:默认的五个字节的字符

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

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

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

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

  

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

   

 

  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缓冲区和重写缓冲区.

    

 

   

 

 

 

       

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些关于 Redis 持久化的可能面试问题: 1. Redis持久化有哪些方式? Redis持久化有两种方式,一种是 RDB 持久化,一种是 AOF 持久化。 2. RDB 持久化和 AOF 持久化有什么区别? RDB 持久化是将 Redis 在内存中的数据快照保存到磁盘上,而 AOF 持久化则是将 Redis 执行的每条写命令记录到磁盘上。RDB 持久化可以节约磁盘空间,但可能会丢失最近的一些数据,而 AOF 持久化可以保证数据不会丢失,但可能会占用更多的磁盘空间和写入时间。 3. Redis持久化机制是如何保证数据一致性的? Redis持久化机制可以通过在每次写操作后立即同步到磁盘,或者设置定期同步时间来保证数据一致性。 4. Redis持久化可以在运行时进行吗? 可以,Redis持久化可以在运行时进行配置和切换,例如可以在运行时从 RDB 切换到 AOF 持久化,或者从 AOF 切换到 RDB 持久化。 5. Redis持久化会对性能产生影响吗? 会,Redis持久化会增加磁盘 I/O 开销,可能会对写入性能产生一定的影响,但可以通过合理的配置来平衡性能和数据一致性。 6. Redis持久化可以与 Redis 集群一起使用吗? 可以,Redis持久化可以与 Redis 集群一起使用,但需要注意配置文件的设置和数据同步的策略。 总之,Redis持久化是保证数据一致性和可靠性的重要手段,需要根据具体的业务需求和性能要求来选择合适的持久化方式,并进行合理的配置和优化。在面试中,还需要了解 Redis 持久化的原理、机制、优缺点、与集群的结合等方面的知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值