在 Redis 集群中,如何根据键定位到对应的节点?回答重点Redis 集群将数据分布到 16384 个哈希槽(slots) 中,每个键通过哈希函数计算出一个槽位编号,然后根据槽位编号定位到具体的节点,具体是使用 CRC16 哈希函数计算键的哈希值,然后对 16384 取模,得到哈希槽编号(范围是 0 到 16383)。
扩展知识Redis 集群节点的通信Redis 集群节点在一开始的时候,...
Redis 中的内存碎片化是什么?如何进行优化?回答重点Redis 的内存碎片化是指内存使用中出现小块空间被闲置,无法被有效利用的现象。
Redis 默认使用 jemalloc 作为内存分配器,它是按照固定大小来分配内存的,比如实际需要 8kb 的内存,分配器给了 12kb。
那么多余的 4kb 其实就无法被利用上了,它就叫内存碎片。
且频繁创建和删除大量数据的时候,会导致内存块大小和位置...
Redis 的虚拟内存(VM)机制是什么?回答重点Redis 的 VM 机制(Virtual Memory)曾经是 Redis 早期版本(2.0 之前)的一部分,用于将部分数据存储在磁盘上,以扩展内存数据库的容量。当内存不足时,Redis 会将冷数据(不经常访问的数据)移到磁盘,并将热数据(经常访问的数据)保留在内存中。
通过这种方式,Redis 可以处理比实际物理内存更多的数据。
虽然能使...
Java 写入文件到磁盘会经历哪些过程?重点回答这个问题虽然主要考察对操作系统缓存、文件系统和磁盘的理解,不过最好在开头再提一下 Java 中的操作,表现出从应用层到底层 DMA 的全方位理解。
第一步:写入文件缓冲区为了提高效率,写入文件都会利用缓冲区,即当写入数据时,数据先被存储到缓冲区,而不是直接写入磁盘。缓冲区的目的是减少磁盘 IO 操作的次数,提高性能。
一般用的是 Buffer...
两百万个生产者发送消息,仅一个消费者,如何高效设计锁?重点回答1)使用无锁数据结构:可以使用无锁的并发队列,如Java的ConcurrentLinkedQueue,它采用了非阻塞算法,避免了加锁的开销。这样,多个生产者可以并发地将消息添加到队列中,而消费者可以从队列中安全地读取消息。
2)批量操作:生产者可以批量发送消息,减少锁竞争的频率。例如,一个生产者可以先在本地缓存一批消息,然后一次性...
如何在附近 100w 的商户中,快速找到离你最近的 5 家商户?回答重点可以使用 MySQL 或 MongoDB 的空间索引,或者使用 Redis 提供的 Geo 数据结构来存储商户位置的位置信息来实现根据距离的快速查找。
使用空间索引例如 R-tree,它适用于二维空间的树形数据结构,能够高效地进行范围查询和最近邻查询。将商户位置(经纬度)数据按照地理区域组织成树结构,可以快速找到位于用户...
线上发现 Redis 机器爆了,如何优化?回答重点1)首先需要排查并确定根因通过监控工具(如Prometheus、Grafana等或云上自带的一些监控)查看 Redis 的 CPU、内存、命令执行时间或带宽等指标,确定瓶颈所在。
2)依据根因针对性解决问题如果是内存耗尽,可能需要增加机器的内存量(升配),即临时升配解决线上问题后。
后续再走查代码和了解相关业务,判断有些数据是否有必要都存...
项目上需要导入一个几百万数据 excel 文件到数据库中,有哪些注意点?回答重点对于百万数据的导入,一般需要关注三类问题:
1)内存,如果一次性在堆内加载过多的数据,可能会导致内存溢出。2)时间,百万数据插入数据库需要一定的时间,同步调用可能会使得方法超时。3)异常,百万数据中可能会有很多异常的情况,比如格式错误、重复数据等等。
内存是有限的,不能一次性将 excel 内的所有数据都加载到内...
项目上有个导出 excel 场景发现很慢,怎么优化?回答重点1)先定位慢在哪儿?需要定位导出 excel 慢在哪里:
业务逻辑慢?
数据库查询慢?
excel 生成慢?
2)针对性解决慢的问题如果是业务逻辑处理很慢,则需要优化调整逻辑,比如将一些在循环内的多次 RPC 调用,变成一次(或更少)的批量 RPC 调用。
如果是数据库查询慢,则查看 SQL 是都命中索引,是否有额外的排序逻辑等...
如果一笔订单,用户在微信和支付宝同时支付,会怎么样?回答重点微信和支付宝都会支付成功,因为支付渠道是第三方系统,它们之间的数据是不相通的,因此无法阻止用户付款。
这样一来同一笔订单,用户就会多付了一笔钱,如何避免这个情况?
思路其实很清晰,不管是支付宝支付还是微信支付,用户支付后三方都会进行回调,这个回调处理逻辑在我们的系统中,因此我们可以在这里控制。
支付单都会有状态机,例如从支付中...
一笔订单,在取消的那一刻用户刚好付款了,怎么办?回答重点这种情况在正常的业务场景中是有可能出现的,因为订单都会有定时取消的逻辑,比如 10 分钟或者 15分钟,而用户刚好卡在这个时间点进行付款,此时就会出现两种情况:
1)用户支付成功,支付回调的那一刻支付单刚好还没取消,而等回调结束,取消支付单的事务提交,支付单取消。此时用户扣款了,但是对应的权益或资产没了。
2)用户支付成功,支付回调...
假设有一个 1G 大的 HashMap,此时用户请求过来刚好触发它的扩容,会怎样?让你改造下 HashMap 的实现该怎样优化?回答重点如果刚好触发扩容,那么当前用户请求会被阻塞,因为 HashMap 的底层是基于数组+链表(红黑树)来实现的,一旦它发生扩容,就需要新增一个比之前大 2 倍的数组,然后将元素搬运到新的数组上。
而 1G 的 HashMap 够大,所以扩容需要一定的时间,而扩容...
每次进入订单列表页面都会触发全量同步?
本题并不是一个常规的面试题,更多的是给一个排查案例,供大家参考一下排查问题的思路,不涉及什么高深技术(在真实企业级开发环境中,大部分的排查案例都不涉及什么技术,都是一些很意外的小bug)没兴趣的小伙伴可以直接跳过此题,面试题看累的小伙伴可以简单看看,放松下神经!
事情是这样的,今天同事给我反馈了一个问题。
因为我们的应用需要从第三方那边同步订单的...
从网关再到各个后端服务,如何设置 RPC 的超时时间,要考虑哪些问题?回答重点首先用户(客户端)的请求是先打到网关,再由网关请求各后端服务,因此需要确保客户端到网络连接的超时时间(通常是 HTTP 请求),需要大于网关调用后端服务(通常是 RPC 请求)的综合时间。
其中又有一些细节需要考虑:
1)网关调用几个服务的方式
网关调用后端需求可以是串行,也可以是并行,例如上面的图中的三个服...
Spring Cloud Gateway 500 问题排查
提供一个线上 Spring Cloud Gateway 问题排查案例,涉及网关的 500 错误、源码还涉及到 linux node 知识点
线上就开始报警了,一看情况网关报 500 了。。
网关(用的是Spring Cloud Gateway)挂了,岂不是所有请求都进不来了?
到底怎么回事?
及时处理话不多说,直接重启(及时回复)...
JDK 序列化问题排查
提供一个线上 JDK 序列化问题排查案例,虽然比较基础,但在我任职的公司中出现过两次,而且是 5 年及以上工作经验的同事写的 bug。供大家参考
新加了个字段,然后发版,上线就发现了报错。
就加了一个字段,怎么就序列化出错了呢?
复现错误简单定义一个 Yes 类,可以看到就三个字段。
简单 new 了一个对象,直接塞入到 redis 中。
可以看到 ...
线上数据库连接池爆满问题排查回答重点如果出现了线上连接池爆满的情况,一般情况需要先“止损”,也就是重启服务。
现在一般都会用云上的服务,会有监控,对应监控能查到历史数据库的情况,包括连接池的占用情况。重启后我们快速分析定位事故反生之前一段时间 SQL 的执行情况,连接池的占用情况。
查看当时是否有大量的突发请求,例如做了运营活动,那么很可能请求数上来会导致数据库压力过大,处理缓慢使得连接池占...
如果没有内存限制,如何快速、安全地将 1000 亿条数据插入到 HashMap 中?回答重点
前置知识,需要先了解 HashMap 的原理
我们分析一下题目的关键点,HashMap、1000 亿条数据、无限制内存、快速、安全地插入。
首先无限制内存就不需要考虑机器或者 JVM 的内存溢出问题,在这个条件下 1000 亿还是 10000 亿都不影响,反正知道数据量很大就对了。
其次 Has...
MySQL 中 如果我 select * from 一个有 1000 万行的表,内存会飙升么?回答重点内存不会飙升。
因为 MySQL 在执行简单 SELECT * FROM 查询时,不会一次性将所有 1000 万行数据加载到内存中,而是通过逐批次处理的方式来控制内存使用。也就是说 MySQL 是边查边发送数据给客户端。
分批的大小与 net_buffer_length 有关,默认 1638...
微服务中远程调用的超时时间应该设置为多少合适?回答重点一般远程调用的默认超时时间为 2-5s。但在实际工作中,还是要看具体的业务场景,因为不同的业务场景对超时时间的要求不同。
一些查询、验证等较为简单的操作,超时时间可以适当缩短。
一些需要长时间处理的业务,比如大数据处理、复杂的查询,可能需要配置较长的超时时间,避免超时过早导致的失败。
除此之外,超时时间应该基于服务的响应能力进行设置,...
如何避免用户重复下单(多次下单未支付,占用库存)回答重点
在稀有商品抢购或秒杀场景中,一个用户多次下单未支付可能是恶意锁库存或损坏其他用户的权益,因此需要避免用户重复下单。
1)首先前端需要进行按钮控制
在用户点击“下单”按钮后,可以通过前端控制按钮状态,比如变为“处理中”或“请稍等”,避免用户在等待过程中多次点击按钮,导致重复下单请求发送到后端。但是前端的操作无法完全避免重复请求,因此需...
线上消息队列故障,兜底改造方案线上部分接口频繁报错,经排查是因为消息发送超时导致的。我们用的是阿里云的 RocketMQ,去询问客服发现是因为云厂商升级故障使得消息发送频繁超时。
当时没有办法兜底方案处理消息队列故障的场景,后面复盘这部分功能,让我做一定的重构改造。
涉及的业务简单概括:需要在一个 service 方法里执行一些业务,修改了一些数据落库,然后再发送一条 MQ 消息,触发下一个...
让你设计一个消息队列,怎么设计?设计类题目要先从大局上讲出需要设计的东西的重点,然后再等待面试官的继续提问,深挖。
回答:
首先我们需要明确地提出消息中间件的几个重要角色,分别是生产者、消费者、Broker、注册中心。
简述下消息中间件数据流转过程,无非就是生产者生成消息,发送至 Broker,Broker 可以暂缓消息,然后消费者再从 Broker 获取消息,用于消费。
而注册中心用于服务...
让你设计一个 RPC 框架,怎么设计?先直接跟面试官说下 RPC 框架基础的核心点:
其实就这么几点:
1)动态代理(屏蔽底层调用细节)2)序列化(网络数据传输需要扁平的数据)3)协议(规定协议,才能识别数据)4)网络传输(I/O模型相关内容,一般用 Netty 作为底层通信框架即可)
注意,上面加粗的其实二字,一定要说,要注意语气,要显得你游刃有余,低调奢华。
这属于 RPC...
让你设计一个短链系统,怎么设计?先说一下回答思路:
1)简单描述下短链原理
2)后端设计
3)补充跳转设计
一个小小短链其实融合了很多知识点,能较为全面的考察一个候选人的综合实力。
原理在浏览器输入短链后,请求打到短链服务,短链服务会根据 url 找到对应的长链重定向到长链地址,此时浏览器就会跳转网页定位到真正的地址。
所以本质原理就是短链服务器根据 url 定位到真正地址,然后通过重定向实...
让你实现一个分布式单例对象,如何实现?所谓的单例一般指的是一个进程中一个类对应只有一个实例对象,也就是进程唯一。
而分布式,不过是一个机器部署多个服务,还是多个机器部署,本质上就是多进程,所以所谓的分布式单例指的是这个实例对应需要在多进程中保持唯一。
按照这个思路,我们仅需控制同一时刻,只会有一个进程使用这个单例对象即可,而分布式场景下的分布式锁就很容易实现这个功能。
多个进程竞争分布式锁,...
让你实现一个订单超时取消功能,怎么设计?一般会通过定时任务或者消息队列的延迟消息来实现订单超时取消功能。
定时任务定时任务的逻辑就是扫描已创建未支付的订单,判断订单的创建时间与当前时间的差值,如果已经超过了预设的超时时间,比如 10 分钟,那么就将订单状态更新为已取消。
比如可以每 1 分钟扫描一次表,直接根据当前时间和超时时间得到筛选的时间,比如当前是 14:00,那么 13:50 分之前...
朋友圈点赞功能如何实现,简单说说?首先我们要理清朋友圈点赞具体需要涉及哪几个功能点:
1)存储点赞信息
需要存储哪些用户点赞了这条朋友圈,具体需要存储用户ID、点赞时间即可。
2)取消点赞
需要快速找到这名用户,将其移除点赞列表。
3)获取点赞列表
朋友圈需要展示点赞的用户头像列表信息.
核心就是这么三点,其实就是增删查,那用什么来实现比较合适呢?
实现快速存储和删除,Set 就挺合适,而且...
商家想要知道自己店铺卖的最好的 top 50 商品,如何实现这个功能?根据问题推断这个排行榜是一个动态的排行榜,店铺内商品一直在售卖,因此排行榜也会一直在变,所以如果利用数据库来排行计算效率会非常低,总不能每卖一单就利用数据库排序计算得到排行榜吧?
所以排除数据库这个方案。
应对数据库效率差的情况,我们常用的替代方案就是缓存,而 Redis 内有个 zset 可以实现排行榜的功能。
每个商家...
HashMap 是不是线程安全的?如果让你来实现一个线程安全的 HashMap 你要怎么设计?如果不用加锁你要怎么设计?回答重点HashMap 是 非线程安全 的。因为 HashMap 的内部实现并没有加锁,多个线程同时访问和修改时可能会引发数据竞争,导致数据不一致或陷入死循环等问题。
如何实现一个线程安全的 HashMap要实现一个线程安全的 HashMap,有多种设计方案,下面是几种常见...