← 每日面试题 学习看板

业务系统Redis出现超时如何排查和解决?

面试题/01实践场景题/问题排查/业务系统Redis出现超时如何排查和解决?.md

面试记录 2026-10-14

题目:业务系统 Redis 出现超时如何排查和解决?

难度:medium

标签:practice/debug, redis/timeout, network/debug

评分:⭐⭐⭐⭐☆(4/5)

我的回答

Redis 出现超时,这时候要排查的思路就看整个链路中都会涉及什么东西。首先是链接链接链接池请求是否被打满。然后其次是网络通讯,是否在访问 Redis 过程中出现了网络波动。还有就是是否有大 key 慢查询,可以通过 Redis 的监控去查看对应日志是否有相关的内容。再然后去考虑是否出现了大量的过期内内存超时。还有就是是否有大量的lua 脚本或者 redis 事务相关的大命令执行占用 redis 线程,导致无法正常运行其他请求;

针对上述问题处理上有不同方案;

如果连接池满了,考虑是否增加连接池配置,以及转用 redis 集群,提升 redis 承载能力;

如果是网络出现波动,看是否更换实例位置,选择和服务就近机房,减少网络影响;

如果是大 key 热 key,那么考虑 key 拆分,分析大key 是否合理?是否需要调整业务设计;

如果是大量 lua 脚本,那么看是否能进行分解,降低单个 lua 脚本复杂度,提升单个 lua 脚本的执行时间,不要在 lua 脚本中做循环之类的操作;

点评

优点:

不足:

补充:

完整讲解

第一部分:知识重点剖析

核心考点定位:考察 Redis 超时排查的完整方法论——从现象(超时)到根因(命令阻塞/网络/资源)的分层下钻。

知识点拆解:

  1. 超时来源分层:
  1. 第一手证据:SLOWLOG GET 128 + SLOWLOG LEN;INFO stats 看 rejected_connections、blocked_clients、instantaneous_ops_per_sec
  2. 命令阻塞典型:KEYS *、SMEMBERS/HGETALL 大集合、SORT、Lua 循环、BLPOP 阻塞式命令
  3. 持久化阻塞机制:RDB bgsave 用 fork + COW,主进程 fork 瞬间可能卡顿(数百 ms 到数秒);内存越大 fork 越慢
  4. 降级三件套:

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. Redis 是单线程,为什么快?慢在哪?
  1. fork 为什么会阻塞主进程?怎么避免?
  1. 热 key 和热点分片怎么排查和治理?

第三部分:面试者参考回答(三步法口语化,300-400 字)

【一句话结论】

面试官您好,Redis 超时我按"客户端 → 网络 → Redis 内部"三层排查,第一手证据是 SLOWLOG,然后按根因分类处置:阻塞命令治理、连接池扩容、降级兜底。

【三点展开】

第一,先看客户端侧:连接池打满(Lettuce/Jedis 的 maxWaitMillis 超时)、commandTimeout 配置过短。用 INFO stats 看 rejected_connections 和 blocked_clients,用 CLIENT LIST 看空闲连接和异常 client。客户端侧问题改配置即可,秒级生效。

第二,看网络层:跨机房延迟、TCP 丢包。用 ping、mtr、tcpdump 抓包,看 retransmit 比例。网络波动通常持续几秒,改机房路由或就近部署 Redis 实例能解决。

第三,看 Redis 内部:SLOWLOG GET 128 定位耗时命令,典型是大集合 SMEMBERS/HGETALL、KEYS *、Lua 循环。持久化方面看 INFO persistence 的 rdb_last_bgsave_status 和 fork 时间;主从同步看 INFO replication 的 master_sync_in_progress。治理手段:大 key 拆分、Lua 分解、读写分离、Resilience4j 熔断 + Caffeine 本地缓存兜底。

【一句边界】

当然,如果是集群模式下的 hash slot 迁移导致的短暂超时,那是 Redis Cluster 的正常行为,用 redis-cli cluster slots 看拓扑,客户端会自动重定向,一般不用介入。