Memcached最佳实践 - 小对象和许多键或大对象和几个键?

时间:2009-01-13 02:25:45

标签: memcached

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

6 个答案:

答案 0 :(得分:10)

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

如果将它存储在另一个对象(例如数组)中,则必须从缓存中获取数组,然后从该数组中再次获取实际需要的项目,此外还有序列化/反序列化整个复杂的开销再次反对。根据您选择的语言,这可能意味着从头开始手动编写序列化/反序列化功能。

答案 1 :(得分:7)

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

答案 2 :(得分:2)

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

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

即。如果你有一个web请求来提取博客帖子列表,那么将整个对象列表缓存为一个memcached密钥更有利,而不是(这显然是一个有点不好的例子)缓存一系列缓存密钥该列表,与单独的memcached对象有关。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

这取决于这些数字是多少。例如,如果可以将它们分组到范围中,则可以优化存储。如果您可以将它们哈希,放入地图或哈希表并存储在memcached中序列化的地图将会很好。

无论如何,您可以保存许多小钥匙,只需确保将平板配置为具有小尺寸的块,这样您就不会浪费内存空间。