为什么需要持久化
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的内容进行同步,这个同步操作是由一个线程专门负责。