专栏名称: 程序员鱼皮
鹅厂全栈开发,持续分享编程技法和实用项目
目录
相关文章推荐
吉安公安  ·  悬赏执行公告! ·  2 天前  
河北高院  ·  纠正“小过重罚”,彰显司法温度 ·  3 天前  
最高人民检察院  ·  习近平在听取吉林省委和省政府工作汇报时强调 ... ·  4 天前  
51好读  ›  专栏  ›  程序员鱼皮

Redis 备份时,不能正常处理请求?

程序员鱼皮  · 公众号  ·  · 2024-08-21 16:00

正文

此答案节选自我们最近弄的 面试鸭刷题工具 ,更多 大厂常问面试题 ,可以点击下面的小程序进行阅读哈!



回答重点

默认情况下 Redis 生成 RDB 的过程是异步的(采用 bgsave),主线程会调用 fork 创建一个子线程,由子线程负责将内存的数据写入磁盘,生成 RDB 文件。

那生成 RDB 文件的时候,数据可以修改吗?

当然可以。主线程会正常处理客户端的请求,进行数据的修改。但数据被修改还叫快照吗?

此时就运用了 写时复制 的技术。

当父进程 fork 出一个子进程后,并不会把父进程的所有内存数据重新复制一份给子进程,而是让主进程和子进程共享相同的内存页面。

底层的实现仅仅复制了 页表 ,但映射的物理内存还是同一个。这样做可以加快 fork 的速度,减少性能损耗(fork会阻塞主线程)。

此时,父进程收到写命令,需要修改数据,那么父进程会将对应数据所在的页复制一份,对复制的副本进行修改。此时子进程指向的还是老的页,因此数据没有变化,符合快照的概念。

通过在写的时候才触发内存的复制,可以显著地降低 Redis 实例的性能压力,最大限度的减少 RDB 对服务正常运行的影响。

扩展知识

如果 RDB 时间长,且写并发高,因为写时复制机制,如果共享的每一页内存都被修改,会使得内存极速膨胀,最大内存可以膨胀两倍,所以要注意内存的使用量,防止内存过载。

RDB 会产生大量的磁盘 I/O,要注意磁盘性能导致的影响。

还需要注意 CPU 负载,毕竟有大量的数据需要写入。

因此如果 RDB 在高峰期可能会影响到正常业务,需要合理安排生成 RDB 的时机。


最后

咱们面试鸭立志成为 一款题库全面、持续更新、题解优质的刷题神器 ,主要目的就是为了彻底解决所有你能想到的八股文学习痛点!

我们精选了近两年的高频面试真题, 已经 有 5000 多道面试题 啦, 由大厂资深面试官手写答案,押题命中率超高!

不仅有传统八股文,场景题、项目题、系统设计题等等应有尽有 ,还在不断更新中!

当前早鸟福利!最低价 99.9







请到「今天看啥」查看全文