如何确定要缓存的最佳数据集?

时间:2011-07-22 04:43:53

标签: algorithm caching

我有一个简单的Web服务,它提供XML数据集(它们可以大到250MB)。此数据来自针对数据库执行的复杂查询。为了加快服务速度,我想缓存一些查询的结果。但是我有一个有限的RAM(~2GB)。我事先并不知道最需要的XML数据集是什么。另外,这可以随时间改变(例如,昨天数据集X是最常请求的,明天它可以是数据集Y)。

我想要一种“智能”缓存算法,它可以缓存最有可能被请求的数据集。在这种情况下,我不能简单地使用计数器并缓存最常请求的数据。我需要某种时间来减少请求的数量。

3 个答案:

答案 0 :(得分:2)

一种选择是在请求之间执行http://en.wikipedia.org/wiki/Exponential_smoothing,或在连续几分钟内执行请求数量。如果您的文档确实很大,那么您可以选择在文档超出缓存时保留一些信息,因此您至少可以尝试比VM中通常用于页面替换的方法更广泛的方法,例如LRU,哪个跟踪仅请求缓存中的对象。

假设您有网络日志,您可以计算出任意数量的不同方法的命中率,只需在日志中记录的一系列请求中进行尝试即可。

答案 1 :(得分:1)

您可以使用LRU。每次访问不在缓存中的内容时,将事物替换为最久前使用的缓存,并将其年龄设置为0,递增所有其他年龄。每次有缓存命中时,重置元素的年龄并增加所有其他年龄。也可以通过设置等于当前时间戳来完成。

注意:LRU通常用作最优算法的近似值,需要更好的知识:替换最长时间不使用的算法。当地方性好时,LRU运行良好,并且不会受到Belady异常的影响。

答案 2 :(得分:1)

为什么不阅读一些关于通用缓存结构的文章?:

http://en.wikipedia.org/wiki/Cache

我还建议您阅读有关CPU缓存的文章:

http://en.wikipedia.org/wiki/CPU_cache

例如,根据CPU缓存的表示法,您可以将缓存实现为具有LRU替换算法的完全关联缓存。您还可以尝试使用4路组关联缓存的缓存。 (但是,在您的情况下,set的定义可能不明确)


通常,LRU是近似最优的缓存替换算法。 LRU可以通过使用时间戳简单地实现,或者有一些近似算法。

但是,它实际上取决于工作负载的 locality 模式(空间和时间)。我们不能简单地说LRU总是好的。因此,您需要更好地了解工作负载的行为。