缓存问题总结

2019-04-17  本文已影响0人  packet

1)缓存穿透
故意查询在cache和db中根本都不存在的数据。
如果非法key的数量不多,可以缓存null。如果很多的话,使用布隆过滤器判断key是否在合法名单中。
其他的类型场景有Hbase 中使用它去判断数据是否在磁盘上。还有在爬虫场景判断url 是否已经被爬取过。
注意,布隆过滤器有一个小小的误识别率,某个非法key也可能被认为是在合法名单中。


2)缓存击穿
在某个时刻,key刚好过期,这时候大量相关查询过来,都会打到数据库上。
解决方案是使用互斥锁,第一个线程拿到锁后,其他线程需要等待。第一个线程存取到缓存之后,其他线程直接走缓存即可。

3)缓存雪崩
大规模的缓存失效,比如缓存宕机。

  1. 增强可用性,如果是redis,可使用sentinel + 主从结构
  2. 限流降级:使用 Hystrix进行限流 & 降级 ,比如一秒来了5000个请求,我们可以设置假设只能有一秒 2000个请求能通过这个组件(数据库的的阈值),那么其他剩余的 3000 请求就会走限流逻辑。

4)热点数据集中失效

  1. 设置key的过期时间,使用某个范围内的随机值
  2. 互斥锁。但会减小吞吐量。

鸣谢:关于【缓存穿透、缓存击穿、缓存雪崩、热点数据失效】问题的解决方案

上一篇 下一篇

猜你喜欢

热点阅读