Redis

缓存穿透

指查询一个一定不存在的数据,由于缓存未命中导致这个不存在的数据每次都要到存储层查询,大量的请求会使数据库挂掉

解决方案

  1. 把无效的 key 存入 Redis,查询时先在 Redis 内部判断是否存在。如果每次的 key 都不同会使这种方案失去意义。
  1. 布隆过滤器。布隆过滤器判断某个 key 不存在,那么一定不存在;判断某个 key 存在,那么极大可能存在。

缓存雪崩

指在设置缓存时使用了相同的过期时间,导致缓存在某时刻同时失效,此时可能会有大量请求全部转发到数据库。

解决方案

在失效时间基础上添加随机值

缓存击穿

对于某个热点数据在过期时可以会面临超高并发访问,同一个 key 对应的大量请求转发至数据库。

解决方案

  1. 使用互斥锁(Mutex)。在缓存失效时不立即访问数据库,而是先设置一个互斥锁(如 Redis 的 setnx 操作),当操作返回成功时再进行数据库访问,否则尝试重新获取缓存。也可以在缓存即将失效时设置互斥锁并更新缓存数据。
  1. 设置热点数据永不过期。可以是缓存没有过期时间,也可以手动更新过期时间使缓存不过期。