咱们都知道Redis是个内存数据库,全部的数据都存储在内存中。一旦服务器上Redis进程退出,数据库中的数据就会丢失。redis
持久化是作什么事呢?持久化简单的理解就是将内存中的数据作个备份。Redis的持久化有两种方法,即RDB持久化和AOF持久化。本文将会分两部分介绍这两种持久化方法,以及实现原理。数据库
1、RDB持久化
Redis数据持久化是将内存中的数据保存到磁盘里,避免数据意外丢失。RDB持久化会生成一个RDB文件,这个RDB文件是一个通过压缩的二进制文件。经过该文件能够还原出Redis数据库中的数据。RDB的持久化能够手动执行,也能够根据服务器配置项按期自动执行。服务器
下面咱们一块儿学习一下RDB文件是怎么建立的。有两个命令能够建立RDB文件,一个是SAVE,另外一个是BGSAVE。app
执行SAVE命令会阻塞Redis服务器进程,直到RDB文件建立完成为止,在服务器进程被阻塞期间,服务器不能处理任何命令请求。函数
执行BGSAVE命令会派生出一个子进程,而后由子进程负责建立RDB文件,服务器父进程继续处理命令请求。性能
SAVE命令和BGSAVE命令的底层调用的函数都是同一个函数rdbSave,只不过SAVE命令是直接调用这个函数,而BGSAVE会fork()出子进程来调用这个函数。伪代码以下:学习
RDB文件的载入工做是在服务器启动时自动执行的,只要Redis服务器在启动时检测到RDB文件存在,就会自动载入RDB文件。值得一提的是,Redis服务器在载入RDB文件的期间,会一直处于阻塞状态,直到载入工做完成为止。spa
BGSAVE命令在不阻塞服务器进程的状况下执行,因此Redis容许用户经过设置服务器的save选项来让服务器每隔一段时间自动执行一次BGSAVE命令。操作系统
上面条件只要知足其中一个,BGSAVE命令就会被执行:线程
- 第一条的意思是:服务器在900秒内对数据库执行过至少1次修改,就会执行BGSAVE命令
- 第二条的意思是:服务器在300秒内对数据库执行过至少10次修改,就会执行BGSAVE命令
- 第三条的意思是:服务器在60秒内对数据库执行过至少10000次修改,就会执行BGSAVE命令
2、AOF持久化
除了RDB持久化以外,Redis还提供了AOF持久化功能,二者的实现方式有着很大的不一样。RDB持久化是经过保存数据库中的键值对来记录数据库状态,而AOF持久化是经过保存Redis服务器所执行的写命令来记录记录数据库状态。
AOF持久化是如何实现的呢?AOF持久化分文三个步骤:命令追加、文件写入、文件同步。
- 命令追加:当AOF持久化功能打开时,服务器在执行完一个写命令后,会以必定的格式将被执行的写命令追加到服务器中的aof缓冲区中。aof缓冲区是redisServer结构体维护的一个SDS结构的属性。
- 文件写入:文件写入是指从Redis的aof缓冲区写入到操做系统的内存缓冲区。这个过程是为了提升文件的写入效率,可是带来的风险是服务器出现故障时,内存缓冲区中的数据会丢失掉。
- 文件同步:这个过程是将内存缓冲区中的数据写入到硬盘中的AOF文件中
Redis中默认执行的是RDB持久化,如何打开AOF持久化呢?咱们先来看看AOF的配置项:
①appendonly:这个参数是AOF的开关,配置成yes能够打开AOF持久化机制。打开AOF机制后
②appendfsync:咱们知道Redis中有个事件循环,Redis在每一个事件循环都会将aof缓冲区中的内容写入到操做系统的内存缓冲区。这个参数就是来配置将内存缓冲区中的数据同步到硬盘上的AOF文件中的更新频率,有always、everysec、no三个配置值。
- always表示每次执行写入操做,就会当即将内存缓冲区中的内容同步到磁盘中的AOF文件中。这种配置性能比较差,可是能够确保数据不丢失。
- everysec表示每秒执行一次将操做系统的内存缓冲区中的数据同步到磁盘的AOF文件中,这个操做由一个线程来负责,性能很高。
- no表示由操做系统来控制什么时候将内存缓冲区中的数据同步到硬盘的AOF文件中。这种操做在服务器出现异常时会丢失一部分数据。
下面说说AOF文件的还原过程,咱们知道AOF文件中存储的是全部曾经执行过的写命令,因此服务器只要读入并从新执行一遍AOF文件里保存的写命令,就能够还原服务器关闭以前的数据库内容。
同时为了解决在Redis运行过程当中AOF文件愈来愈大,Redis还提供了AOF重写功能,关于AOF重写原理在此不具体介绍,有兴趣的咱们能够私下讨论。
3、RDB和AOF区别和联系,以及同时工做时的状况
①首先咱们总结一下两种方式的区别和联系:
RDB持久化:默认开启;全量备份,一次性保存整个数据库;体积小,数据恢复快;服务器异常时可能会丢失部分数据;SAVE操做会阻塞,BGSAVE不阻塞
AOF持久化:默认关闭;增量备份,一次保存一个修改数据库的命令;体积大,数据恢复慢;备份频率能够本身设置;不会出现阻塞
②当RDB和AOF同时开始时:
- 若是RDB在执行snapshotting操做,那么redis不会执行AOF rewrite; 若是redis在执行AOF rewrite,那么就不会执行RDB snapshotting
- 若是RDB在执行snapshotting,此时用户执行BGREWRITEAOF命令,那么等RDB快照生成以后,才会去执行AOF rewrite
- 同时有RDB snapshot文件和AOF日志文件,那么redis重启的时候,会优先使用AOF进行数据恢复,由于其中的日志更完整