Skip to content

2026-06-17 Redis缓存高频三题 拷问复盘

本轮概览

  • 知识点:Redis 为什么快;缓存穿透/击穿/雪崩;逻辑过期
  • 模块:3. Redis 与缓存
  • 分数:76
  • 是否过关:否
  • 来源卡片:黑马点评

第 1 题

题目: Redis 为什么快,单线程为什么还能快?

你的回答: 能先说出内存读写、IO 多路复用、单线程减少线程切换和锁竞争这三条主因;追问到 IO 多路复用机制时先断档,补缺后能补上“解决大量连接等待,不等于多线程并发执行命令”。

缺失点: 一开始对 IO 多路复用的职责边界不稳,容易把“并发监听大量连接”和“并发执行命令”混在一起;对 epoll 这层只停在名词级别。

推荐答案: Redis 快主要因为基于内存、命令执行路径短、网络层用 IO 多路复用高效监听大量连接,再加上单线程执行命令避免了锁竞争和频繁线程切换。要注意 IO 多路复用解决的是“一个线程怎么同时盯住很多 socket 的就绪事件”,不是让多条命令并行执行;真正的命令执行仍是单线程串行处理。

项目口径: 在面试里可以先用这题起手,把主线落到“Redis 用单线程把命令执行路径做得很短,网络层再靠 IO 多路复用扛住高连接数”,再顺势过渡到 黑马点评 的热点缓存、Lua 脚本和 Stream 异步链路。

第 2 题

题目: 缓存穿透、击穿、雪崩分别是什么,你项目里怎么解决?

你的回答: 三个概念区分清楚了;项目方案也能对上,穿透用空值短 TTL,击穿提到了互斥锁和逻辑过期,雪崩提到了随机 TTL 和 Redis 主从哨兵。

缺失点: 还缺少更面试化的结构化表达,尤其是“为什么热点数据最终选逻辑过期而不是互斥锁”这一层;对雪崩的降级和兜底只点到了高可用,没有展开流量削峰或服务保护。

推荐答案: 穿透是缓存和数据库都查不到,请求直接穿过去,所以要用空值缓存、布隆过滤器等手段截断恶意或脏请求。击穿是热点 key 失效后大量流量同时打到数据库,热点场景更适合逻辑过期加异步重建,避免线程堆积;一致性要求更高时可用互斥锁串行重建。雪崩是大批 key 同时失效或 Redis 整体不可用,需要通过随机 TTL、主从哨兵、限流降级和多级缓存一起兜底。

项目口径: 结合 黑马点评,可以直接说热点商铺查询用了 Caffeine + Redis 二级缓存,数据库不存在的值写入 "NULL" 并设置短 TTL;热点 key 采用逻辑过期异步重建,避免 Tomcat 线程被阻塞打满。

第 3 题

题目: 逻辑过期方案为什么适合热点数据,为什么不直接让线程阻塞等重建?

你的回答: 能说出适用前提是高并发场景,核心流程是过期后先返回旧值,再异步拉线程更新;也能说出本质是用一致性换可用性。

缺失点: 这题还是偏短句记忆,没有把“为什么热点场景更怕线程阻塞堆积”“为什么旧值可接受”“双检和互斥锁在这里分别扮演什么角色”完整串起来;如果面试官继续问吞吐、线程池耗尽、旧值窗口边界,当前大概率会断。

推荐答案: 逻辑过期适合热点数据,是因为热点流量下最怕的不是短时间旧值,而是大量请求一起阻塞等待重建,把应用线程池和数据库同时拖垮。它的流程是先读缓存,发现逻辑过期后只让一个线程抢锁异步重建,其余线程直接返回旧值,从而保住吞吐;本质上是在可接受的短暂不一致前提下,用最终一致性换系统可用性和高并发能力。

项目口径:黑马点评 里,这个设计点可以直接答成“热点商铺详情允许极短时间旧值,所以我优先保吞吐;抢锁失败立即返回旧值,不让 Tomcat 工作线程排队等数据库查询,否则高峰时会把应用线程池拖死”。

下次复习动作

  • 把第 1 题压成一版 30 秒口述:内存、IO 多路复用、单线程串行执行三点一次说完。
  • 把第 2 题练成固定结构:定义 -> 风险 -> 项目方案 -> 为什么这么选。
  • 把第 3 题补成 2 分钟版,必须能自然说出“旧值容忍、线程池保护、异步重建、最终一致性”。