Redis 缓存雪崩
大量 Redis 缓存,同一时间集体失效。
解决方案
- 设置缓存失效时间时,使用随机数
- 集群部署时,可以将热点KEY,放到不同节点上,使之平均分布
- 直接不设置缓存失效时间
- 设置定时任务刷新缓存
Redis 缓存击穿
大量并发同时访问同一个 Redis 缓存KEY时(常用KEY,热点KEY),此缓存突然失效,导致所有访问直接去访问数据库。
解决方案
- 设置KEY缓存永不过期
- 使用分布式锁(单体应用可以使用互斥锁)
说明:在请求数据库时上锁,保证只有一个线程请求数据库,其它线程发现已经有锁了,就等一会再去访问缓存,因为访问数据库的线程取出数据后应立即设置到缓存。
Redis 缓存穿透(恶意击穿)
攻击者使用不可能的KEY数值访问,由于Redis缓存没有,所以会直接访问数据库。(比如正常情况下不会用 负数当作主键ID,这个时候攻击者专门使用负数访问,这些访问直接穿透 Redis,去访问数据库,导致数据库压力过大甚至宕机)
解决方案
- 返回空值也缓存到Redis(但是可能会改参数)
- 做IP限制,拉黑IP等(但是可能会更换IP,现在有这种服务)
- 校验参数合法性
- 使用布隆过滤器(最好的方式)