别再乱用缓存了!这7个坑你踩过几个
缓存是提升性能的利器但用不好就是灾难。见过太多项目因为缓存设计不当轻则数据不一致重则服务雪崩。以下7个坑看看你踩过几个。坑一缓存穿透——查不存在的数据用户查一个不存在的ID缓存没有请求直接打到数据库。如果是恶意攻击每秒几万次数据库瞬间被打爆。很多人以为缓存能挡住一切却忘了“查不到”也是一种结果。解决方案布隆过滤器提前拦截或者缓存空值并设置短过期时间同时做好参数校验。坑二缓存击穿——热点key过期某个爆款商品的缓存刚好过期瞬间大量请求同时涌向数据库像子弹击穿防弹衣。解决方案加互斥锁只让一个请求去加载数据其他等待或者逻辑过期不设物理TTL异步更新再或者热点数据永不过期后台定时刷新。坑三缓存雪崩——大面积失效凌晨批量导入数据给所有缓存设置了相同的过期时间。时间一到全部失效数据库瞬间被压垮。更糟的是缓存服务宕机所有请求直接穿透。解决方案过期时间加随机值避免同时失效多级缓存本地缓存兜底熔断降级数据库限流缓存集群高可用。坑四缓存与数据库一致性——最头疼的问题先更新数据库再删缓存还是先删缓存再更新数据库两种顺序在并发下都可能出问题。比如先删缓存还没来得及更新数据库另一个请求就把旧数据读回缓存了。解决方案延迟双删更新后隔一段时间再删一次或者订阅binlog异步刷新对一致性要求高的场景直接读数据库别硬套缓存。坑五大key和热key——集群的隐形杀手一个key存了几百MB的JSON每次读取都占用大量网络带宽甚至导致节点阻塞。热key则是某个key访问量极高打爆单个分片。解决方案大key拆分成多个小key压缩value或者改用Hash结构分字段存取热key做本地缓存或者把key打散到多个节点。坑六缓存并发竞争——更新覆盖多个请求同时更新同一个keyA先写入了新值B后写入旧值结果缓存里是旧数据。解决方案分布式锁保证串行更新或者用CAS乐观锁带版本号更新。更简单的办法是让更新操作走队列异步串行处理。坑七缓存滥用——什么都往里塞不是所有数据都适合缓存。写多读少的数据缓存命中率极低一致性要求极高的数据缓存只会带来麻烦低频访问的数据缓存纯属浪费内存。缓存应该留给热点数据、读多写少、能容忍短暂不一致的场景。别为了用缓存而用缓存。缓存不是银弹它解决的是性能问题却引入了复杂度。用之前先问自己数据一致性要求多高访问模式是什么失效策略怎么定踩过坑不可怕可怕的是同一个坑反复踩。把上面7条对照一遍你的缓存设计至少能避开80%的事故。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →