page contents

作为程序员你不知道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
  • 阅读 ( 667 )
  • 分类:分布式

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1316 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章