【问题标题】:How do I mitigate the situation when Redia has not cached an expensive DB query?当 Redia 没有缓存昂贵的数据库查询时,如何缓解这种情况?
【发布时间】:2021-07-28 08:54:42
【问题描述】:

Redia 没有缓存昂贵的数据库查询,因此查询正在针对数据库运行。如果不幸的是,在 Redia 缓存结果之前我收到了几个针对该查询的请求,在我当前的实现中,所有请求都转到 DB,这会导致 DB 性能急剧下降。

我知道可能没有简单的方法可以解决此问题,但我想知道是否有任何方法可以缓解这种情况?

----更新-----

我进一步在谷歌上搜索了 cache stampede 这个词,发现这 2 篇文章提供了丰富的信息:

  1. What is a cache stampede and how we solved it by writing our own gem
  2. How a Cache Stampede Caused One of Facebook’s Biggest Outages

他们提到了以下 3 种缓解这种情况的方法:

  1. 锁定
  2. 外部重新计算
  3. 概率提前到期

【问题讨论】:

    标签: caching redis memcached


    【解决方案1】:

    通常有两种解决方案:

    1. 进行预取,即在缓存过期之前进行数据库查询。详情可以google XFetch算法。

    2. 使用(分布式)锁来避免同一个DB查询同时命中DB,即只有获得锁的客户端才能进行DB查询和更新缓存,其他客户端必须等待结果,然后重试。

    【讨论】:

    • 我不知道 XFetch,但是当我搜索“缓存踩踏”时发现了一些有用的信息。谢谢。
    • 嗨,XFetch 是这里提到的“概率早期重新计算”betterprogramming.pub/… 吗?
    • 是的。还要检查 this 以了解 XFetch 和 Redis 的集成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多