缓存击穿
Redis的一个key过期,请求发送到了数据库,导致数据库压力过大,性能下降。
解决方案
就是设置合理过期时间,将热点数据设置永不过期,使用互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其他请求才能通过该key访问数据
缓存雪崩
Redis的多个key失效,导致所有请求都落到数据库上,形成流量洪峰,导致数据库压力过大,性能下降甚至宕机导致系统完全不可用。
原因
- 大量的key设置了相同的过期时间
- 缓存服务宕机,所有缓存不可用
解决方案
事前预防:避免Redis全盘崩溃,使用高可用架构:主从+哨兵、redis cluster,即使部分节点宕机,其他节点仍然能够继续提供服务 事中控制:本地缓存+hystrix限流&降级,避免数据库被请求打崩溃。同时设置合理的过期时间。 事后恢复:redis持久化,一旦重启,自动从磁盘加载数据,快速恢复缓存数据
缓存穿透
用户或者是恶意攻击者,构建大量不存在的数据或不停的发送到redis,会造成请求直接打到数据库上,导致数据库性能下降
解决方案
- 缓存空对象: 对于查询结果为空的情况,也将其缓存起来,设置合理过期时间