redis数据持久化

来源:互联网 发布:新卡购3.0外包系统源码 编辑:程序博客网 时间:2024/06/13 04:43

redis数据持久化

redis数据持久化分为两种方式:RDB持久化和AOF持久化。

RDB持久化

rdb持久化的基本原理是用.rdb文件保存当前数据库中的所有键值,redis服务重启的时候如果发现.rdb文件则自动加载文件数据到内存,回复数据库数据。
     创建edb文件的方式有两种:手动和自动
     1. 手动创建rdb文件
         在客户端使用save命令或者bgsave命令都能够将当前数据库中数据持久化到硬盘,保存为rdb文件(如下图所示)。不同的是save命令使用主进程做持久化操作,所以执行期间redis服务器将不能接收来着客户端的任何请求,拒绝服务。bgsave命令是在当前进程的基础上派生一个子进程来执行写操作,不会阻塞服务。bgsave命令使用子进程执行写操作,而大多数操作系统都是用写时复制技术来优化子进程的效率,所以这个时候服务器的内存会比较紧张,这就是为什么服务器rehash的时候如果正在执行bgsave或者bgrewriteaof命令,rehash因为会提高到5的原因。
    
   2. 自动创建rdb文件
       当redis服务启动时,用户可以通过指定配置文件或者传入启动参数的方式设置save选项,如果用户没有主动设置save选项,那么服务器会为save选项设置默认条件:

save 900 1

save 300 10

save 60 10000


表示的意思是在距离上一次成功执行save操作后的900s内数据被修改1次以上,300s内被修改10次以上,60s内被修改10000次以上,只要有其中一个条件满足就自动保存执行rdb持久化。

AOF持久化

aof持久化的基本原理是使用.aof文件保存数据库从启动到现在执行的所有写操作,redis服务重启的时候通过重新执行.aof文件中的写操作回复数据库数据。
     当aof持久化功能处于打开状态时,服务器在执行完一个写命令之后,都会将命令按照协议格式追加到服务器的aof_buf缓冲区末尾。redis服务其实际上就是一个事件循环(loop),每次结束一个时间循环之后,都会调用flushAppendOnlyFile函数,考虑是否需要将aof_buf缓冲区中的内容写入和保存到aof文件里面。flushAppendOnlyFile函数的行为由服务器配置的appendfsync选项的值来决定。各个值的具体含义如下:
appendfsync值含义appendfsync值flushAppendOnlyFile函数行为
always将aof_buf缓冲区中的所有内容写入病同步到AOF文件everysec将aof_buf缓冲区中的所有内容写入到AOF文件,如果上次同步AOF文件的时间距离现在超过一秒钟,
那么再次对AOF文件进行同步,并且这个同步由一个专门的线程负责。
no 将aof_buf缓冲区中的所有内容写到AOF文件,但并不对AOF文件进行同步,
何时同步由操作系统来决定。


通过AOF文件还原数据库的操作很简单,创建一个不带网络连接的伪客户端,一次从AOF文件中取出写指令以此执行即可。

AOF重写

随着数据的增长,AOF文件可能会不断变大,如果不加以控制的话可能会对redis服务造成影响,为了解决这个问题,redis提供AOF文件重写功能,创建一个新的AOF文件替换现有的AOF文件。重写功能的实现其实是通过读取数据库数据来实现的,每读到一条数据,则将其转换成一条等价的些操作指令存到AOF文件,这样新的AOF文件将省去很多不必要的操作,节省空间。