5分钟深入了解Redis持久化

Redis持久化

Redis是一个优秀的内存数据库,由于存储在内存中,所以他的速度效率都很高,但正是由于存在内存中,当出现断电等非正常退出时,Redis的数据将会丢失,所以Redis推出一套持久化方案

RDB持久化

rdb持久化既可以手动执行,也可以配置定期执行,将保存的数据存储在一个经过压缩的二进制文件中,通过该文件可以还原生成rdb文件时数据库状态。

RDB文件的创建与载入
  • 有两个命令可以用于生成rdb文件

    • SAVE命令
      SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完成
    • BGSAVE命令
      BGSAVE命令会fork一个子进程,然后由子进程负责创建RDB文件
  • 载入
    RDB文件的载入是自动执行的,只要服务器在启动时检测到RDB文件,他就会自动载入RDB文件。

    • 但如果同时开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据库状态。
    • 只有在AOF持久化功能关闭的状态时,服务器才会使用RDB文件来还原数据库状态。

    RDB文件在载入时,服务器会一直处于阻塞状态,直到载入工作完成。

  • 自动间隔保存

    Redis允许用户通过设置服务器配置的save选项,让服务器每隔一段时间就自动执行BGSAVE命令。

    save 900 1
    save 300 10
    save 60 10000
    
    那么只要满足以上三个条件,BGSAVE命令就会被执行
    服务器在900秒之内,对数据库进行了至少1次修改。
    服务器在300秒之内,对数据库进行了至少10次修改。
    服务器在60秒之内,对数据库进行了至少10000次修改。
    
AOF持久化

除了RDB持久化功能之外,Redis还提供了AOF持久化功能,与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的命令来记录数据库的状态。

举个例子

set msg "123"
此时将服务器执行的SET、SADD等命令保存到AOF文件中
AOF持久化的实现

AOF功能实现可以分为命令追加、文件写入、文件同步三个步骤。

  • 命令追加
    当AOF功能打开时,服务器在执行完一个写命令之后,会将写命令追加到服务器状态的aof_buff缓冲区的末尾

  • 写入与同步
    redis服务器进程就是一个事件循环(loop),负责接收客户端的命令请求,以及向客户端发送命令回复,如果一些内容被追加到aof_buf缓冲区,那么在服务器每次结束一个事件循环之前,会调用flushAppendOnlyFile函数,考虑是否需要要将aof_buf缓冲区的内容写入和保存到AOF文件里面。

    flushAppendOnlyFile函数的行为由服务器配置的appendfsync选项的值来决定。

    appendfsync默认值为everysec。

    image.png

  • AOF文件载入与还原
    因为AOF文件里包含了重建数据库状态所需要的所有命令,服务器只需要读取并执行命令即可还原数据库状态。

  • AOF重写
    由于AOF文件里保存的是所执行的命令,随着服务器运行时间的流逝,AOF文件的内容会越来越多,文件的体积也会越来越大,很可能会对Redis服务器造成影响。

    • AOF文件重写的实现

      set msg "hello world"
      set msg "hello"
      set msg "hi"
      get msg
      

      比如以上四条命令,服务器会将这四条命令全部写入aof文件中,但实际上我们只需要最后两条命令,即可还原数据库的状态

      set msg "hi"
      get msg
      

      AOF重写功能实现原理其实就是从数据库读取现在的值,然后用一条命令去记录键值对,代替之前记录这个键值对的多条命令。

  • AOF后台重写
    AOF重写程序可以很好的完成创建一个新AOF文件任务,但是这个函数会进行大量的写入操作,所以调用这个函数的线程会被长时间阻塞,redis使用的是单个线程来处理命令请求,所以效率可能不太好,所以Redis决定将AOF重写程序放到子进程里执行。
    AOF后台重写也即是BGREWIRTEAOF命令的实现原理。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值