缓存穿透和缓存雪崩

缓存穿透

概念

缓存穿透是指查询一个一定不存在的数据, 由于缓存不命中, 并且出于容错考虑, 如果从存储层查不到数据则不写入缓存, 这将导致这个不存在的数据每次请求都要到存储层去查询, 失去了缓存的意义.

解决方法

  1. 利用互斥锁, 缓存失效的时候, 先去获得锁, 得到锁后再去访问数据库. 这样的问题在于降低了数据库的吞吐量.

  2. 采用异步更新策略, 无论key是否取到了值, 都直接返回. value值中去维护一个失效时间, 如果缓存失效, 那么异步启动一个线程去数据库中访问, 更新缓存. 这需要对缓存进行预热.

  3. 提供一个拦截机制, 内部维护一系列合法有效的key, 然后判断所携带的key是否有效.

缓存雪崩

概念

当缓存服务器重启或者大量缓存集中在一个时间段内失效, 这时候大量请求会直接到数据库中, 导致数据库连接异常.

解决方法

  1. 给缓存的失效时间加上随机值, 防止集中失效.

  2. 对数据库的访问加入互斥锁, 但是这样会降低数据库的吞吐量.

  3. 设置二级缓存. A为原始缓存, B为拷贝缓存. 当A的缓存失效时, 可以访问B, 并直接返回, 再异步开一个线程去更新A和B中的value.