23

memcached用来存储复杂计算的整数结果。我有数百个可以缓存的整数对象!我应该将它们缓存在更复杂对象中的单个键下,还是应该为对象使用数百个不同的键?(我正在缓存的对象每天不需要多次失效)

4

6 回答 6

11

我会说很多小钥匙。这样,您可以通过最少的序列化工作在 1 次调用中获得所需的确切结果。

如果将它存储在另一个对象(例如数组)中,您将不得不从缓存中获取数组,然后再次从该数组中获取您真正想要的项目,而且您还有再次序列化/反序列化整个复杂对象的开销。根据您选择的语言,这可能意味着从头开始手动编写序列化/反序列化函数。

于 2009-01-13T02:35:10.070 回答
8

我在http://dammit.lt/2008/12/25/memcached-for-small-objects/上写了一些大的分析——它概述了如何针对小对象存储优化 memcached——它可能会为这个问题提供一些启示。

于 2009-04-11T09:22:42.517 回答
2

这取决于您的应用程序。虽然 memcached 非常快,但它确实需要一些请求传输和每个请求的内存查找时间。这些数字的增加取决于服务器是在本地计算机 (localhost)、本地网络上还是在大范围内。缓存的大小通常不会影响查找速度。

因此,如果您的应用程序在每个处理单元(每个请求、方法或您所拥有的)使用许多对象,那么通常最好以一种同时降低缓存命中总数的方式定义您的缓存尝试不复制缓存数据的时间。像其他一切一样,这是一种平衡。

即,如果您有一个拉取博客文章列表的 Web 请求,将整个对象列表缓存为一个 memcached 键会更有益,而不是(显然这是一个有点糟糕的例子)缓存一组缓存键对于该列表,它与单独的 memcached 对象有关。

于 2009-01-13T02:58:31.240 回答
1

您对缓存值的处理越少越好。那么为什么不将它们单独转储到缓存中呢?

于 2009-01-13T02:30:28.893 回答
1

我会说你应该单独存储值并使用某种帮助类来使用 multiget 检索值并为你生成一个复杂的数据对象。

于 2012-12-21T10:05:41.313 回答
0

这取决于这些数字是多少。例如,如果您可以将它们按范围分组,那么您可以优化存储。如果您可以将它们散列到映射或哈希表中并将该映射序列化存储在 memcached 中会很好。

无论如何,你可以保存很多小键,只要确保你将slab配置为具有小尺寸的块,这样你就不会浪费内存空间。

于 2011-11-02T13:33:23.237 回答