常见问题

缓存穿透

即故意去请求缓存中不存在的数据,导致所有的请求都去请求数据库,从而数据库连接异常。

解决方案:

  • 使用互斥锁,获得锁后再去请求数据库。否则眠一段时间后重试。
  • 增加接口校验,比如,利用布隆过滤器,内部维护一系列合法有效的 Key。迅速判断出,请求所携带的 Key 是否合法有效。

缓存击穿

指缓存中没有但数据库中有的数据(一般是缓存时间到期),同时,并发用户特别多,都去数据库去读数据,造成数据库压力瞬间增大

解决方案:

  • 设置使用率高的数据永不过期
  • 使用互斥锁,得到锁的请求负责更新缓存,其他请求等待一段时间。

缓存雪崩

指缓存中数据大批量到过期时间,从而导致查询数据量很大。

解决方案:

  • 像缓存击穿的处理方式一样,使用 不过期的超时事件和互斥锁
  • 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
  • 双缓存,缓存 A 和缓存 B。缓存 A 设置失效时间,缓存 B 不设失效时间,做缓存预热操作。