缓存穿透 缓存击穿 缓存雪崩

背景

之前在B站看模拟面试的时候,有问到缓存相关的问题,然后我一脸懵*。在此记录一下。

概念

图1 查询各情况列举

缓存穿透

图1 中的“B -> E”,某一个key在缓存中未查询到值,去DB中查也没有,导致大量请求同时打到了DB。

缓存击穿

图1 中的“B -> C -> D”,缓存中某一个key失效了,DB中存在,导致大量请求同时打到了DB。DB扛过去的话,后面的请求就可以去缓存里面读数据,有时候服务器出现性能峰值就是这种情况。

缓存雪崩

图1 中的“B -> C -> D”,缓存中大量Key都失效了,DB中存在,导致更多的数据查询请求打到DB。这种DB可能会挂掉,导致整个服务都不可用了,比较严重。

解决方案

我目前接到的业务,都木有这么大的流量,还没有出现过上述情况,所以解决方案都是在网上看到的,没有生产环境的应用经验,仅供参考【迅速甩锅......

缓存穿透

  • 接口层增加 用户鉴权、查询条件合法性校验
  • 将key-null也写入缓存,有效时间设置得短一点
  • 布隆过滤器:将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力

缓存击穿

  • 热点key过期时间无限长
  • 去DB中查数据的时候加互斥锁,实现的方式有很多

缓存雪崩

  • 不同key过期时间在基数上增加随机值,避免同一时间大量数据过期
  • 热点数据尽量存储在不同数据库中
  • 热点key过期时间无限长

参考

缓存穿透、缓存击穿、缓存雪崩区别和解决方案

REDIS缓存穿透,缓存击穿,缓存雪崩原因+解决方案

Redis的SETNX的使用方法

布隆过滤器(Bloom Filter)的原理和实现

布隆过滤器的方式解决缓存穿透问题

Redis缓存穿透解决方法--布隆过滤器

猜你喜欢

转载自blog.csdn.net/yxz8102/article/details/109923517
今日推荐