2026-06-17 Redis缓存高频三题二刷 拷问复盘
本轮概览
- 知识点:Redis 为什么快;缓存穿透/击穿/雪崩;逻辑过期
- 模块:3. Redis 与缓存
- 分数:82
- 是否过关:是
- 来源卡片:黑马点评
第 1 题
题目: Redis 为什么快,单线程为什么还能快?
你的回答: 这次能稳定给出三条主因:内存读写、IO 多路复用、单线程减少线程切换和锁竞争;追问到机制时,也能答出 IO 多路复用解决的是网络连接等待问题,底层可落到 epoll,而命令执行仍是单线程。
缺失点: 还可以再补一层“Redis 的瓶颈更多在网络 IO 和内存访问,而不是 CPU 执行命令”这句主线,让回答更完整;另外“命令执行路径短、数据结构高效”还没主动提到。
推荐答案: Redis 快主要因为基于内存,减少了磁盘随机 IO;网络层通过 IO 多路复用高效监听大量连接;命令执行层保持单线程,避免了锁竞争和频繁上下文切换。要注意,多路复用解决的是“一个线程如何同时监听多个 socket 的就绪事件”,不等于 Redis 变成多线程并发执行命令。
项目口径: 可以把这题接到 黑马点评:Redis 先靠高性能扛住热点读流量,再通过 Lua 脚本和 Stream 把秒杀资格校验、异步下单这类高并发链路做原子化和削峰。
第 2 题
题目: 缓存穿透、击穿、雪崩分别是什么,你项目里怎么解决?
你的回答: 三个概念已经能分清,穿透能讲空值缓存和布隆过滤器的优缺点;击穿能讲热点 key、逻辑过期、互斥锁、double check 和“短暂一致性换并发”;雪崩能讲随机 TTL、限流降级熔断以及 Redis 主从哨兵集群。
缺失点: “逻辑过期返回旧值”这点一开始口误成了“返回空值”,虽然你后面已纠正,但面试里这里不能打滑;另外雪崩这题还可以再补一句“多级缓存和热点预热”。
推荐答案: 穿透是缓存和数据库都没有的数据被反复查询,常用空值缓存或布隆过滤器拦截;击穿是热点 key 失效后高并发回源,热点场景更适合逻辑过期加异步重建,一致性要求更高时才更倾向互斥锁;雪崩是大量 key 同时失效或 Redis 整体不可用,需要随机 TTL、主从哨兵/集群、限流降级和多级缓存一起兜底。
项目口径: 结合 黑马点评,可以直接答:热点商铺查询用 Caffeine + Redis 二级缓存,空值缓存防穿透,逻辑过期防热点击穿,系统层再用 Redis 高可用和限流降级防雪崩。
第 3 题
题目: 逻辑过期方案为什么适合热点数据,为什么不直接让线程阻塞等重建?
你的回答: 你已经能说出热点数据并发高、逻辑过期适合牺牲短暂一致性换并发,并且能讲“过期后异步拉线程更新、返回旧值、抢锁后做 double check”。
缺失点: 这题还差最后半步,没有把“为什么线程阻塞会拖垮线程池和数据库”“逻辑过期保证的是最终一致性而不是强一致性”完整收住;现在能答主干,但再追一层仍有断的风险。
推荐答案: 逻辑过期适合热点数据,因为热点流量下最怕的不是几秒旧值,而是大批请求一起阻塞等待重建,把应用线程池和数据库拖垮。它的做法是读取缓存后判断逻辑过期时间,过期时只让一个线程抢锁并异步回源重建,其余线程直接返回旧值,从而保住吞吐;本质上是用可接受的短暂不一致换系统可用性,等重建完成后再与数据库最终对齐。
项目口径: 在 黑马点评 里,这可以答成“热点商铺详情允许极短时间旧值,所以我不让大量 Tomcat 线程排队等数据库,而是只让一个线程重建,其余请求先用旧值,系统先活下来,再靠重建保证最终一致性”。
下次复习动作
- 第 1 题补上“数据结构高效、命令路径短”这条性能来源,形成更完整的 30 秒版。
- 第 2 题把“返回旧值”这句说成条件反射,避免再口误成“返回空值”。
- 第 3 题单独再刷一遍 2 分钟版,必须稳定说出“线程池保护、旧值容忍、最终一致性、double check”。