一文读懂并解决 Redis 雪崩、击穿、穿透
大家都知道缓存的两个作用,一是降低访问时间提升系统响应速度(Redis 为什么快),二是保护数据库。
如果缓存出了问题,不但起不到上述的作用,反而会成为双刃剑(降低系统响应速度 -> 打崩数据库 -> 系统崩溃)。
缓存雪崩
原因
- 缓存中大量的 key 在同一时刻过期,导致大量请求直接打到数据库上。
- Redis 实例宕机
解决方案
针对数据过期的方案:
- 可以分散过期时间(不同的 key 设置不同的过期时间)
- 可以不让其过期(看具体业务,只针对热点 key 比较好)
一些花活儿:
- 再构建一层缓存(构建主 key 和备 key,如果主 key 过期,会请求到备 key,同时再重新设置上主 key)
- 后台更新(如果发现没有了重新设置上),没啥用(不分散时间还是同一时刻过期,还是会有个间隙直接雪崩)
针对 Redis 实例宕机:
- 要么服务熔断、要么请求限流
- 构建 Redis 集群
缓存穿透
原因
请求的数据 Redis 中没有,数据库也没有。
解决方案
- 对不存的记录设置一个空值或者默认值直接返回
- 限制非法请求
- 布隆过滤器
缓存击穿
原因
某个热点 key 过期了,此时大量请求访问了该热点数据,由于缓存中没有,直接访问数据库。
解决方案
- 热点 key 永不过期
- 互斥锁方案:对某个请求加锁访问数据库并设置缓存(别的请求就可以查询缓存了)
总结
总的思想就是,确保实例高可用,尽量不让请求访问到数据库(缓存过期时间、不存在的值也可以缓存、限流),如果访问数据库也不能让太多请求访问数据库。