首页 > 人工智能 >邢台餐饮发票开具流程

邢台餐饮发票开具流程

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

缓存穿透因查询不存在数据,需参数校验与缓存空值;击穿因热点key过期,用互斥锁或逻辑过期;雪崩因大量key同时过期,通过随机TTL、本地缓存、限流降级处理。项目中需结合业务场景区分成因,避免生搬硬套。

最近在刷 Java 后端秋招提前批的面经,发现 Redis 被问得相当密集。不是那种「Redis 有哪些数据结构」的泛泛问题,而是直接从项目里切进来:你简历写了缓存优化,那缓存穿透、击穿、雪崩分别怎么处理?为什么这么处理?线上真的这么做过吗?

邢台餐饮发票开具流程

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

这题看着像八股,其实很容易被追问到底。很多人一上来就背「穿透用布隆过滤器,击穿用互斥锁,雪崩加随机过期时间」,面试官再问两句就卡住了。建议按「一次请求怎么走」来答,效果会好很多。

缓存穿透、击穿、雪崩的区别

先把三件事分清楚。缓存穿透,说的是请求的数据本身就不存在。比如有人一直查 id 为负数的商品,缓存里没有,数据库里也没有,每次都打到数据库,这才叫穿透。缓存击穿,说的是一个热点 key 突然过期了。比如首页推荐配置、爆款商品库存、秒杀活动信息,平时都被缓存扛住了,某一刻 key 没了,大量请求一起冲到数据库。缓存雪崩,是一批 key 在同一时间失效,或者 Redis 集群本身短时间不可用。它不是一个热点 key 的问题,而是缓存层大面积失守。面试里先说清这个区别,后面才有得聊。不然你把击穿也说成穿透,面试官基本会默认你只是背过题。

缓存穿透的处理方式

谈到穿透,处理方式不止一个布隆过滤器。第一层是参数校验。如果业务上商品 ID 必须是正整数,那么负数、超长字符串、明显不合法的枚举值,应该在入口就拦掉,不要让这种请求进缓存层,更不要让它进数据库。第二层是缓存空值。数据库查不到,可以把空结果也写进缓存,时间设短一点,比如几十秒到几分钟。这样同一个不存在的 key 不会反复打数据库。布隆过滤器适合更重的场景:数据集合比较稳定、非法 key 很多、数据库压力已经明显上来了。它的特点是可能误判「存在」,但不会把真实存在的数据判断成不存在,所以用它做前置过滤可以,但不能把它当成最终真相。一个比较稳的回答可以这样说:先做入参校验,挡掉明显非法请求;查库为空时缓存空值,避免同一个不存在的 key 重复击穿数据库;如果非法 key 规模很大,再把合法 id 集合放进布隆过滤器做前置判断。面试官如果继续问「缓存空值会不会污染 Redis」,你就说空值 TTL 要短、value 要小,并且可以只对高频不存在 key 缓存,不是所有 miss 都无脑写。

热点 key 击穿的解决方案

热点 key 击穿时,加互斥锁是常见做法,但这里有个坑,别说「SETNX 后再 EXPIRE」。这两个命令拆开不是原子操作,中间进程挂了就可能留下死锁。Redis 里更常见的是用一条 SET 命令带 NX 和 EX 参数,把「只在不存在时设置」和「过期时间」放到同一个原子命令里。解锁时还要校验 value,通常用 Lua 脚本保证只删自己的锁。如果业务允许短暂旧数据,逻辑过期会更舒服:缓存里不只放数据,还放一个逻辑过期时间。请求来了发现逻辑过期,不是立刻让所有人查库,而是让一个线程异步刷新,其他请求先拿旧数据顶着。这在首页配置、榜单、推荐位上很常见,用户看到几十秒前的数据问题不大,但数据库被打爆就是真事故。可以这样答:强一致要求高的热点 key,用互斥锁重建缓存;读多写少、允许短暂旧值的热点 key,用逻辑过期加异步刷新;锁要有过期时间,value 要唯一,删除锁要校验 owner。这几句话比单独背「互斥锁」有分量。

缓存雪崩的典型原因与应对

缓存雪崩的典型原因有两个。一个是大量 key 同时过期,比如批量导入缓存,全都设成 30 分钟,半小时后一起失效。这个用随机 TTL 就能缓解:基础过期时间上加一段随机抖动,让 key 分散失效。另一个是缓存服务本身不可用,这就不是随机 TTL 能解决的了,要看系统有没有本地缓存、限流、降级、熔断,以及核心数据能不能预热。面试时可以按层次说:过期时间层,TTL 加随机值,避免同批 key 同时失效;热点数据层,上线或活动开始前预热,不等用户请求触发重建;系统保护层,本地缓存兜底、接口限流、数据库保护、非核心功能降级。如果你项目里只是普通后台系统,没有高并发活动,也别硬编秒杀,可以说「我没做过秒杀,但在后台字典、配置缓存里会做随机 TTL,避免定时任务批量刷新导致同时过期」。这个回答反而更像真的。

面试官真正想听的内容

面试官真正想听的,不是名词,而是你项目里的真实情况。如果简历写了 Redis,就提前把这几个问题想清楚:哪些数据用了缓存?为什么这些数据适合缓存?key 怎么设计?有没有前缀、版本号、业务 id?TTL 设多久?是固定值还是带随机?数据更新时,是删缓存、更新缓存,还是延迟双删?如果缓存没命中,数据库能不能扛住?有没有限流?这比背十页 Redis 面试题更重要。

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

热游推荐

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