咱们都知道,Redis是一个键值对的数据库服务器,服务器中包含着若干个非空的数据库,每一个非空的数据库中包含任意个键值对,它将本身的数据都存储在内存中,若是咱们不采起措施将在内存中的数据保存到磁盘中的话,若是一旦出现服务器宕机的状况下,服务器中的数据库数据也会随之而消失。这时候,Redis就提供了两种Redis的持久化功能:RDB持久化和AOF持久化。数据库
RDB经过保存数据库中的键值对来记录数据库状态的不一样。服务器
RDB既能够手动置顶,也能够配置服务器选项进行按期执行,实现是将某个时间点上的Redis数据库中的数据保存到一个RDB文件中,RDB文件是一个通过压缩的二进制文件,经过该文件能够还原生成时的Redis数据库数据。网络
通常的话,是有两个Redis的命令能够用于生成RDB文件,一个是SAVE,一个是BGSAVE。其中SAVE命令在执行是,会阻塞服务器进程,直到RDB文件建立成,在进程阻塞期间,服务器不能进行任何请求操做。另外一个BGSAVE命令的方式则是派生一个子进程,由子进程负责建立RDB文件,服务器进程继续处理请求。建立RDB文件的实际工做由rdb.c/rdbSave函数来执行,两种命令分别以不一样的方式来调用函数执行。app
读取RDB文件是在服务器启动的时候自动完成的,只要再Redis服务器启动的时候有检测到RDB文件的存在,就会自耦东读取RDB文件。函数
Redis服务器中维持着一个dirty技术区和一个lastsave属性,用来判断是否执行保存命令性能
BGSAVE能够在不阻塞服务器进程的状况下执行,因此咱们能够配置服务器的save选项,让服务器每间隔一段时间自动执行一次BGSAVE命令。服务器默认设置save选项以下:spa
1 save 900 1 2 save 300 10 3 save 60 10000
对应的意思是:线程
咱们能够经过制定配置文件或者传入启动参数的方式来设置save选项code
一个默认没间隔100毫秒就会执行一次的函数,它的任务之一就是检查save选项所设置的保存条件是否知足,知足的状况下,就执行BGSAVE命令。server
AOF持久化是经过保存Redis服务器所执行的命令来记录数据库状态的,被写入AOF的全部命令都是以Redis的请求协议格式来进行保存的。它的整个执行流程大体分为三步:
读取文件的执行点同时是在服务器启动的时候。由于AOF文件中包含了重建数据库的全部命令,因此服务器只要从新执行一遍AOF文件中保存的命令,就能够还原数据库保存以前的数据。Redis经过建立一个没有网络链接的伪客户端来执行AOF中保存的写命令。步骤为:
咱们知道AOF文件中保存的是每一次执行的命令,随着时间的进行,AOF文件的中的内容会愈来愈多,可是当Redis客户端即执行了添加,也执行了删除的语句以后,咱们能够简单的使用一个新的命令也可以达到数据库中数据一致的状态,这时候就讲到了Redis的文件重写功能。
服务器经过建立一个新的AOF文件来替代原有的AOF文件,新旧两个文件保存相同的数据库状态,可是新的文件不会包含任何冗余的命令,大大减少了AOF文件的体积。
AOF文件的重写功能是经过读取当前的数据库状态来执行的。并不会对原有的AOF文件进行任何的操做。具体的执行是经过调用aof_rewrite函数来执行的,而为了不影响服务器的性能,这个也是单独开辟线程来执行的,为了不在执行重写过程当中的数据不一致问题,Redis服务器还设置了一个重写缓冲区来执行在重写过程当中追加的命令
AOF文件的更新频率高于RDB文件