场景面试题
-
线上redis机器爆了如何优化
利用MEMORY USAGE查看各个键值对的内存使用情况,找出占用大量内存的键,并根据业务需求决定是否需要删除或者优化其存储方式
设置数据过期策略,为那些不需要长期保存的数据设置合理的过期时间,让redis自动删除过期的数据,释放内存
增加机器内存,可以增加redis的物理内存
数据分片,将数据分散到多个节点上面,减少单个节点的压力
限制最大内存空间,通过设置maxmemory参数来限制redis的内存,当达到 上线时,根据配置的淘汰策略来删除数据 -
项目上有个导出 excel 场景发现很慢,怎么优化?
分治的思想,将数据拆分成多个sheet页,然后采用多线程的方式分批导出,而不是一次导出。还是可以只导出必要的列行和行,删除必须要的数据。如何设置计算等操作,可能采用缓存的方式,避免数据重复计算。 -
在2G的文件中如何top 100的单词
首先将数据拆分为多个文件,采用多线程找出一文件中top100的单词,然后采用hash表+小顶堆等算法进行数据统计,然后通过小顶对的方式来统计100的单词。 -
如果一笔订单,用户在微信与支付宝同时支付,会怎么样
支付混乱:系统难以准确判断订单的支付是否是真正完成的,可能出现重复确认支付状态的情况
退款和对账困难:如果需要退款,难以确定从哪个支付平台进行退款,给财务带来极大的复杂度。
数据不一致:会导致订单相关的数据不一致,影响后续的业务处理和数据分析。 -
从网关再到各个后端服务,如何设置 RPC 的超时时间,要考虑哪些问题?
服务的平均响应时间:了解各个后端服务在正常情况下的平均响应时间,以此作为设置超时时间的基础
服务的重要性与关键性:对关键的核心服务,可能需要设置相对较短的超时时间,以确保系统的快速响应和稳定性
网络延迟:考虑网络环境的不确定性,包括不i同的网络拓扑结构,网络拥塞等可能导致的延迟
错误处理策略:超时后的错误处理方式,例如是进行重试,返回错误信息还是其他补偿措施
系统整体的性能与可用性:要确保服务的可用性的前提下,尽量减少因超时导致的服务中断或者错误。
数据一致性问题:超时可能导致部分数据处理不完成,需要考虑如何保证数据一致性 -
如果没有内存限制,如何快速、安全地将 1000 亿条数据插入到 HashMap 中?
首先,确保使用合适的数据类型和键值对的设计,键的选择应具有良好的哈希分布特征,减少hash冲突、其次,对于如何大规模的数据插入,可以采用分批次处理的方式,将数据分为若干个较小的批次,逐个批次进程插入操作,这样可以降低单次操作的复杂性和潜在错误风险。在这可以通过多线程与多进程的方式处理数据插入,通过合理的分配给不同的线程或者线程,充分利用多核CPU的计算能力,提高插入效率。同时需要预先分配map的内存空间,避免频繁的扩容操作,因为扩容会带来额外的性能开销,另外,还需要设置监控和错误处理确保我们数据插入的完成性。 -
线上CPU飙高问题如何排查
首先查看当前系统进程的状态,可以通过top,ps等工具,确定占用cpu的资源较高的进程,其次可以通过一些性能分析工具,例如java的jstack,go的pprof等工具进行分析。java进程可以通过top -H -p 进程号来定位具体的线程id,将线程id转为十六进制,然后通过jstack 进程栈堆的分析。go程序可以通过采用prrof进行分析,通过go tool pprof 分析具体的profile文件,通过top名命令查看使用cpu最高的函数,在通过list查看具体函数的信息。 -
电商平台中订单未支付过期如何实现自动关单?
可以采用redis的过期策略,通过监控redis的过期key进行一个消息监听,来处理我们未关闭的过期消息。配置 notify-keyspace-events Ex 即可开启此功能。
还可以通过MQ的死信队列,给消息设置一个过期时间,到消息过期时就会变成死信就会同步到死信队列中,通过监控死信队列的消息来完成过期消息的处理。 -
如果你的系统的 QPS 突然提升 10 倍你会怎么设计?
可以采用微服务的架构,对服务进行拆分。把服务按照业务拆分为多个模块,每一个服务进行单独部署,降低了开发和维护的成本,集群能够承受的压力也提高了。同时应用解耦,不需要因为单个服务的改动而修改整个服务。