Redis 是内存数据库,若是不将内存中的数据保存到磁盘,进程退出的时候内存中的数据也会被清除。为了解决该问题,Redis 持久化有两种方式,分别是RDB和AOF。下面会比较详细介绍这两种持久化方式。redis
RDB持久化既能够手动执行,也能够根据服务器配置选项按期执行,该功能就是把某个时间点的内存数据状态保存到一个通过压缩的二进制文件(即 RDB文件)中。数据库
在redis.conf文件中配置以下:只要知足如下三个条件中的任何一个就会触发持久化操做:缓存
手动执行,能够在客户端中直接运行save、bgsave、bgrewriteaof命令触发持久化操做。save命令执行是同步操做,Redis服务器会被阻塞, 因此客户端请求会被阻塞;bgsave命令执行是异步操做,会建立一个子进程来完成RDB持久化操做,因此当用bgsave建立RDB文件的过程,服务器仍然能够处理客户端的请求;bgrewriteaof命令跟bgsave差很少。bash
RDB方式持久化是在某个时间点把内存中key-value数据同步到RDB文件中。服务器
AOF 持久化是经过把Redis 服务器所执行的写命令追加到AOF文件的方式来实现的。AOF持久化功能的实现分为命令追加、文件写入和文件同步三步骤。app
在redis.conf文件中配置以下:异步
appendonly yes appendfilename "appendonly.aof"
默认是no关闭状态。函数
服务器在执行完一个写命令以后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓存区的末尾。 操作系统
服务器会调用flushAppendOnlyFile函数,并根据服务器配置的appendfsync选项的值类决定是否把aof_buf缓存区的数据写入保存到AOF文件中。线程
appendfsync 选项的值 | flushAppendOnlyFile 函数行为 |
always | 将aof_buf缓冲区中的全部内容写入并同步到AOF文件 |
everysec | 将aof_buf缓冲区中的全部内容写入到AOF文件,若是上次同步AOF 文件的时间距离如今超过一秒钟, 那么再次对AOF文件进行同步,而且这个同步操做是用一个线程专门负责执行的 |
no | 将aof_buf缓冲区中的全部内容写入到AOF文件,但不对AOF文件进行同步,什么时候同步由操做系统来决定 |
默认值是 everysec。
为了提升文件的写入效率,如今操做系统中,当用户调用write函数,将一些数据写入到文件的时候,操做系统一般会将写入的数据暂时保存咋一个内存缓冲区里面,等到缓冲区的空间呗填满、或者超过指定的阀值后,才真正的将缓冲区中的数据写入到磁盘中。