缓存穿透:
什么是缓存穿透?
指查询一个不存在的数据,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 | 轻量级,减少非法请求穿透 | 直接控制请求频率,保护数据库 |
| 缺点 | 消耗内存,可能会发生不一致的问题 | 实现复杂,存在误判 | 仅能拦截部分简单攻击,无法应对复杂伪造请求 | 可能误伤正常用户,需结合业务调整阈值 |
布隆过滤器原理:
缓存击穿:
什么是缓存击穿?
指给某一个key设置了过期时间,当key过期的时候,恰好这个时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把数据库压垮。
怎么解决?
互斥锁:(强一致,性能差)
逻辑过期:(高可用,性能好,不能保证数据绝对一致)
缓存雪崩:
什么是缓存雪崩?
指同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。