穿透

请求一个不存在的数据,也就是缓存和数据库都查不到这个数据,每次都会去数据库查询,这种查询不存在的数据就是穿透.

  1. 问题
    1. 如果每次都拿一个不存在的id去查询数据库,可能会导致你的数据库压力增大
  2. 解决
    1. 缓存空值,一定时间后过期,比如5分钟
    2. 布隆过滤器:把所有有数据的key都放入布隆中,每次查询都去布隆判断,没有则直接返回null
      1. 注意BloomFilter没有删除操作(删除很困难),对于删除的key,查询就会经过BloomFilter然后查询缓存再查询数据库,所以BloomFilter可以结合缓存空值用,对于删除的key,可以在缓存中缓存null

击穿

高并发时候,大量请求请求同一个key,这个时候正好key过期,则同一时间,这些请求都去查询数据库

  1. 问题
    1. 造成某个时刻数据库请求过大
  2. 解决
    1. 对于一个key,只有第一个线程去请求数据库,然后插入缓存

雪崩

某个时刻大规模的缓存失效,比如缓存服务器宕机

  1. 解决:
    1. 设置不同的失效时间
    2. 永不失效