Redis持久化

»Redis

Redis是一个键值对数据库服务器,它将自己的每个数据库的键值对都存储在内存中,所以Redis是内存数据库,如果不想办法将存储在内存中的数据保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据就都没了。为了解决这个问题,Redis提供了RDB持久化和AOF持久化这两种方式。

目录:

RDB持久化

RDB持久化是将某个时间点上的数据库状态保存到一个RDB文件中,通过该文件可以还原到文件中描述的数据库状态。

RDB文件是一个经过压缩的二进制文件。

RDB文件的载入与创建

有两个命令用于创建RDB文件,SAVE和BGSAVE。SAVE命令会阻塞Redis服务器进程,即进行SAVE操作时,客户端发来的请求会被阻塞。BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程继续处理客户端请求。

RDB文件的载入是在服务器启动时自动执行的,只要服务器在启动时检测到RDB文件存在,他就会自动载入RDB文件。服务器在载入RDB文件期间,会一直处于阻塞状态,直到载入工作完成为止。

可以通过设置,自动执行BGSAVE命令。

RDB文件里面存储的是整个Redis服务器的所有键值对。

AOF持久化

AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。

AOF持久化的实现

AOF持久化的实现分为命令追加,文件写入,文件同步三个步骤

命令追加是指服务器在执行一个写命令后会将写命令追加到服务器的aof_buf缓冲区的末尾。

文件写入是指将aof_buf缓冲区的内容写入到AOF文件中。

文件同步是指,上一步中的文件写入实际上是将aof_buf缓冲区的内容写入到一个内存缓冲区中,同步就是将内存缓冲区中的内容真正写入到文件中

AOF通过一个sppendfsync选项的值来设置文件写入同步策略。该选项有三个值always、everysec、no,默认的是everysec,即每次写入的时候如果距离上一次同步超过1秒钟,那么就执行同步。

AOF重写

AOF文件里面包含的是所有写的命令,如果操作特别多,随着时间的推移,那么AOF文件将会很大,AOF重写就是Redis服务器创建一个新的AOF文件来替换当前的AOF文件,新旧两个AOF文件里面保存的数据库状态相同,但是新的AOF文件不会包含任何冗余的命令。

具体实现是通过读取服务器当前的数据库状态来实现的。即通过读取服务器当前的键值对来生成命令。


如果服务器开启AOF持久化功能,那么服务器会优先使用AOF文件来还原数据库,只有AOF持久化功能处于关闭时,服务器才会采用RDB文件来还原数据库。