{ "topic": "cache-three-problems", "type": "single_choice", "schema_version": "1.0.0", "generated": "2026-09-05T00:00:00+08:00", "questions": [ { "id": "sc-001", "type": "single_choice", "difficulty": 1, "tags": [ "缓存穿透" ], "question": "「缓存穿透」的本质与下列哪种情况最匹配?", "options": { "A": "查询数据库中存在但缓存中不存在的数据", "B": "查询数据库中也根本不存在的数据,每次请求都直达数据库", "C": "单个热点 key 刚好过期导致大量请求同时打数据库", "D": "大批量 key 在同一时刻集体失效" }, "answer": "B", "explanation": "缓存穿透指查询一个数据库中也【不存在】的数据。缓存查不到、DB 也查不到,无法写回缓存,导致每一次请求都直达 DB。选项 A 属于正常缓存未命中可回源;C 是缓存击穿;D 是缓存雪崩。", "source": null, "related": [] }, { "id": "sc-002", "type": "single_choice", "difficulty": 1, "tags": [ "缓存雪崩" ], "question": "「缓存雪崩」的典型特征是?", "options": { "A": "单个热点 key 过期导致的高并发尖峰", "B": "查询不存在的数据导致持续打到数据库", "C": "大批 key 同时过期或整台缓存服务宕机,瞬间请求全部穿透到数据库", "D": "布隆过滤器误判导致正常请求被拦截" }, "answer": "C", "explanation": "缓存雪崩的特征是【多 key、集中失效、集体崩溃】:一大批 key 在同一时刻集体失效(如同期设置了相同过期时间),或整台缓存服务宕机,导致瞬间所有请求穿透到 DB。选项 A 是击穿,B 是穿透,D 是布隆过滤器的副作用。", "source": null, "related": [] }, { "id": "sc-003", "type": "single_choice", "difficulty": 2, "tags": [ "缓存击穿", "热点key" ], "question": "某个微博热搜 key 缓存恰好过期,瞬时大量请求同时回源打数据库,这属于哪种问题?", "options": { "A": "缓存穿透", "B": "缓存击穿", "C": "缓存雪崩", "D": "缓存一致性问题" }, "answer": "B", "explanation": "该场景是【单个特别热门的 key】缓存过期,此刻大量请求同时来全部 miss、同时打 DB。特点是单 key、高并发、瞬时尖峰,正符合缓存击穿的定义。穿透针对不存在的 key,雪崩针对多 key 集体失效,一致性问题与本题无关。", "source": null, "related": [] }, { "id": "sc-004", "type": "single_choice", "difficulty": 2, "tags": [ "缓存穿透", "布隆过滤器" ], "question": "关于布隆过滤器判断数据「是否存在」,下列说法正确的是?", "options": { "A": "判断不存在时,数据可能实际存在", "B": "判断不存在时,数据一定不存在", "C": "判断存在时,数据一定存在", "D": "不支持删除,因此只能用于处理缓存击穿" }, "answer": "B", "explanation": "布隆过滤器不存在假阴性:判断为「不存在」则一定不存在。存在假阳性:判断为「存在」时可能实际不存在。选项 C 错误(存在→可能存在),选项 A 描述的是假阳性而非不存在,选项 D 布隆过滤器是解决穿透的方案而非击穿。", "source": null, "related": [] }, { "id": "sc-005", "type": "single_choice", "difficulty": 3, "tags": [ "缓存穿透", "缓存空对象" ], "question": "使用「缓存空对象」方案解决缓存穿透时,下列说法错误的是?", "options": { "A": "数据库查不到时,也缓存一个 null 值并设置较短的 TTL", "B": "可以有效防止对同一个不存在 key 的反复穿透", "C": "大量不同的空 key 都会占满内存,存在内存被写满的风险", "D": "空值对象应该设置与正常数据相同甚至更长的 TTL" }, "answer": "D", "explanation": "缓存空对象应设置【极短 TTL】(如 5 分钟),防止大量空 key 长期占用内存,而不是设置相同或更长的 TTL。A、B 正确描述了原理,C 正确指出了空值缓存的主要内存风险,故错误的选项是 D。", "source": null, "related": [] }, { "id": "sc-006", "type": "single_choice", "difficulty": 3, "tags": [ "缓存击穿", "互斥锁", "SETNX" ], "question": "使用 Redis SETNX 实现互斥锁解决缓存击穿时,只有抢到锁的请求才能回源数据库,它的核心作用是?", "options": { "A": "让所有请求都穿透到数据库以加快数据同步", "B": "保证只有一个线程去查库回填缓存,其余请求等待或降级", "C": "把锁上的请求直接丢弃以减少数据库压力", "D": "用于给缓存 key 设置统一的过期时间" }, "answer": "B", "explanation": "互斥锁保证同一时刻只有一个请求能去查 DB 并回填缓存,其他请求阻塞等待或返回旧值,从而避免雪崩式地打 DB。A、C 与思路相悖,D 与过期时间无关。", "source": null, "related": [] }, { "id": "sc-007", "type": "single_choice", "difficulty": 4, "tags": [ "缓存雪崩", "TTL加随机" ], "question": "为防止缓存雪崩,给大量缓存 key 的 TTL 增加随机偏差(如 60+random(0~300) 秒)能达到什么效果?", "options": { "A": "让所有 key 在同时到期,保证数据最新", "B": "把到期时间打散,避免一批 key 在同一时刻集体失效", "C": "彻底消除缓存过期,让数据永不失效", "D": "减少缓存换取流量,降低服务器带宽消耗" }, "answer": "B", "explanation": "给每个 key 的 TTL 加随机偏差可以把到期时刻分散开,避免一大批复集中在同一时刻失效触发雪崩。A、C 与目标相反,D 与带宽无关。加随机是雪崩最直接有效的兜底手段之一。", "source": null, "related": [] }, { "id": "sc-008", "type": "single_choice", "difficulty": 4, "tags": [ "缓存击穿", "逻辑过期" ], "question": "关于「逻辑过期」解决缓存击穿的方案,下列说法正确的是?", "options": { "A": "到逻辑过期时间就立即物理删除缓存里的 key", "B": "不真正删除缓存,缓存到期后由异步线程后台更新,数据保持持续可用", "C": "逻辑过期会增加 DB 的瞬时并发压力", "D": "逻辑过期是专门用来解决缓存穿透的方案" }, "answer": "B", "explanation": "逻辑过期不删除 key,而是在 value 中记录逻辑过期时间,允许返回旧值或标记过期后由后台异步线程刷新,从而挡住并发的瞬时冲击。A 是物理丢弃,C 与 B 的异步刷新理念相悖,D 它是解决击穿的方案。", "source": null, "related": [] }, { "id": "sc-009", "type": "single_choice", "difficulty": 5, "tags": [ "缓存穿透", "参数校验", "布隆过滤器" ], "question": "某系统收到大量针对「不存在 userId」的请求,为在【不合法参数被鉴权】之前、从入口处优先拦截绝大多数非法请求,最直接的做法是?", "options": { "A": "直接返回数据库全表数据给客户端", "B": "对所有请求做参数校验,在入口拦截非法参数与不存在数据", "C": "给数据库添加唯一约束", "D": "把所有请求都用 SETNX 加锁串行化" }, "answer": "B", "explanation": "参数校验是穿透的第一道防线:在入口处拦截非法参数、明显不存在的请求,避免其打到 DB。A 会雪上加霜,C 是数据库层措施但不防穿透,D 的加锁是为击穿而设且无法区分合法不存在的 key。", "source": null, "related": [] }, { "id": "sc-010", "type": "single_choice", "difficulty": 5, "tags": [ "多级缓存", "Redis高可用", "缓存雪崩" ], "question": "以下属于「缓存雪崩」完整治理组合方案的是?", "options": { "A": "仅设置:对所有 key 采用永久不过期", "B": "过期时间加随机值 + 多级缓存(本地/Redis/DB 兜底)+ 限流熔断降级 + Redis 主从/集群高可用", "C": "只使用布隆过滤器拦截不存在的 key", "D": "只采用互斥锁让单 key 回源串行" }, "answer": "B", "explanation": "雪崩是多 key 集体失效 + 服务宕机的双重风险,治理需要组合:TTL 加随机打散失效时间、多级缓存层层兜底、加锁/限流/熔断降级保护 DB、Redis 主从哨兵集群保证高可用。A 永不失效既不现实也不能防宕机,C 针对穿透,D 针对单 key 击穿而非成批雪崩。", "source": null, "related": [] } ] }