1.缓存使用过程中可能遇到的问题

1.1缓存穿透

  • 含义: 查询一个一定不存在的数据,缓存和数据库不存在数据。因为缓存不存在,所以每次都会直接去数据库查询,缓存失去了意义。当大量访问这种不存在的数据时,就造成了缓存穿透。
  • 解决方案:
  • 可以对访问进行过滤,将所有可能的数据key的hashcode存储到BitSet中,判断请求id是否命中,如果没有命中,则说明不存在数据。
  • hutool提供了BoolmFilter封装的工具类,google的Guava工具类也进行了封装

1.2 缓存雪崩

  • 含义: 是指缓存在同一时间发生大量过期,而造成查询数据库量增大,可能造成数据库崩溃。
  • 解决方案:通过缓存过期时间随机,不要固定为某个时间

1.3 缓存击穿

  • 含义: 缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
  • 解决方案:
  • 热点数据不过期。这种相对来说性能会比较好,但是缓存数据更新时,多线程情况下其他线程很容易读到旧数据。
  • 使用互斥锁。
  • 只允许一个线程重建缓存,其他线程等待重建缓存的线程执行完,重新从缓存获取数据。
  • 保证了数据的一致性
  • 当并发量大的时候容易出现线程池阻塞或死锁的情况