Redis持久化
Redis是一个优秀的内存数据库,由于存储在内存中,所以他的速度效率都很高,但正是由于存在内存中,当出现断电等非正常退出时,Redis的数据将会丢失,所以Redis推出一套持久化方案
RDB持久化
rdb持久化既可以手动执行,也可以配置定期执行,将保存的数据存储在一个经过压缩的二进制文件中,通过该文件可以还原生成rdb文件时数据库状态。
RDB文件的创建与载入
-
有两个命令可以用于生成rdb文件
- SAVE命令
SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完成 - BGSAVE命令
BGSAVE命令会fork一个子进程,然后由子进程负责创建RDB文件
- SAVE命令
-
载入
RDB文件的载入是自动执行的,只要服务器在启动时检测到RDB文件,他就会自动载入RDB文件。- 但如果同时开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据库状态。
- 只有在AOF持久化功能关闭的状态时,服务器才会使用RDB文件来还原数据库状态。
RDB文件在载入时,服务器会一直处于阻塞状态,直到载入工作完成。
-
自动间隔保存
Redis允许用户通过设置服务器配置的save选项,让服务器每隔一段时间就自动执行BGSAVE命令。
save 900 1 save 300 10 save 60 10000 那么只要满足以上三个条件,BGSAVE命令就会被执行 服务器在900秒之内,对数据库进行了至少1次修改。 服务器在300秒之内,对数据库进行了至少10次修改。 服务器在60秒之内,对数据库进行了至少10000次修改。
AOF持久化
除了RDB持久化功能之外,Redis还提供了AOF持久化功能,与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的命令来记录数据库的状态。
举个例子
set msg "123"
此时将服务器执行的SET、SADD等命令保存到AOF文件中
AOF持久化的实现
AOF功能实现可以分为命令追加、文件写入、文件同步三个步骤。
-
命令追加
当AOF功能打开时,服务器在执行完一个写命令之后,会将写命令追加到服务器状态的aof_buff缓冲区的末尾 -
写入与同步
redis服务器进程就是一个事件循环(loop),负责接收客户端的命令请求,以及向客户端发送命令回复,如果一些内容被追加到aof_buf缓冲区,那么在服务器每次结束一个事件循环之前,会调用flushAppendOnlyFile函数,考虑是否需要要将aof_buf缓冲区的内容写入和保存到AOF文件里面。flushAppendOnlyFile函数的行为由服务器配置的appendfsync选项的值来决定。
appendfsync默认值为everysec。
-
AOF文件载入与还原
因为AOF文件里包含了重建数据库状态所需要的所有命令,服务器只需要读取并执行命令即可还原数据库状态。 -
AOF重写
由于AOF文件里保存的是所执行的命令,随着服务器运行时间的流逝,AOF文件的内容会越来越多,文件的体积也会越来越大,很可能会对Redis服务器造成影响。-
AOF文件重写的实现
set msg "hello world" set msg "hello" set msg "hi" get msg
比如以上四条命令,服务器会将这四条命令全部写入aof文件中,但实际上我们只需要最后两条命令,即可还原数据库的状态
set msg "hi" get msg
AOF重写功能实现原理其实就是从数据库读取现在的值,然后用一条命令去记录键值对,代替之前记录这个键值对的多条命令。
-
-
AOF后台重写
AOF重写程序可以很好的完成创建一个新AOF文件任务,但是这个函数会进行大量的写入操作,所以调用这个函数的线程会被长时间阻塞,redis使用的是单个线程来处理命令请求,所以效率可能不太好,所以Redis决定将AOF重写程序放到子进程里执行。
AOF后台重写也即是BGREWIRTEAOF命令的实现原理。