【问题标题】:What is a viable strategy to reach a particular cache hit ratio?达到特定缓存命中率的可行策略是什么?
【发布时间】:2018-10-01 16:01:08
【问题描述】:
我们的团队正在为 key-val 查找服务构建缓存层,该服务具有使用 2 级缓存的一般准则:主机内层和分布式层。有 70% 的缓存命中率要求,因此预计只有 30% 的流量会落入下游 NoSQL。一开始,我们可以弄清楚影响命中率的一些因素:
- TTL
- 缓存大小
- 查询模式:例如15% 的键通常比其他键被查询。
- ...其他?
我们也有一些初步的想法来实现它,比如做一些预取数据到缓存,例如 70% 的数据。但最终我意识到这比我们想象的要复杂,我们需要一个更有力的理由。
我们有与该问题相关的任何资源/研究或论文吗?或者做一些测试或秒杀它的正确方法是什么?
【问题讨论】:
-
如果您捕获请求跟踪,您可以快速simulate 不同大小和策略。了解工作负载的特征(频率与新近度)可能是很好的第一步。
-
标签:
caching
memcached
ehcache
【解决方案1】:
影响命中率的主要因素有 3 个:
- 访问模式
- 缓存策略
- 工作集大小与缓存大小的关系
访问模式通常不受您的控制,因为它取决于用户如何访问您的服务。您确实可以控制缓存策略,但如何更改它以提高命中率通常不是直截了当的。工作集通常不受您的控制,因为它取决于访问模式,但您可以控制缓存大小。
我会按如下方式处理您的情况:
- 确保工作集适合您的缓存(很容易做到)
- 改进缓存策略(更加复杂和耗时)
要找出您的工作集大小并确保它适合缓存,您可以从一个小缓存开始,然后逐渐(例如每隔几天)增加缓存大小并查看命中率增加了多少。缓存越大,命中率的增加将变得越来越小,一旦达到收益递减点,您就会知道您的工作集大小。此时获得的命中率是缓存策略所能获得的最大值。
如果您的工作集适合您的缓存并且您达到了 70% 的要求,那么您就完成了。如果没有,您将需要调整缓存策略。这基本上需要巧妙的工程。像 Ben Manes 所说的模拟对于这种聪明的工程来说绝对是一个非常有用的工具。