首页 > 人工智能 >承德餐饮发票开具流程指南

承德餐饮发票开具流程指南

来源:互联网 2026-07-29 20:01:21

区分缓存穿透、击穿、雪崩:穿透采取参数校验、缓存空值及布隆过滤器;击穿用互斥锁(原子操作)或逻辑过期;雪崩通过随机TTL、预热及系统保护层应对。回答需结合项目实际,避免仅堆砌名词。

秋招面试中Redis缓存三大难题:穿透、击穿、雪崩的应对策略

近期秋招提前批面经显示,Redis相关问题几乎成为必考内容。面试官不会停留在“Redis有哪些数据结构”这类基础问题,而是直接结合项目提问:你简历上写了缓存优化,那么缓存穿透、击穿、雪崩分别如何处理?为什么这样处理?线上是否真正实践过?

这些问题看似是八股文,实际上很容易被追问到难以招架。许多人习惯回答“穿透用布隆过滤器,击穿用互斥锁,雪崩加随机过期时间”,但面试官再追问两句,往往就卡住了。

长期稳定更新的攒劲资源: >>>点此立即查看<<<

更稳妥的答题思路是:按照“一次请求从发起到结束”的路径来拆解,而不是单纯罗列术语。

明确三个概念的区别

缓存穿透,指请求的数据本身不存在。例如有人一直查询id为负数的商品,缓存里没有,数据库里也没有,每次请求都落到数据库,这才是穿透。

缓存击穿,指一个热点key突然过期。比如首页推荐配置、爆款商品库存、秒杀活动信息,平时全靠缓存支撑,某一刻key失效,大量请求瞬间涌向数据库。

缓存雪崩,则是一批key在同一时间集体失效,或者Redis集群本身短时间不可用。这不是单个热点key的问题,而是缓存层大面积失守。

面试时先把这三个概念讲清楚,后续才有讨论基础。若将击穿也说成穿透,面试官通常会默认你只是背过题。

缓存穿透:参数校验与布隆过滤器的组合使用

穿透的第一道防线其实是参数校验。如果业务上商品id必须是正整数,那么负数、超长字符串、明显不合法的枚举值,在入口就应该直接拦截,避免这类请求进入缓存层,更别让它进入数据库。

第二层是缓存空值。数据库查不到时,将空结果也写入缓存,过期时间设短一些,几十秒到几分钟。这样同一个不存在的key不会反复打到数据库。

布隆过滤器更适合更重的场景:数据集合比较稳定、非法key大量出现、数据库压力已经明显上升。它的特点是可能误判“存在”,但不会把真实存在的数据误判为不存在。因此用作前置过滤可以,但不能当作最终答案。

一个比较稳妥的回答可以这样组织:

  • 先做入参校验,挡掉明显的非法请求;
  • 查库为空时缓存空值,避免同一个不存在的key重复击穿数据库;
  • 如果非法key规模很大,再把合法id集合放进布隆过滤器做前置判断。

若面试官追问“缓存空值会不会污染Redis”,可以说明空值TTL要短、value要小,并且只对高频不存在的key缓存,并非所有miss都无脑写入。

缓存击穿:互斥锁与逻辑过期方案的选择

热点key过期时,最怕的是大量线程同时查库、同时回写缓存。常见做法是加互斥锁:只有抢到锁的线程去查数据库并重建缓存,其他线程稍等后重试,或者直接返回旧值。

这里有一个需要注意的细节:避免说“SETNX后再EXPIRE”。这两个命令拆开不是原子操作,中间进程挂了可能留下死锁。Redis中更常见的做法是用一条SET命令带NX和EX参数,将“只在不存在时设置”和“过期时间”放在同一个原子操作中。解锁时还要校验value,通常用Lua脚本保证只删除自己的锁。

如果业务允许短暂旧数据,逻辑过期会更舒服:缓存里不仅放数据,还放一个逻辑过期时间。请求发现逻辑过期时,不是立刻让所有人查库,而是由一个线程异步刷新,其他请求先拿旧数据顶住。这种方案在首页配置、榜单、推荐位上很常见,用户看到几十秒前的数据问题不大,但数据库被打爆就是真事故。

可以这样回答:

  • 强一致要求高的热点key,用互斥锁重建缓存;
  • 读多写少、允许短暂旧值的热点key,用逻辑过期加异步刷新;
  • 锁要有过期时间,value要唯一,删除锁要校验owner。

这几句话比单独背“互斥锁”更有分量。

缓存雪崩:随机TTL只是最低配,需要系统级保护

雪崩的典型原因有两个:一是大量key同时过期,比如批量导入缓存都设成30分钟,半小时后一起失效,这种情况用随机TTL就能缓解——基础过期时间上加一段随机抖动,让key分散失效。

二是缓存服务本身不可用,这就不是随机TTL能解决的了。需要看系统是否有本地缓存、限流、降级、熔断,以及核心数据能否预热。

面试时可以按层次说明:

  • 过期时间层:TTL加随机值,避免同批key同时失效。
  • 热点数据层:上线或活动开始前预热,不等用户请求触发重建。
  • 系统保护层:本地缓存兜底、接口限流、数据库保护、非核心功能降级。

如果项目只是普通后台系统,没有高并发活动,也不必硬编秒杀场景。可以说“我没做过秒杀,但在后台字典、配置缓存里会做随机TTL,避免定时任务批量刷新导致同时过期”——这个回答反而更真实。

面试官真正想听的,不是名词

这道题最后通常会落到项目上。如果简历写了Redis,就提前想清楚以下几个问题:

  • 哪些数据用了缓存?为什么这些数据适合缓存?
  • key怎么设计?有没有前缀、版本号、业务id?
  • TTL设多久?是固定值还是带随机?
  • 数据更新时,是删缓存、更新缓存,还是延迟双删?
  • 如果缓存没命中,数据库能不能扛住?有没有限流?

这比背十页Redis面试题更重要。准备此类问题时,可以将简历中的项目描述放入面试模拟工具,让它按面试官口吻连续追问五轮,第一轮通常还能答,第三轮开始就能看出哪些地方是自己没想明白的。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。