高并发下缓存的常见问题

缓存一致性

当对缓存中的数据失效要求较高时,需要要求缓存中的数据与数据库中的数据保持一致,其中包括缓存结点与其副本中的数据保持一致。
缓存的一致性依赖于缓存的过期和更新策略。

如下图所示:

图示

导致缓存一致性出现问题的情况:

  1. 更新数据库成功,但更新缓存时失败。
  2. 更新缓存成功,但更新数据库时失败。
  3. 当更新数据库成功后,淘汰缓存出现失败,也会导致数据的不一致。
  4. 淘汰缓存成功,但更新数据库时出现失败,导致查询缓存时出现miss情况。

缓存并发问题

如下图示:

图示

当出现缓存不一致情况或某个缓存中数据的key更新后,线程会向数据库请求并查询数据。但发生在多并发情形下,该并发问题会对数据库造成巨大的冲击,甚至会导致缓存雪崩。
如图中所示,为解决缓存并发中的问题,需要对线程访问数据库时加锁:查询数据库前加锁,在重建缓存后解锁。

缓存穿透问题

如下图示:

图示

在高并发场景下,某一个缓存的key的多线程并发访问中未被命中,由于缓存架构存在访问的容错性,会允许线程从后端获取数据,从而对数据库造成巨大冲击。
当缓存中的key对应的数据为空时,导致大量的无效查询操作,且对数据库造成巨大压力。
避免缓存穿透的解决方案:

  1. 对查询结果为空的对象也进行缓存:如果查询的集合数据类型为null,要转换为空的集合;如果缓存时单个对象的null,需要通过字段标识进行区分,避免null的出现。同时需要保持缓存的时效性。实现简单,适用于命中率不高但更新频繁的场景。
  2. 单独过滤处理:对所有可能数据为空的key划分统一的区域存放,并在请求前进行拦截。实现较复杂,适用于命中率不高且更新不频繁的场景。

缓存雪崩现象

缓存的颠簸(抖动)问题:是一种轻微的缓存雪崩现象,但仍会降低系统性能,并对系统稳定造成巨大的影响。一般是由缓存结点的故障导致。也需要一致性hash算法解决。

由于缓存的问题,导致大量的请求到达后端的数据库,从而导致数据库崩溃,甚至整个系统崩溃。
导致缓存雪崩的情况有:缓存并发问题、缓存穿透、缓存抖动等。如:一个时间点内,缓存中的数据周期性地集中失效,也可能导致雪崩。其中可随机性地设置缓存的失效过期时间,避免集中失效。

推荐文章

Redis在股票分时K线图计算的实践

SupriseMF wechat
欢迎关注微信订阅号【星球码】,分享学习编程奇淫巧技~
喜欢就支持我呀(*^∇^*)~

热评文章