缓存常见问题及解决方案


CacheProblems

缓存穿透

缓存穿透: 大量的请求都是缓存和数据库中不存在的数据, 导致每次请求都会到达数据库, 从而压垮数据库。

解决方案

  1. 业务层参数校验, 过滤掉无效的请求
  2. 将查询结果为空的请求也进行缓存, 但是缓存时间要短, 从而在缓存层面拦截掉一部分请求
  3. 布隆过滤器

缓存击穿

缓存击穿: 在某个热点数据失效的同时, 大量的请求涌进数据库, 从而导致数据库宕机。

解决方案

  1. 热点数据不设置过期时间, 一直保存在缓存中
  2. 定时更新热点数据, 在数据失效前刷新数据, 从而延长热点数据的有效期
  3. 使用互斥锁, 当某个线程获取到缓存数据为空时, 对该数据添加读锁, 然后去请求数据库, 从而实现只有一个请求到达数据库

缓存雪崩

缓存雪崩: 缓存中的大量数据同时失效, 或缓存服务器宕机, 导致大量请求涌进数据库, 从而导致数据库宕机。

解决方案

  1. 尽量避免缓存数据同时失效, 在设置数据有效期上增加随机值, 或使数据有效期均匀分布
  2. 后端实现请求限流, 避免大量请求涌入数据库
  3. 使用 Redis 的哨兵模式或 Redis 集群, 保证缓存服务器的高可用性

布隆过滤器

原理: 布隆过滤器是采用 BitMap 来实现的, 大致原理是: 将系统中所有存在的 key 经过 hash 运行后放入 bitmap, 在查询之前先通过 bitmap 过滤掉一定不存在的 key。

缺点是: 因为有 hash 冲突的问题, 所以通过布隆过滤器的数据也有可能是系统中不存在的 key, 但是没有通过布隆过滤器的 key 一定是系统中不存在的。