1)缓存穿透
故意查询在cache和db中根本都不存在的数据。
如果非法key的数量不多,可以缓存null。如果很多的话,使用布隆过滤器判断key是否在合法名单中。
其他的类型场景有Hbase 中使用它去判断数据是否在磁盘上。还有在爬虫场景判断url 是否已经被爬取过。
注意,布隆过滤器有一个小小的误识别率,某个非法key也可能被认为是在合法名单中。
2)缓存击穿
在某个时刻,key刚好过期,这时候大量相关查询过来,都会打到数据库上。
解决方案是使用互斥锁,第一个线程拿到锁后,其他线程需要等待。第一个线程存取到缓存之后,其他线程直接走缓存即可。
3)缓存雪崩
大规模的缓存失效,比如缓存宕机。
- 增强可用性,如果是redis,可使用sentinel + 主从结构
- 限流降级:使用 Hystrix进行限流 & 降级 ,比如一秒来了5000个请求,我们可以设置假设只能有一秒 2000个请求能通过这个组件(数据库的的阈值),那么其他剩余的 3000 请求就会走限流逻辑。
4)热点数据集中失效
- 设置key的过期时间,使用某个范围内的随机值
- 互斥锁。但会减小吞吐量。
网友评论