缓存穿透 缓存击穿 缓存雪崩
背景
之前在B站看模拟面试的时候,有问到缓存相关的问题,然后我一脸懵*。在此记录一下。
概念
缓存穿透
图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中查数据的时候加互斥锁,实现的方式有很多
- 可以参考Redis实现分布式锁
- 简单一点的 Redis的SETNX
缓存雪崩
- 不同key过期时间在基数上增加随机值,避免同一时间大量数据过期
- 热点数据尽量存储在不同数据库中
- 热点key过期时间无限长