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

作为程序员你不知道Redis持久化,如何通过面试?
最新回答
╰未成年的花朵

2020-08-11 08:18:47

作为程序员,若面试中被问到Redis持久化,可从以下方面清晰阐述以通过面试:

首先明确Redis持久化的必要性:Redis是内存数据库,数据存储在内存中,一旦服务器上Redis进程退出,数据库中的数据就会丢失。持久化就是将内存中的数据做备份,避免数据意外丢失。

接着详细介绍两种持久化方式

  • RDB持久化

    原理:生成一个经过压缩的二进制RDB文件,通过该文件可还原出Redis数据库中的数据。

    创建方式

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

    BGSAVE命令:会派生出一个子进程,由子进程负责创建RDB文件,服务器父进程继续处理命令请求。SAVE命令和BGSAVE命令底层调用的函数都是rdbSave,SAVE命令直接调用,BGSAVE通过fork()出子进程来调用。

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

    自动执行:可通过设置服务器的save选项让服务器每隔一段时间自动执行一次BGSAVE命令。满足以下条件之一就会执行BGSAVE命令:

    服务器在900秒内对数据库执行过至少1次修改。

    服务器在300秒内对数据库执行过至少10次修改。

    服务器在60秒内对数据库执行过至少10000次修改。

  • AOF持久化

    原理:通过保存Redis服务器所执行的写命令来记录数据库状态。

    实现步骤

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

    文件写入:从Redis的aof缓冲区写入到操作系统的内存缓冲区,目的是提高文件写入效率,但服务器出现故障时内存缓冲区中的数据会丢失。

    文件同步:将内存缓冲区中的数据写入到硬盘中的AOF文件中。

    配置项

    appendonly:AOF的开关,配置成yes可打开AOF持久化机制。

    appendfsync:配置将内存缓冲区中的数据同步到硬盘上的AOF文件中的更新频率,有always、everysec、no三个配置值。

    always:每次执行写入操作,立即将内存缓冲区中的内容同步到磁盘中的AOF文件中,性能差但能确保数据不丢失。

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

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

    还原过程:服务器读入并重新执行一遍AOF文件里保存的写命令,即可还原服务器关闭之前的数据库内容。

    AOF重写:为解决Redis运行过程中AOF文件越来越大的问题,Redis提供了AOF重写功能。

最后说明RDB和AOF的区别和联系,以及同时工作的情况

  • 区别和联系

    RDB持久化:默认开启;全量备份,一次性保存整个数据库;体积小,数据恢复快;服务器异常时可能会丢失部分数据;SAVE操作会阻塞,BGSAVE不阻塞。

    AOF持久化:默认关闭;增量备份,一次保存一个修改数据库的命令;体积大,数据恢复慢;备份频率可以自己设置;不会出现阻塞。

  • 同时工作的情况

    如果RDB在执行snapshotting操作,那么Redis不会执行AOF rewrite;如果Redis在执行AOF rewrite,那么就不会执行RDB snapshotting。

    如果RDB在执行snapshotting,此时用户执行BGREWRITEAOF命令,那么等RDB快照生成之后,才会去执行AOF rewrite。

    同时有RDB snapshot文件和AOF日志文件,那么Redis重启的时候,会优先使用AOF进行数据恢复,因为其中的日志更完整。