达到特定缓存命中率的可行策略是什么?



我们的团队正在努力为 key-val 查找服务构建缓存层,该服务具有使用 2 级缓存的一般准则:主机内和分布式层。需要 70% 的缓存命中率,因此预计只有 30% 的流量会落入下游 NoSQL。一开始,我们可以找出一些影响命中率的因素:

  1. TTL
  2. 缓存大小
  3. 查询
  4. 模式:例如,通常查询 15% 的键比其他键。
  5. 。其他?

我们也有一些实现它的初步想法,比如做一些预取数据来缓存,例如 70% 的数据。但归根结底,我意识到这比我们想象的要复杂得多,我们需要一个更强有力的理由。

我们是否有与该问题相关的资源/研究或论文?或者做一些测试或加标的正确方法是什么?

有 3 个主要因素会影响您的命中率:

  1. 访问模式
  2. 缓存策略
  3. 工作集大小与缓存大小的关系

访问模式通常不受您的控制,因为它取决于用户访问服务的方式。您确实可以控制缓存策略,但通常不直接如何更改它以提高命中率。工作集通常不受您的控制,因为它取决于访问模式,但您可以控制缓存大小。

我会这样处理您的情况:

  1. 确保工作集适合您的缓存(易于操作)
  2. 改进缓存策略(更复杂且耗时)

要找出您的工作集大小并确保它适合缓存,您可以从一个小缓存开始,然后逐渐(例如每隔几天)增加缓存大小,看看命中率增加了多少。缓存越大,命中率的增加就会变得越来越小,一旦达到收益递减的点,你就知道你的工作集大小了。此时获得的命中率是缓存策略获得的最大值。

如果您的工作集适合缓存并且您达到了 70% 的要求,那么您就完成了。如果没有,您将需要调整缓存策略。这基本上需要巧妙的工程设计。像Ben Manes建议的那样,仿真绝对是这种聪明工程的非常有用的工具。

最新更新