后端缓存的使用-问题-方案
Redis缓存:常见问题以及注意事项
更新策略
更DB, 删Cache
问题: 中间过程中, 可能会有其他进行获取Cache, 导致出现不一致
删缓存, 更DB
问题: 中间过程中, 可能会有其他进行获取Cache, 因为不存在缓存, 主动拉取, 导致DB与Cache出现不一致
延迟双删
删缓存, 更DB, 再删缓存.
引入了一个更多的操作, 最坏情况下有可能退化为方案1, 即在更新DB到第二次删缓存期间, 依然有可能引入不一致.
业务通用的思路
- 设置缓存过期时间, 控制不一致问题的影响范围.
- 如果追求强一致性, 可以考虑锁控制 以及分布式事务来处理, 复杂度稍高.
缓存穿透
定义
缓存穿透是指调用方查询一个不存在的数据时,由于在缓存不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致每次请求这个不存在的数据都要到数据库中去查询,从而给数据库带来压力。缓存穿透一般是由外部恶意攻击(爬虫等)引起的。
解决方案
- 非法请求的校验
- 缓存空对象
- 布隆过滤器
缓存雪崩
定义
缓存雪崩是指当大量缓存数据同时过期,瞬间访问数据库的流量陡增,导致数据库压力过大时直接崩溃,甚至数据库无法直接重启。
解决方案
- 预热
- 降级/兜底
- TTL 随机处理
- 如果不能接受数据库的大量请求, 可以设置TTL永不淘汰, 手动删除
缓存击穿
定义
缓存击穿是指热点key在某个时间点过期,而此时恰好服务收到对这个key的大量并发请求,缓存失效,进而增大数据库的压力。缓存击穿与缓存雪崩类似,不同之处在于缓存击穿是热点key过期,而缓存雪崩是不同数据同时过期。
解决方案
- 热点Key设置不过期
- 分布式锁控制实现串行化