缓存异常

89 阅读1分钟

单纯记笔记而已

缓存穿透

读请求的数据不存在,因此每次发送都会数据库查询,数据库null,所以下次依旧会打到数据库

重点是: 数据根本不存在

  • 使用singlefilight缓解问题
  • 知道没有数据,缓存未命中直接返回
    • 缓存里面有全量数据,未命中直接返回
    • 布隆过滤器,bit array等结构,未命中在问一次
  • 缓存没有,不查询数据库返回默认值
  • 限流器

缓存击穿

缓存中没有,数据库中存在

非常高的请求,都没有命中,一瞬间都去数据库中查询

  • 使用singlefilight缓解问题
  • 缓存未命中,使用默认值
  • 在回查数据的时候,加上限流器

缓存雪崩

同一时间,大量的key过期,查询都要查询数据库

都是大量的请求落到了数据库上

  • 在设置过期时间的时候增加一个随机变量的时间

所以要在缓存出现问题的时候,这些请求不放在数据库上?

singleflight

在有多个goroutine请求同一个key对应的数据时,只允许一个过去,其他都在原地等待结果

image.png

布隆过滤器

不存在key1 去询问布隆过滤器,

  • 如果有则查询数据库-可能会假阳性
  • 如果不存在就不查询