缓存

什么时候用缓存?

  • 数据查询多
  • 数据变更少
  • 数据查询需要多表联查,耗费时间,

缓存一致性如何解决

  1. 先删除缓存
  2. 更新缓存

缓存更新策略

  1. 增量更新
  2. 每天定时全量更新

缓存穿透

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。

解决方案:

  • 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中。
  • 如果一个查询返回的数据为空,我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

缓存雪崩

我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,由于缓存不能命中,导致大量查询到数据库,造成数据库负载过大,导致服务不可用。

解决办法:

  • 原有的失效时间基础上增加一个随机值,比如1-5分钟随机
  • 对数据库层做并发控制,保证服务的可用性

缓存击穿

对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,后者则是很多key。

解决办法:

  • 使用互斥锁
  • 永远不过期
  • 资源保护

results matching ""

    No results matching ""