数据库|作为程序员你不知道Redis持久化,如何通过面试?


数据库|作为程序员你不知道Redis持久化,如何通过面试?
文章图片
数据库|作为程序员你不知道Redis持久化,如何通过面试?
文章图片
【数据库|作为程序员你不知道Redis持久化,如何通过面试?】
我们都知道Redis是个内存数据库 , 所有的数据都存储在内存中 。 一旦服务器上Redis进程退出 , 数据库中的数据就会丢失 。 持久化是做什么事呢?持久化简单的理解就是将内存中的数据做个备份 。 Redis的持久化有两种方法 , 即RDB持久化和AOF持久化 。 本文将会分两部分介绍这两种持久化方法 , 以及实现原理 。
01RDB持久化
Redis数据持久化是将内存中的数据保存到磁盘里 , 避免数据意外丢失 。 RDB持久化会生成一个RDB文件 , 这个RDB文件是一个经过压缩的二进制文件 。 通过该文件可以还原出Redis数据库中的数据 。 RDB的持久化可以手动执行 , 也可以根据服务器配置项定期自动执行 。 下面我们一起学习一下RDB文件是怎么创建的 。 有两个命令可以创建RDB文件 , 一个是SAVE , 另一个是BGSAVE 。
执行SAVE命令会阻塞Redis服务器进程 , 直到RDB文件创建完成为止 , 在服务器进程被阻塞期间 , 服务器不能处理任何命令请求 。 执行BGSAVE命令会派生出一个子进程 , 然后由子进程负责创建RDB文件 , 服务器父进程继续处理命令请求 。 SAVE命令和BGSAVE命令的底层调用的函数都是同一个函数rdbSave , 只不过SAVE命令是直接调用这个函数 , 而BGSAVE会fork()出子进程来调用这个函数 。 伪代码如下:
RDB文件的载入工作是在服务器启动时自动执行的 , 只要Redis服务器在启动时检测到RDB文件存在 , 就会自动载入RDB文件 。 值得一提的是 , Redis服务器在载入RDB文件的期间 , 会一直处于阻塞状态 , 直到载入工作完成为止 。 BGSAVE命令在不阻塞服务器进程的情况下执行 , 所以Redis允许用户通过设置服务器的save选项来让服务器每隔一段时间自动执行一次BGSAVE命令 。
上面条件只要满足其中一个 , BGSAVE命令就会被执行:

  • 第一条的意思是:服务器在900秒内对数据库执行过至少1次修改 , 就会执行BGSAVE命令第二条的意思是:服务器在300秒内对数据库执行过至少10次修改 , 就会执行BGSAVE命令
  • 第三条的意思是:服务器在60秒内对数据库执行过至少10000次修改 , 就会执行BGSAVE命令
02AOF持久化
除了RDB持久化之外 , Redis还提供了AOF持久化功能 , 两者的实现方式有着很大的不同 。 RDB持久化是通过保存数据库中的键值对来记录数据库状态 , 而AOF持久化是通过保存Redis服务器所执行的写命令来记录记录数据库状态 。
AOF持久化是如何实现的呢?AOF持久化分文三个步骤:命令追加、文件写入、文件同步 。
  • 命令追加:当AOF持久化功能打开时 , 服务器在执行完一个写命令后 , 会以一定的格式将被执行的写命令追加到服务器中的aof缓冲区中 。 aof缓冲区是redisServer结构体维护的一个SDS结构的属性 。
  • 文件写入:文件写入是指从Redis的aof缓冲区写入到操作系统的内存缓冲区 。 这个过程是为了提高文件的写入效率 , 但是带来的风险是服务器出现故障时 , 内存缓冲区中的数据会丢失掉 。
  • 文件同步:这个过程是将内存缓冲区中的数据写入到硬盘中的AOF文件中
Redis中默认执行的是RDB持久化 , 如何打开AOF持久化呢?我们先来看看AOF的配置项: