Redis中的穿透、雪崩、击穿问题
缓存击穿
原因
Redis中热点数据失效的瞬间,所有的请求都打到MySQL数据库上面,击穿了Redis的缓存,导致性能下降
解决方案
- 设置热点数据永不过期
- 设置加锁队列(线程锁或分布式锁),先让一个线程去数据库查到数据,缓存到Redis中,然后其他线程再来Redis中取数据
缓存雪崩
原因
Redis中缓存的很多数据,在同一时刻失效,或Redis缓存服务器宕机,而导致请求全部打到MySQL上面,给MySQL造成巨大压力
解决方案
- 将缓存数据的过期时间设为随机,避免其都在同一时刻失效
- Redis的高可用,集群+哨兵
缓存穿透
原因
查询的数据在数据库和缓存中都不存在,恶意请求数据,导致每次请求都要去查询数据,导致数据库压力过大或宕机
解决方案
- 对请求参数进行校验(无法完全避免)
- 将数据库中不存在的数据也缓存到Redis中,避免每次收到数据库中进行查询
- 布隆过滤器
参考: