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

同时为了解决在Redis运行过程中AOF文件越来越大,Redis还提供了AOF重写功能,关于AOF重写原理在此不具体介绍,有兴趣的我们可以私下讨论。

attachments-2020-08-fYRf2Z2W5f3f874802544.jpg

我们都知道Redis是个内存数据库,所有的数据都存储在内存中。一旦服务器上Redis进程退出,数据库中的数据就会丢失。

持久化是做什么事呢?持久化简单的理解就是将内存中的数据做个备份。

Redis的持久化有两种方法,即RDB持久化和AOF持久化。本文将会分两部分介绍这两种持久化方法,以及实现原理。

 

e45f52b384df431caf1bfcf4f0512708~tplv-k3u1fbpfcp-zoom-1.image

一、RDB持久化

Redis数据持久化是将内存中的数据保存到磁盘里,避免数据意外丢失。RDB持久化会生成一个RDB文件,这个RDB文件是一个经过压缩的二进制文件。通过该文件可以还原出Redis数据库中的数据。RDB的持久化可以手动执行,也可以根据服务器配置项定期自动执行。

下面我们一起学习一下RDB文件是怎么创建的。有两个命令可以创建RDB文件,一个是SAVE,另一个是BGSAVE。

14d35979235947a8aa2488d7abe3857a~tplv-k3u1fbpfcp-zoom-1.image

执行SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完成为止,在服务器进程被阻塞期间,服务器不能处理任何命令请求。

执行BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器父进程继续处理命令请求。

SAVE命令和BGSAVE命令的底层调用的函数都是同一个函数rdbSave,只不过SAVE命令是直接调用这个函数,而BGSAVE会fork()出子进程来调用这个函数。伪代码如下:

8c4cd96ba0ab455ab6d3135fbd10247e~tplv-k3u1fbpfcp-zoom-1.image


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

BGSAVE命令在不阻塞服务器进程的情况下执行,所以Redis允许用户通过设置服务器的save选项来让服务器每隔一段时间自动执行一次BGSAVE命令。


23c9c6e035c34e2c98fe59d91b8c1b0b~tplv-k3u1fbpfcp-zoom-1.image


上面条件只要满足其中一个,BGSAVE命令就会被执行:

第一条的意思是:服务器在900秒内对数据库执行过至少1次修改,就会执行BGSAVE命令

第二条的意思是:服务器在300秒内对数据库执行过至少10次修改,就会执行BGSAVE命令

第三条的意思是:服务器在60秒内对数据库执行过至少10000次修改,就会执行BGSAVE命令


ffe695b1d3aa497e82c8a9a87b7beada~tplv-k3u1fbpfcp-zoom-1.image


二、AOF持久化


除了RDB持久化之外,Redis还提供了AOF持久化功能,两者的实现方式有着很大的不同。RDB持久化是通过保存数据库中的键值对来记录数据库状态,而AOF持久化是通过保存Redis服务器所执行的写命令来记录记录数据库状态。


AOF持久化是如何实现的呢?AOF持久化分文三个步骤:命令追加、文件写入、文件同步。

命令追加:当AOF持久化功能打开时,服务器在执行完一个写命令后,会以一定的格式将被执行的写命令追加到服务器中的aof缓冲区中。aof缓冲区是redisServer结构体维护的一个SDS结构的属性。

文件写入:文件写入是指从Redis的aof缓冲区写入到操作系统的内存缓冲区。这个过程是为了提高文件的写入效率,但是带来的风险是服务器出现故障时,内存缓冲区中的数据会丢失掉。

文件同步:这个过程是将内存缓冲区中的数据写入到硬盘中的AOF文件中


Redis中默认执行的是RDB持久化,如何打开AOF持久化呢?我们先来看看AOF的配置项:

①appendonly:这个参数是AOF的开关,配置成yes可以打开AOF持久化机制。打开AOF机制后

②appendfsync:我们知道Redis中有个事件循环,Redis在每个事件循环都会将aof缓冲区中的内容写入到操作系统的内存缓冲区。这个参数就是来配置将内存缓冲区中的数据同步到硬盘上的AOF文件中的更新频率,有always、everysec、no三个配置值。

always表示每次执行写入操作,就会立即将内存缓冲区中的内容同步到磁盘中的AOF文件中。这种配置性能比较差,但是可以确保数据不丢失。

everysec表示每秒执行一次将操作系统的内存缓冲区中的数据同步到磁盘的AOF文件中,这个操作由一个线程来负责,性能很高。

no表示由操作系统来控制何时将内存缓冲区中的数据同步到硬盘的AOF文件中。这种操作在服务器出现异常时会丢失一部分数据。


下面说说AOF文件的还原过程,我们知道AOF文件中存储的是所有曾经执行过的写命令,所以服务器只要读入并重新执行一遍AOF文件里保存的写命令,就可以还原服务器关闭之前的数据库内容。

同时为了解决在Redis运行过程中AOF文件越来越大,Redis还提供了AOF重写功能,关于AOF重写原理在此不具体介绍,有兴趣的我们可以私下讨论。


attachments-2020-08-MbK1rVbu5f3f87d92d4a9.jpg

  • 发表于 2020-08-21 15:59
  • 阅读 ( 162 )
  • 分类:分布式

0 条评论

请先 登录 后评论
阿梓
阿梓

879 篇文章

作家榜 »

  1. 阿梓 879 文章
  2. p270228163 0 文章
  3. 陈洋 0 文章
  4. 维子老师 0 文章
  5. gyy 0 文章
  6. 花橙 0 文章
  7. 朱利海 0 文章
  8. 小熊 0 文章