【问题标题】:Memcached best practices - small objects and lots of keys or big objects and few keys?Memcached 最佳实践 - 小对象和大量键还是大对象和少量键?
【发布时间】:2009-01-13 02:25:44
【问题描述】:

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

【问题讨论】:

    标签: memcached


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

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

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

              【讨论】:

                猜你喜欢
                • 2017-12-13
                • 2015-09-18
                • 1970-01-01
                • 2012-07-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多