解密Redis:应对面试中的缓存相关问题2

在这里插入图片描述

面试官:Redis集群有哪些方案,知道嘛?
候选人:嗯~~,在Redis中提供的集群方案总共有三种:主从复制、哨兵模式、Redis分片集群。

面试官:那你来介绍一下主从同步。
候选人:嗯,是这样的,单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,可以搭建主从集群,实现读写分离。一般都是一主多从,主节点负责写数据,从节点负责读数据。主节点写入数据之后,需要把数据同步到从节点中。

面试官:能说一下,主从同步数据的流程。
候选人:嗯~~,好!主从同步分为了两个阶段,一个是全量同步,一个是增量同步。全量同步是指从节点第一次与主节点建立连接的时候使用的同步方式。

第一:从节点请求主节点同步数据,其中从节点会携带自己的replication id和offset偏移量。

第二:主节点判断是否是第一次请求,主要判断的依据就是,主节点与从节点是否是同一个replication id,如果不是,就说明是第一次同步,那主节点就会把自己的replication id和offset发送给从节点,让从节点与主节点的信息保持一致。

第三:同时主节点会执行bgsave,生成rdb文件后,发送给从节点去执行,从节点先把自己的数据清空,然后执行主节点发送过来的rdb文件,这样就保持了一致。当然,如果在rdb生成执行期间,依然有请求到了主节点,主节点会以命令的方式记录到缓冲区,缓冲区是一个日志文件,最后把这个日志文件发送给从节点,这样就能保证主节点与从节点完全一致了,后期再同步数据的时候,都是依赖于这个日志文件,这个就是全量同步。

增量同步指的是,当从节点服务重启之后,数据就不一致了,所以这个时候,从节点会请求主节点同步数据。主节点还是判断不是第一次请求,不是第一次就获取从节点的offset值,然后主节点从命令日志中获取offset值之后的数据,发送给从节点进行数据同步。

在这里插入图片描述

面试官:怎么保证Redis的高并发高可用?
候选人:首先可以搭建主从集群,再加上使用Redis中的哨兵模式。哨兵模式可以实现主从集群的自动故障恢复,里面就包含了对主从服务的监控、自动故障恢复、通知。如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主。同时Sentinel也充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端,所以一般项目都会采用哨兵的模式来保证Redis的高并发高可用。

面试官:你们使用Redis是单点还是集群,哪种集群?
候选人:嗯!,我们当时使用的是主从(1主1从)加哨兵。一般单节点不超过10G内存,如果Redis内存不足则可以给不同服务分配独立的Redis主从节点。尽量不做分片集群,因为集群维护起来比较麻烦,并且集群之间的心跳检测和数据通信会消耗大量的网络带宽,也没有办法使用lua脚本和事务。

面试官:Redis集群脑裂,该怎么解决呢?
候选人:嗯! 这个在项目很少见,不过脑裂的问题是这样的,我们现在用的是Redis的哨兵模式集群的。

有的时候由于网络等原因可能会出现脑裂的情况,就是说,由于Redis master节点和Redis slave节点和Sentinel处于不同的网络分区,使得Sentinel没有能够心跳感知到master,所以通过选举的方式提升了一个slave为master,这样存在了两个master,就像大脑分裂了一样,这样会导致客户端还在old master那里写入数据,新节点无法同步数据。当网络恢复后,Sentinel会将old master降为slave,这时再从新master同步数据,这会导致old master中的大量数据丢失。

关于解决的话,我记得在Redis的配置中可以设置:第一可以设置最少的slave节点个数,比如设置至少要有一个从节点才能同步数据。第二个可以设置主从数据复制和同步的延迟时间,达不到要求就拒绝请求,就可以避免大量的数据丢失。

面试官:Redis的分片集群有什么作用?
候选人:分片集群主要解决的是,海量数据存储的问题,集群中有多个master,每个master保存不同数据,并且还可以给每个master设置多个slave节点,就可以继续增大集群的高并发能力。同时,每个master之间通过ping监测彼此健康状态,就类似于哨兵模式了。当客户端请求可以访问集群任意节点,最终都会被转发到正确节点。

面试官:Redis分片集群中数据是怎么存储和读取的?
候选人:嗯~,在Redis集群中是这样的,Redis集群引入了哈希槽的概念,有16384个哈希槽。集群中每个主节点绑定了一定范围的哈希槽范围,key通过CRC16校验后对16384取模来决定放置哪个槽,通过槽找到对应的节点进行存储。

取值的逻辑是一样的,客户端请求通过CRC16校验后对16384取模,找到对应的槽所在的节点,从而进行数据读取。

面试官:Redis是单线程的,但是为什么还那么快?
候选人:嗯,这个有几个原因。首先,Redis是完全基于内存的,C语言编写,内存的读写速度非常快,使得Redis具有极高的读写性能。其次,Redis采用单线程,避免了不必要的上下文切换和竞争条件,提高了处理效率。此外,Redis使用多路I/O复用模型,非阻塞IO,能够在等待一个Socket的同时监听多个Socket,充分利用CPU资源,提高了网络处理性能。例如,bgsave和bgrewriteaof都是在后台执行操作,不影响主线程的正常使用,不会产生阻塞。这些因素共同作用使得Redis在单线程下仍然能够表现出优异的性能。
在这里插入图片描述

面试官:能解释一下I/O多路复用模型?
候选人:嗯~~,I/O多路复用是指利用单个线程来同时监听多个Socket,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。目前的I/O多路复用都是采用的epoll模型实现,它会在通知用户进程Socket就绪的同时,把已就绪的Socket写入用户空间,不需要挨个遍历Socket来判断是否就绪,提升了性能。

其中,Redis的网络模型就是使用I/O多路复用结合事件的处理器来应对多个Socket请求。例如,提供了连接应答处理器、命令回复处理器,命令请求处理器。在Redis6.0之后,为了提升更好的性能,在命令回复处理器使用了多线程来处理回复事件,在命令请求处理器中,将命令的转换使用了多线程,增加命令转换速度,在命令执行的时候,依然是单线程。这样的设计使得Redis在单线程下依然能够处理高并发的请求,保证了其快速的响应速度。

面试官:非常好的解释!继续往下问,Redis主从同步的时候,是否存在数据丢失的风险?

候选人:在主从同步的过程中,确实存在数据丢失的风险。主从同步分为全量同步和增量同步两个阶段。

全量同步是在从节点第一次与主节点建立连接时使用的同步方式。主节点会将自己的数据发送给从节点,保持两者的数据一致。但是在全量同步期间,如果主节点接收到了新的写入请求,这些写入请求会被记录到缓冲区(命令缓冲区或复制缓冲区)中。如果此时主节点宕机,那么缓冲区中的数据会丢失,从节点只能从头开始进行全量同步,可能会丢失部分数据。

增量同步是在从节点服务重启之后使用的同步方式。此时,从节点会请求主节点同步增量数据。但是在增量同步期间,如果主节点接收到了新的写入请求,而从节点服务还未重启,那么从节点可能会丢失这部分期间的数据。

为了减少数据丢失的风险,可以考虑使用持久化机制,即通过开启AOF(Append Only File)或RDB(Redis Database)持久化来将数据保存到硬盘中,以防止数据丢失。同时,合理配置Redis的参数,避免缓冲区溢出或过小,也可以降低数据丢失的风险。

面试官:很棒!你对Redis的集群方案和同步机制都有很深入的理解。那最后一个问题,Redis集群在扩展性方面有什么考虑?

候选人:Redis集群在扩展性方面非常灵活。可以通过主从复制方式实现读写分离,提高读写性能。同时,也可以通过搭建Redis分片集群来实现水平扩展,增加集群的高并发能力。

在Redis分片集群中,数据被分散到多个节点上,每个节点负责处理其中的一部分数据,从而将负载均衡到多个节点上,提高了集群的整体性能。当需要扩展集群时,只需添加新的主节点,将部分数据迁移到新节点上即可。这种方式可以有效地利用服务器资源,实现线性扩展。

但是需要注意的是,Redis分片集群的维护和管理较为复杂,需要考虑数据的拆分和迁移、负载均衡、故障处理等问题。因此,在选择集群方案时,需要综合考虑业务需求、硬件资源、运维成本等因素。

面试官:非常好!你对Redis的集群方案和扩展性有着深入的了解。感谢你的分享和解答,你在本次面试中表现非常出色!

候选人:非常感谢您给予我这次面试机会,能够与您分享我的知识和经验,我也从中学到了很多新的东西。无论结果如何,我都会继续努力,不断学习和提升自己的技术水平。再次感谢您!

在这里插入图片描述

在这次面试中,候选人表现出色地回答了关于Redis集群方案的问题。他介绍了Redis集群提供的三种方案:主从复制、哨兵模式和Redis分片集群。然后,他深入解释了主从同步的过程,包括全量同步和增量同步,并指出了在主从同步过程中可能存在的数据丢失风险。候选人还提到了如何保证Redis的高并发高可用,包括搭建主从集群和使用哨兵模式,以实现自动故障恢复。

候选人对Redis分片集群的作用和数据存储、读取的流程进行了清晰的解释。他还回答了Redis为什么能够高效快速的问题,涉及到Redis基于内存、采用单线程、使用多路I/O复用模型等特点。此外,候选人还解释了I/O多路复用模型的概念和工作原理。

最后,候选人对于面试官的问题,如Redis集群扩展性方面的考虑,也进行了深入的回答。他提到了通过主从复制实现读写分离和通过Redis分片集群实现水平扩展,以提高集群的高并发能力。同时,他也提到了在选择集群方案时需要综合考虑多个因素。

候选人在本次面试中展现了对Redis集群方案的深入理解和扎实的技术功底。他的回答表现出了他对Redis的高度熟悉和对技术细节的把握。在整个面试过程中,候选人表现得非常自信和专业,对问题的回答清晰明了,展现了良好的沟通能力和技术能力。

总体来说,候选人在这次面试中表现出色,展现了他在Redis方面的专业知识和技能。他的深入解答和自信表现给面试官留下了深刻的印象。无论结果如何,候选人都展现了他的学习态度和对技术的热情,相信他会在未来的发展中取得更大的成就。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/25488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter iOS 集成使用 fluter boost

在 Flutter项目中集成完 flutter boost,并且已经使用了 flutter boost进行了路由管理,这时如果需要和iOS混合开发,这时就要到 原生端进行集成。 注意:之前建的项目必须是 Flutter module项目,并且原生项目和flutter m…

Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机接口数据吞吐量(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来获取相机当前数据吞吐量(C) Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在BGAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过BGAPI SDK获取数…

【微信小程序】van-uploader实现文件上传

使用van-uploader和wx.uploadFile实现文件上传,后端使用ThinkPHP。 1、前端代码 json:引入van-uploader {"usingComponents": {"van-uploader": "vant/weapp/uploader/index"} }wxml:deletedFile是删除文件函…

Xilinx FPGA电源设计与注意事项

1 引言 随着半导体和芯片技术的飞速发展,现在的FPGA集成了越来越多的可配置逻辑资源、各种各样的外部总线接口以及丰富的内部RAM资源,使其在国防、医疗、消费电子等领域得到了越来越广泛的应用。当采用FPGA进行设计电路时,大多数FPGA对上电的…

【计算机网络】12、frp 内网穿透

文章目录 一、服务端设置二、客户端设置 frp :A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet。是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且…

VUE框架:vue2转vue3全面细节总结(5)过渡动效

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人_python人工智能视觉(opencv)从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了: https://blog.csdn.net/lbcy…

ES6 数组的用法

1. forEach() 用来循环遍历的 for 数组名.forEach(function (item,index,arr) {})item:数组每一项 , index : 数组索引 , arr:原数组作用: 用来遍历数组 let arr [1, 2, 3, 4]; console.log(arr); let arr1 arr.forEach((item, index, arr) > {console.log(item, index…

HTTP——八、确认访问用户身份的认证

HTTP 一、何为认证二、BASIC认证BASIC认证的认证步骤 三、DIGEST认证DIGEST认证的认证步骤 四、SSL客户端认证1、SSL 客户端认证的认证步骤2、SSL 客户端认证采用双因素认证3、SSL 客户端认证必要的费用 五、基于表单认证1、认证多半为基于表单认证2、Session 管理及 Cookie 应…

Android network — iptables四表五链

Android network — iptables四表五链 1. iptables简介2. iptables的四表五链2.1 iptables流程图2.2 四表2.3 五链2.4 iptables的常见情况 3. NAT工作原理3.1 BNAT3.2 NAPT 4. iptables配置 本文主要介绍了iptables的基本工作原理和四表五链等基本概念以及NAT的工作原理。 1. i…

RocketMQ Learning

一、RocketMQ RocketMQ的产品发展 MetaQ:2011年,阿里基于Kafka的设计使用Java完全重写并推出了MetaQ 1.0版本 。 2012年,阿里对MetaQ的存储进行了改进,推出MetaQ 2.0,同年阿里把Meta2.0从阿里内部开源出来&am…

杂记 | 记录一次使用Docker安装gitlab-ce的过程(含配置交换内存)

文章目录 01 准备工作02 (可选)配置交换内存03 编辑docker-compose.yml04 启动并修改配置05 nginx反向代理06 (可选)修改配置文件07 访问并登录 01 准备工作 最近想自建一个gitlab服务来保存自己的项目,于是找到gitla…

使用XMLHttpRequest实现文件异步下载

1、问题描述 我想通过异步的方式实现下载文化&#xff0c;请求为post请求。一开始我打算用ajax。 $.ajax({type:post,contentType:application/json,url:http://xxx/downloadExcel,data:{data:JSON.stringify(<%oJsonResponse.JSONoutput()%>)},}).success(function(dat…

Linux远程连接mysql 出错plugin caching_sha2_password could not be loaded:

问题描述&#xff1a; 今天使用SQLyog远程连接mysql时出错plugin caching_sha2_password could not be loaded问题。 但在本地cmd 进入命令行窗口&#xff1a;输入命令连接远程连接mysql&#xff0c;发现可以顺利连接。 主要问题是 MySQL可视化工具&#xff08;如&#xff1a…

FL Studio Producer Edition 21 v21.0.3 Build 3517 Windows/mac官方中文版

FL Studio Producer Edition 21 v21.0.3 Build 3517 Windows FL Studio Producer Edition 21 v21.0.3 Build 3517 Windows/mac官方中文版是一个完整的软件音乐制作环境或数字音频工作站&#xff08;DAW&#xff09;。它代表了 25 多年的创新发展&#xff0c;将您创作、编曲、录…

python 合并多个excel文件

使用 openpyxl 思路&#xff1a; 读取n个excel的文件&#xff0c;存储在一个二维数组中&#xff0c;注意需要转置。将二维数组的数据写入excel。 安装软件&#xff1a; pip install openpyxl源代码&#xff1a; import os import openpyxl # 将n个excel文件数据合并到一个…

Android SystemServer中Service的创建和启动方式(基于Android13)

Android SystemServer创建和启动方式(基于Android13) SystemServer 简介 Android System Server是Android框架的核心组件&#xff0c;运行在system_server进程中&#xff0c;拥有system权限。它在Android系统中扮演重要角色&#xff0c;提供服务管理和通信。 system …

一个.NET开发的Web版Redis管理工具

今天给大家推荐一款web 版的Redis可视化工具WebRedisManager&#xff0c;即可以作为单机的web 版的Redis可视化工具来使用&#xff0c;也可以挂在服务器上多人管理使用的web 版的Redis可视化工具。 WebRedisManager基于SAEA.Socket通信框架中的SAEA.RedisSocket、SAEA.WebApi两…

【100天精通python】Day23:正则表达式,基本语法与re模块详解示例

目录 专栏导读 1 正则表达式概述 2 正则表达式语法 2.1 正则表达式语法元素 2.2 正则表达式的分组操作 3 re 模块详解与示例 4 正则表达式修饰符 专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/qq_35831906/category_12375510.html 1 正则表达式概述 python 的…

Prometheus + Grafana安装

Prometheus是一款基于时序数据库的开源监控告警系统&#xff0c;非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做…

并查集维护额外信息,算法思路类似前缀和,结构类似扑克接龙

一、链接 240. 食物链 二、题目 动物王国中有三类动物 A,B,CA,B,C&#xff0c;这三类动物的食物链构成了有趣的环形。 AA 吃 BB&#xff0c;BB 吃 CC&#xff0c;CC 吃 AA。 现有 NN 个动物&#xff0c;以 1∼N1∼N 编号。 每个动物都是 A,B,CA,B,C 中的一种&#xff0c;…