Redis持久化机制 RDB和AOF

为什么需要持久化

Redis是基于内存的数据库,它把数据存储在内存当中,如果不想办法把数据存放在磁盘当中,一旦Redis进程退出,内存中的数据也就消失了。

为了解决这个问题,Redis提供了两种持久化方式,分别是RDB(Redis Database)和AOF(Append Only File)。

RDB持久化

RDB持久化是通过保存key-value对来保存Redis数据库状态。

RDB文件的创建和载入

Redis有两个命令可以用来生成RDB文件。一个是SAVE,另个是BGSAVE。

SAVE:SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完成,在这个期间,服务器不能处理其他的命令请求,如果客户端发送命令请求都会被拒绝。
BGSAVE:BFSAVE命令不会阻塞Redis进程,会派生出一个子进程,由这个子进程来负责创建RDB文件,父进程可以继续处理请求命令。

RDB文件的加载不需要手动载入,启动的时候如果检测到RDB文件存在,就会自动加载RDB文件。

自动定时保存原理

RDB持久化的方式是每间隔一段时间保存数据。
设置保存条件:
Redis服务器启动的时候,可以通过指定配置文件或者传入启动参数来设置save条件。默认的条件是

save 900 1
save 300 10
save 60 10000

第一个条件是服务器在900秒之内,对服务器至少进行了一次修改。
三个条件只要满足一个,服务器就会自动执行BFSAVE命令

服务器会根据save选项设置的保存条件,来设置redisServer结构里面的saveparams数组,数组里面的每一个元素是saveparam,里面的内容是save选项里面的保存条件。三个保存条件就会有三个saveparam元素。

服务器维护一个dirty计数器和lastsave属性。
dirty计数器的作用是记录上一次成功执行SAVE或者BGSAVE之后,Redis数据库进行了多少次修改。
lastsave是一个UNIX时间戳,记录了上一次成功执行SAVE或者BGSAVE命令的时间。

Redsi服务器有一个周期性操作函数serverCron,默认情况下,每个100毫秒就会执行一次,它会检查saveparams数组里面的保存条件,只要与一个条件满足,服务器就会执行BGSAVE命令。

AOF持久化

AOF是通过保存所有修改数据库的写操作命令来记录redis数据库的状态。
AOF持久化的实现主要分为命令追加,文件写入,文件同步,三个步骤:

命令追加:如果AOF的持久化功能在打开状态,服务器执行完一个写操作,就会把这个写命令追加到服务器状态的aof_buf缓冲区的末尾。

文件写入和同步:
Redis的服务器进程是一个事件循环。事件包括:文件事件和时间事件。
时间时间负责执行需要定时运行的函数,比如serverCron函数。
文件事件负责接收客户端的命令请求,返回结果。
服务器在每一次时间结束循环之前,会调用flushAppendOnlyFile函数,考虑是否把aof_buf缓冲区的内容写入到AOF文件里面。
flushAppendOnlyFile函数的行为,和配置项appendfsync有关。 默认情况下appendfsync配置成everysec。这样持久化的行为就是:把aof_buf缓冲区的内容写到AOF文件,如果上一次同步AOF的文件距离现在超过了一秒钟,就会再次对AOF的内容进行同步,这个同步操作是由一个线程专门负责。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值