Redis缓存穿透、击穿、雪崩

67 阅读2分钟

缓存穿透:

什么是缓存穿透?

指查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查询数据库。

stateDiagram-v2

请求:/api/goods/getById/1 --> Redis
Redis --> 请求:/api/goods/getById/1
Redis --> MySQL
MySQL --> 请求:/api/goods/getById/1

怎么解决?

方案一方案二方案三方案四
原理缓存空数据,查询返回的数据为空,仍把这个空结果进行缓存。 {key: 1,value: null}使用布隆过滤器在业务层对请求参数进行合法性校验,过滤明显无效的查询对接口或IP进行限流,防止恶意请求压垮系统。网关层:Nginx、API GateWay。分布式限流:Redis+Lua、Sentinel、Hystrix
优点简单内存占用较少,没有多余key轻量级,减少非法请求穿透直接控制请求频率,保护数据库
缺点消耗内存,可能会发生不一致的问题实现复杂,存在误判仅能拦截部分简单攻击,无法应对复杂伪造请求可能误伤正常用户,需结合业务调整阈值

image.png

布隆过滤器原理:

image.png

微信图片_20250521235446.png

缓存击穿:

什么是缓存击穿?

指给某一个key设置了过期时间,当key过期的时候,恰好这个时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把数据库压垮。

image.png

怎么解决?

互斥锁:(强一致,性能差)

image.png

逻辑过期:(高可用,性能好,不能保证数据绝对一致)

image.png

缓存雪崩:

什么是缓存雪崩?

指同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

image.png

怎么解决?

1.给不同的key的过期时间添加随机值

2.利用Redis集群提高服务的可用性

3.给缓存业务添加降级限流策略

4.给业务添加多级缓存