来源:孤独烟

持久化套路

OK,一般我们在生产上采用的持久化策略为

  • (1)master关闭持久化
  • (2)slave开RDB即可,必要的时候AOF和RDB都开启

该策略能够适应绝大部分场景,绝大部分集群架构。

为什么是绝大部分场景?

因为这套策略存在部分的数据丢失可能性。redis的主从复制是异步的,master执行完客户端请求的命令后会立即返回结果给客户端,然后异步的方式把命令同步给slave。因此master可能还未来得及将命令传输给slave,就宕机了,此时slave变为master,数据就丢了。

幸运的是,绝大部分业务场景,都能容忍数据的部分丢失。假设,真的遇到缓存雪崩的情况,代码中也有熔断器来进行资源保护,不至于所有的请求都转发到数据库上,导致我们的服务崩溃!

ps:这里的缓存雪崩是指同一时间来了一堆请求,请求的key在redis中不存在,导致请求全部转发到数据库上。

为什么是绝大部分集群架构?

因为在集群中存在redis读写分离的情况,就不适合这套方案了。

幸运的是,由于采用redis读写分离架构,就必须要考虑主从同步的延迟性问题,徒增系统复杂度。目前业内采用redis读写分离架构的项目,真的太少了。

为什么这么做

(1)master关闭持久化

原因很简单,因为无论哪种持久化方式都会影响redis的性能,哪一种持久化都会造成CPU卡顿,影响对客户端请求的处理。为了保证读写最佳性能,将master的持久化关闭!

RDB持久化

RDB持久化是将当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),保存的文件后缀是rdb;当Redis重新启动时,可以读取快照文件恢复数据。

那么RDB持久化的过程,相当于在执行bgsave命令。该命令执行过程如下图所示

如图所示,主线程需要调用系统函数fork(),构建出一个子进程进行持久化!很不幸的是,在构建子进程的过程中,父进程就会阻塞,无法响应客户端的请求!

而且,在测试中发现,fork函数在虚拟机上较慢,真机上较快。考虑到现在都是部署在docker容器中,很少部署在真机上,为了性能,master不建议打开RDB持久化!

AOF持久化

RDB持久化是将进程数据写入文件,而AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中。

随着时间的流逝,你会发现这个AOF文件越来越大,于是redis有一套rewrite机制,来缩小AOF文件的体积。然而,在rewrite的过程中也是需要父进程来fork出一个子进程进行rewrite操作。至于fork函数的影响,上面提到过了。

还有一个就是刷盘策略fsync,这个值推荐是配everysec,也就是Redis会默认每隔一秒进行一次fsync调用,将缓冲区中的数据写到磁盘。

然而,如果磁盘性能不稳定,fsync的调用时间超过1秒钟。此时主线程进行AOF的时候会对比上次fsync成功的时间;如果距上次不到2s,主线程直接返回;如果超过2s,则主线程阻塞直到fsync同步完成。

因此AOF也是会影响redis的性能的。

ps:linux函数中,wrtie函数将数据写入文件的时候,是将数据写入操作系统的缓冲区,还并未刷入磁盘。而fsync函数,可以强制让操作系统将缓冲区数据刷入磁盘。

综上所述,我们为了保证读写性能最大化,将master的持久化关闭。

(2)slave开RDB即可,必要的时候AOF和RDB都开启

首先,我先说明一下,我不推荐单开AOF的原因是,基于AOF的数据恢复太慢。

你要想,我们已经做了主从复制,数据已经实现备份,为什么slave还需要开持久化?

因为某一天可能因为某某工程,把机房的电线挖断了,就会导致master和slave机器同时宕机。

那么这个时候,我们需要迅速恢复集群,而RDB文件文件小、恢复快,因此灾难恢复常用RDB文件。

其次,官网也不推荐单开AOF,地址如下:

https://redis.io/topics/persistence

截图如下

所以,如果实在对数据安全有一定要求,将AOF和RDB持久化都开启。

另外,做好灾难备份。利用linux的scp命令,定期将rdb文件拷贝到云服务器上。

ps:scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。

总结

本文提出的是一种通用的持久化策略,主要目的是在面试的时候被问到,给出一个合理的回答,而不至于一脸懵逼。

end:如果你觉得本文对你有帮助的话,记得点赞转发,你的支持就是我更新动力。

redis为什么是cp_面试官:Redis怎么持久化的?如何回答持久化策略呢?相关推荐

  1. 阿里面试官Redis把我问到哑口无言…

    Redis在国内各大公司都很热门,比如新浪.阿里.腾讯.百度.美团.小米等.Redis也是大厂面试最爱问的,尤其是Redis客户端.Redis高级功能.Redis持久化和开发运维常用问题探讨.Redi ...

  2. 面试官经常提问的问题如何回答够得体?

    许多刚毕业的大学生在去参加面试之前,都会上网搜一搜面试的经验.谁都会有第一次,然而面试这么重要的事情,必须要做好功课,再去参加面试.那么面试官经常提问的问题如何回答够得体?青海高校招聘整理了如下的内容 ...

  3. java如何实现redis分片存储_面试官:你说一下Redis吧,怎么实现高可用,还有持久化怎么做的?...

    前言 作为Java程序员,在面试过程中,缓存相关的问题是躲不掉的,肯定会问,例如缓存一致性问题,缓存雪崩.击穿.穿透等.说到缓存,那肯定少不了Redis,我在面试的时候也是被问了很多关于Redis相关 ...

  4. redis怎么修改_面试官问我Redis事务,还问我有哪些实现方式

    ❝ 「第12期」 距离大叔的80期小目标还有68期,今天大叔要跟大家分享的内容是 -- Reids中的事务.同样,这也是redis中重要指数为四颗星的必备基础知识点.下面一起来了解一下吧. ❞ 相信大 ...

  5. Redis你能跟面试官聊哪些?

    简介:以上文章讲述的是[数据库性能调优知识与面试知识(详解四服务器性能剖析)]接下来我总结一下[Redis入门知识点].觉得我还可以的可以加群一起督促学习探讨技术.QQ群:1076570504 个人学 ...

  6. 面试官:Redis分布式锁解决方案是什么?

    今天博主在这片文章中主要给大家讲下Redis分布式锁的原理以及解决方案 学到三连呦 1.Redis分布式锁原理 1.1.简述 我们知道分布式锁的特性是排他.避免死锁.高可用.分布式锁的实现可以通过数据 ...

  7. 面试记录之上海某一家公司(包含面试官所提到的问题及回答)

    1.自我介绍 答:面试官,您好!我叫xxx,本科毕业于xxx大学软件工程专业,是一名2020届的应届生,来自xxx.大学期间我主修的课程有C语言,Java,软件项目管理等.在校期间参与过一个客户管理系 ...

  8. 面试官常问的问题及回答

    1. 我们为什么要雇请你呢? 有的面试只有这么一个问题.话虽简单,可是难度颇高.主要是测试你的沉静与自信.给一个简短.有礼貌的回答:"我能做好我要做得事情,我相信自己,我想得到这份工作&qu ...

  9. 面试官的一些问题要如何回答?

    1.为什么从上家离职? 首先这个问题是一个骨灰级问题,面试必问,很有必要认真探讨一下这个问题的答案.个人觉得可以从三方面来考虑回答(寻找新平台提升自己和表现出忠诚度和责任感) 1.在寻找新机会或新的平 ...

最新文章

  1. 「镁客·请讲」摩簦伞易新宇:对共享雨伞的不同理解,让他们玩法也和他人不同...
  2. RDD:基于内存的集群计算容错抽象
  3. 源码解读:KubeVela 是如何将 appfile 转换为 K8s 特定资源对象的
  4. 作为程序员,你会变身 TF boys 吗?
  5. UVA - 572 Oil Deposits
  6. linux多线程编程和linux 2.6下的nptl,Linux多線程編程和Linux 2.6下的NPTL
  7. 侯宁:不该捞的别去捞 踏空不是浪费时间
  8. 被遮挡的绝对定位 z-index
  9. JqueryUI 引领Java开发新方式:专注UI,快速开发!(JqueryUI+jeecg结合, 升华的开发模式)
  10. Unity3D-RPG项目实战(1):发动机的特殊文件夹
  11. java新人_JAVA新人之——专有名词
  12. php中 判断表中是否有重复,PHP:最常见的表中回显重复项的数量
  13. sort 升序还是降序?priority_queue 大根堆还是小根堆?
  14. HDUOJ---1233还是畅通工程
  15. 数据结构殷人昆电子版百度云资源_数据结构精讲与习题详解
  16. db9针232接口波特率标准_9针RS232-422-485接口定义
  17. Unity的超大开放世界解决方案
  18. 爱心的数学函数方程_数学表白函数—心形线
  19. linux主机名hostname老是被更改为broad原理分析和恢复
  20. 王德明——全球旅行达人,走遍世界阅尽繁华,为何他独爱于此?

热门文章

  1. 推荐爱奇艺开源的高性能网络安全监控引擎!
  2. 清华大学硕士程序员,纠结选开发还是转算法,烦死了!
  3. 微软某程序员吐槽:如果毕业去字节,现在总包150万!如今一年才50万,看见字节的人都抬不起头!...
  4. 本地缓存性能之王Caffeine
  5. Java 运行时数据区域,哪些是线程隔离的?哪些又是公有的?
  6. QCon演讲| 从团伙到团队,PingCode研发团队敏捷实践血泪史
  7. 情侣必做的100件小事,提升幸福感,快收藏
  8. 放弃在每日站会上按成员逐个发言
  9. 树莓派4B Ubuntu18 vnc开机自启动
  10. Kinect 骨骼追踪数据的处理方法