缓存常见问题
缓存穿透
概念:
查询缓存中没有,数据库也没有的数据,大量的请求都穿透了缓存层直达数据库,导致数据库因压力过大而宕机。
本质是一种人为攻击手段。
解决方案:
-
数据库不存在数据时,存放一个临时数据到缓存中
-
布隆过滤器
在查询缓存时,会先经过布隆过滤器,根据Redis的Key进行Hash并取模。
根据取值后对应的位数组下标上值判断:
都是1,则说明该数据在缓存中有可能存在,去缓存中查询
至少有一个为0,表示该数据在缓存中不存在,直接返回
缓存击穿
概念: 某一个热点数据的key突然过期,造成大量请求直达数据
解决方案:
- 数据永不过期(定时任务,凌晨流少的时候更新缓存)
- 接口限流或降级
- 分布式锁
- 缓存预热
雪崩
概念: 缓存中在同一个时间点有大量的key同时过期,请求查询缓存中没有,直达数据库
解决方案:
- 分布式锁
- 热点数据永不过期
- 随机过期时间
缓存一致性
缓存一致性问题,也叫双写一致性问题: 写数据库+写缓存 如何做到同步
- 强一致性 上锁 性能差
- 弱一致性 最终一致性
- 先更新数据库,再删除缓存
- 延迟双删 删除-写入-延迟片刻再删除
- Canal+MQ