【问题标题】:memcached expiration timememcached过期时间
【发布时间】:2010-11-01 08:36:10
【问题描述】:

Memcached 提供缓存过期时间选项,指定对象在缓存中保留多长时间。 假设所有写入都通过缓存我不明白为什么人们会想要从缓存中删除一个对象。换句话说,如果所有的写操作都在 DB 之前更新缓存,那么缓存永远不会包含一个过时的对象,那为什么要删除它呢?

一个可能的论点是,如果从不删除对象,缓存将无限增长,但 memcached 允许您指定最大大小。一旦达到这个大小,memcached 就会使用最近最少使用 (LRU) 算法来确定要删除哪些项目。总而言之,如果配置了合理的最大大小,并且所有写入都通过缓存,那么为什么要在一定时间后使对象过期?

谢谢, 唐

【问题讨论】:

    标签: language-agnostic caching memcached


    【解决方案1】:

    当您不需要精确信息时,到期时间很有用,您只希望它在特定时间内准确无误。因此,您将数据缓存(例如)五分钟。当需要数据时,检查缓存。如果它在那里,请使用它。如果不是(因为它已过期),则重新计算该值。

    某些缓存值基于大量数据,使缓存无效或向其写入新值是不切实际的。这通常适用于汇总数据或从大量原始数据中计算得出的数据。

    【讨论】:

      【解决方案2】:

      当我第一次开始使用 memcached 时,我自己也对此感到好奇。我们询问了在 hi5 和 facebook 工作的朋友(都是 memcached 的重度用户)。

      他们都说他们通常使用 3 小时的默认过期时间作为“以防万一”。

      1. 对于大多数对象,每 3 小时重建一次并没有那么昂贵
      2. 万一您遇到了一些错误,该错误会导致本不应该的内容保持缓存,这可以避免您陷入太多麻烦

      所以我猜到了“为什么?”这个问题的答案。真的是,“为什么不呢?”。在那里设置过期时间不会花费你太多,而且它可能只会帮助确保你不会在缓存中保留陈旧的数据。

      【讨论】:

        【解决方案3】:

        一种情况是值仅在特定时间段内有效。

        【讨论】:

        • 如,总结我们在过去 3 小时内的网站流量或销售额。将您的 memcache 过期时间设置为 3 小时,并在缓存中找不到时自动计算,您不必担心代码中的时间。或者它可能是某种临时密码或令牌。 (Objects 的观点很好,但我觉得可以举一些例子。)
        【解决方案4】:

        缓存中的一些数据创建起来很昂贵但很小(应该持续很长时间),有些数据很大但相对便宜(应该持续更短的时间)

        此外,对于大多数应用程序来说,很难让 memcached 作为直写缓存工作。很难正确地使所有缓存无效,尤其是那些渲染页面。大多数用户会错过一些。

        【讨论】:

          【解决方案5】:

          我们一直在考虑相同的问题,这就是 memcached wiki 上的内容“即使您正在主动删除或覆盖缓存的数据,您仍然希望缓存偶尔过期。以防您的应用程序有错误、崩溃、网络中断或缓存可能不同步的其他问题。”

          这是有道理的,因为我们无法为网络故障做计划,如果我们每天、每两周或每周发布代码就变得很重要。我们的一个想法是每次发布都重新启动 memcached 服务器,但如果有 10 个或更多 memcached 服务器,那将变得非常痛苦。我认为最简单的方法是为对象设置过期时间。

          【讨论】:

            【解决方案6】:

            我会说这是关于“最近最少使用”和“不再使用”之间的区别......如果您可以明确指出哪些对象可以从缓存中取出,那么就会为对象留出更多空间以后可能还会用到。

            【讨论】:

            • 我读过一些说法,有时未过期的密钥实际上可能会在过期密钥之前从缓存中删除——这是为了保持 LRU 缓存清除算法的效率而做出的牺牲。换句话说,“最近最少使用”和“不再使用”之间没有区别。过期的密钥在过期时实际上并没有被删除——但它们在下次收到获取请求时被清除。因此,简而言之,设置过期实际上并不一定有助于为未过期的密钥“留出更多空间”。
            【解决方案7】:

            如果您的设计需要直写式缓存,您仍然会遇到分配给 memcached 的内存限制的问题,而这正是 LRU 发挥作用的地方。

            LRU 在确定踢出什么时有两条规则,并按以下顺序执行:

            1. 过期的平板
            2. 最旧的未使用平板

            为不同的对象组提供不同的到期日期可以帮助将访问频率较低的数据保留在内存中的成本更高,同时允许更频繁使用的、可能仍会到达队列末尾但很容易的slab重新创建,过期。

            许多缓存键最终变成其他对象的聚合也是这种情况,除非您为这些对象使用查找哈希,否则让对象在几个小时后过期比主动更新所有对象要容易得多关联的键,并且它还保留了您通过首先使用 memcached 有效争夺的命中/未命中率。

            【讨论】:

              【解决方案8】:

              有几个原因:

              1. 数据存储在服务器重新启动之间不持久。重启或重新加载缓存服务器后,您将不得不重新生成大量缓存数据。
              2. 在某些情况下,当对象更新时您不会收到通知。例如。 API 返回的用户详细信息。
              3. 搜索对象。 SQL 提供了使用相同的数据来生成不同的结果,具体取决于最近和最多投票等要求。您将不得不使用不同的缓存键来存储这些不同结果的数据(数据重复,即使更新所有相关键也很头疼单个公共基准更改)。此外,借助数据库服务器,您可以更灵活地浏览数据(自定义统计信息等)。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-10-24
                • 2013-08-07
                • 2011-08-22
                • 1970-01-01
                • 2011-04-10
                • 1970-01-01
                相关资源
                最近更新 更多