考察点
现在的企业级开发中Redis的应用非常广泛,在面试中Redis几乎是必问的,因此除了Redis的基础知识之外,还要学习和了解一些经典和难点的题目!那么这个问题就是面试官想考察我们是不是平日里善于积累,仔细思考这方面的知识,同时想看看我们是不是具有这方面的能力!
回答
关于这个问题,我从以下几点来回答:
(1) Redis是一个基于Key-Value结构的内存数据库,在服务器重启的时候会丢失内存数据,所以为了避免Redis故障或者重启等因素导致数据丢失的问题,Redis为我们提供了RDB和AOF两种持久化机制。
(2) RDB持久化机制:RDB是通过快照的方式来实现持久化的,也就是说会根据快照的触发条件,把内存里面的数据快照写入到磁盘,以二进制的压缩文件进行存储,如图所示。bgsave线程触发异步快照,会fork()出一个子进程生成RDB文件,在写完之后,会用来替换旧的RDB文件。
RDB快照的触发方式分为异步和同步两种:
- 执行bgsave命令触发异步快照
- 执行save命令触发同步快照,同步快照会阻塞客户端的执行指令。
(3) AOF持久化机制:
AOF持久化是一种近乎实时的方式,把Redis Server执行的事务命令进行追加存储。在使用上往往是根据redis.conf文件里面的配置,自动触发bgsave主从复制的时候触发AOF持久化。简单来说,就是客户端执行一个数据变更的操作,Redis Server就会把这个命令追加到AOF缓冲区的末尾,然后再把缓冲区的数据写入到磁盘的AOF文件里面,至于最终什么时候真正持久化到磁盘,是根据刷盘的策略来决定的,刷盘策略可分为异步刷盘和同步刷盘两类。
AOF存在的问题:因为AOF这种指令追加的方式,会造成AOF文件过大,带来明显的IO性能问题,所以Redis针对这种情况提供了AOF重写机制,也就是说当AOF文件的大小达到某个阈值的时候,就会把这个文件里面相同的指令进行压缩。
(4) RDB和AOF的优缺点:
基于对RDB和AOF的工作原理的理解,我认为RDB和AOF的优缺点有两个:
- RDB是每隔一段时间触发持久化,因此数据安全性低,AOF可以做到实时持久化,数据安全性较高。
- RDB文件默认采用压缩的方式持久化,AOF存储的是执行指令,所以RDB在数据恢复的时候性能比AOF要好。
在我看来,所谓优缺点,本质上其实是哪种方案更适合当前的应用场景而已,毕竟鱼和熊掌不可兼得。
以上就是我对于这个问题的理解。
本文转载自微信公众号「程序员的故事」,可以通过以下二维码关注。转载本文请联系程序员的故事公众号。程序员的故事原创文章,遵循CC 4.0 BY-SA版权协议。