Redis 缓存雪崩

大量 Redis 缓存,同一时间集体失效

解决方案

  1. 设置缓存失效时间时,使用随机数
  2. 集群部署时,可以将热点KEY,放到不同节点上,使之平均分布
  3. 直接不设置缓存失效时间
  4. 设置定时任务刷新缓存




Redis 缓存击穿

大量并发同时访问同一个 Redis 缓存KEY时(常用KEY,热点KEY),此缓存突然失效,导致所有访问直接去访问数据库。

解决方案

  1. 设置KEY缓存永不过期
  2. 使用分布式锁(单体应用可以使用互斥锁)

说明:在请求数据库时上锁,保证只有一个线程请求数据库,其它线程发现已经有锁了,就等一会再去访问缓存,因为访问数据库的线程取出数据后应立即设置到缓存。



Redis 缓存穿透(恶意击穿)

攻击者使用不可能的KEY数值访问,由于Redis缓存没有,所以会直接访问数据库。(比如正常情况下不会用 负数当作主键ID,这个时候攻击者专门使用负数访问,这些访问直接穿透 Redis,去访问数据库,导致数据库压力过大甚至宕机)

解决方案

  1. 返回空值也缓存到Redis(但是可能会改参数)
  2. 做IP限制,拉黑IP等(但是可能会更换IP,现在有这种服务
  3. 校验参数合法性
  4. 使用布隆过滤器(最好的方式)