那Redis是怎么解决在bgsave做快照的时候允许数据修改呢?
小张:(你咋还问。。。我™不会啊!)
额,这个我不太清楚…
面试官:
这里主要是利用bgsave
的子线程实现的,具体操作如下:
-
如果主线程执行读操作,则主线程和
bgsave
子进程互相不影响; -
如果主线程执行写操作,则被修改的数据会复制一份副本,然后
bgsave
子进程会把该副本数据写入 RDB 文件,在这个过程中,主线程仍然可以直接修改原来的数据。
要注意,Redis 对 RDB 的执行频率非常重要,因为这会影响快照数据的完整性以及 Redis 的稳定性,所以在 Redis 4.0 后,增加了 AOF 和 RDB 混合的数据持久化机制: 把数据以 RDB 的方式写入文件,再将后续的操作命令以 AOF 的格式存入文件,既保证了 Redis 重启速度,又降低数据丢失风险。
小张:
学到了学到了。
面试官:
那你再跟我说说Redis如何实现高可用吧?
小张:
Redis实现高可用主要有三种方式:主从复制、哨兵模式,以及 Redis 集群。
主从复制
将从前的一台 Redis 服务器,同步数据到多台从 Redis 服务器上,即一主多从的模式,这个跟MySQL主从复制的原理一样。
哨兵模式
使用 Redis 主从服务的时候,会有一个问题,就是当 Redis 的主从服务器出现故障宕机时,需要手动进行恢复,为了解决这个问题,Redis 增加了哨兵模式(因为哨兵模式做到了可以监控主从服务器,并且提供自动容灾恢复的功能)。
Redis Cluster(集群)
Redis Cluster 是一种分布式去中心化的运行模式,是在 Redis 3.0 版本中推出的 Redis 集群方案,它将数据分布在不同的服务器上,以此来降低系统对单主节点的依赖,从而提高 Redis 服务的读写性能。
面试官:
使用哨兵模式在数据上有副本数据做保证,在可用性上又有哨兵监控,一旦master宕机会选举salve节点为master节点,这种已经满足了我们的生产环境需要,那为什么还需要使用集群模式呢?
小张:
额,哨兵模式归根节点还是主从模式,在主从模式下我们可以通过增加salve节点来扩展读并发能力,但是没办法扩展写能力和存储能力,存储能力只能是master节点能够承载的上限。所以为了扩展写能力和存储能力,我们就需要引入集群模式。
面试官:
集群中那么多Master节点,redis cluster在存储的时候如何确定选择哪个节点呢?
小张:
这应该是使用了某种hash算法,但是我不太清楚。。。
面试官:
那好,今天的面试就到这里吧,你先回去等我们的面试通知。
小张:
好的,谢谢面试官,你能告诉我redis cluster怎么实现节点选择的吗?
面试官:
Redis Cluster采用的是类一致性哈希算法实现节点选择的,至于什么是一致性哈希算法你自己回去看看。
Redis Cluster将自己分成了16384个Slot(槽位),哈希槽类似于数据分区,每个键值对都会根据它的 key,被映射到一个哈希槽中,具体执行过程分为两大步。
-
根据键值对的 key,按照 CRC16 算法计算一个 16 bit 的值。
-
再用 16bit 值对 16384 取模,得到
0~16383
范围内的模数,每个模数代表一个相应编号的哈希槽。
每个Redis节点负责处理一部分槽位,加入你有三个master节点 ABC,每个节点负责的槽位如下:
| 节点 | 处理槽位 |
| — | — |
| A | 0-5000 |
| B | 5001 - 10000 |
| C | 10001 - 16383 |
这样就实现了cluster节点的选择。
好了,今天关于Redis的面试就到这里了,你们觉得如何,都能答对吗?
新开了一个纯技术交流群,群里氛围还不错,无广告,无套路,单纯的吹牛逼,侃人生,想进的可以通过下方二维码加我微信,备注进群。
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
最后
看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面
小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>
针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺
全都是一丢一丢的收集整理纯手打出来的
更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~
片转存中…(img-hjlASCtn-1711152486738)]
全都是一丢一丢的收集整理纯手打出来的
更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~
[外链图片转存中…(img-bQdzLdZ2-1711152486738)]
[外链图片转存中…(img-ooPhexS1-1711152486739)]