缓存穿透
问题描述:用户不断的进行查询 Redis 中不存在的数据,并且该数据在数据库中也没有
解决办法
- 将查询的 key 存入 Redis 中,value 为 ”null“
- 服务端做前置校验与过载保护
- 布隆过滤器
缓存击穿
问题描述:高并发的系统中,大量的请求同时查询一个 key 时,这个 key 刚好失效
解决办法
- 加互斥锁,只让第一个线程去查数据库,其余阻塞
- 缓存不过期
缓存雪崩
问题描述
-
Redis 中的缓存集体失效
-
某个缓存服务器节点宕机
解决办法
- 缓存失效时间分散开
- 集群缓存
- 缓存不过期
缓存一致性
方案一
通过 Redis 过期时间更新缓存,数据库更新不会触发 Redis 更新,只有当 key 过期时才会更新
缺点
- 长时间数据不一致,产生脏数据
- 完全依赖过期时间,时间太短频繁失效,时间太长长时间更新延迟
方案二
更新 MySQL 同时更新 Redis
缺点:更新 MySQL 成功,更新 Redis 失败,就成了方案一
方案三
方案二的基础上,增加消息队列,将 Redis 更新交由 MQ 由消息队列保证可靠性,异步更新 Redis
缺点
- 时序问题,多个业务对一条数据进行更新,数据先后顺序可能会乱
- 引入 MQ,增加复杂性
方案四
MySQL 更新与 Redis 更新放在一个事务中,达到强一致性
缺点
- MySQL 与 Redis 一个出现问题,集体魂滚
- 网络超时出现回滚和并发问题
方案五
通过订阅 Binlog 更新 Redis
缺点:单独搭建同步服务,引入 Binlog 同步机制
本文地址:https://blog.csdn.net/u013570834/article/details/107866669