【问题标题】:Get expiration time of a memcache item in php?在 php 中获取 memcache 项的过期时间?
【发布时间】:2011-01-27 14:14:32
【问题描述】:

我正在我的网站上缓存推文(过期时间为 30 分钟)。当缓存为空时,第一个找到的用户将重新填充它。

但是,那时 Twitter API 可能会返回 200。在这种情况下,我想将之前的数据再延长 30 分钟。但是之前的数据已经丢失了。

因此,我想考虑重新填充缓存,例如在到期时间前 5 分钟,这样我就不会丢失任何日期。

那么在使用php的memcache::get()时如何知道一个item的过期时间呢?

另外,有没有更好的方法来做到这一点?

【问题讨论】:

    标签: php memcached


    【解决方案1】:

    那样的话,这不是更好的逻辑吗?

    • 如果缓存超过 30 分钟,请尝试从 Twitter 拉取
    • 如果新数据检索成功,覆盖缓存
    • 无限期缓存数据(或者比您打算缓存的时间长得多)
    • 请注意上次更新缓存的时间(当前时间)在单独的键中
    • 冲洗,重复

    重点是,只有用新的数据才能替换,不要让旧数据被自动丢弃。

    【讨论】:

    • 是的,这就是这样做的方法,但是最近我认为它会更好地读取缓存的到期时间,而不必为其设置单独的密钥。但你是对的,因为现在我知道我不会丢失数据。因此,尽管您确实回答了我应该做什么的问题,但这并不能回答线程中的真正问题(现在无关紧要)。我仍然会将您的答案标记为正确,但如果这是 stackoverflow 行为,请告诉我。
    • 这并没有回答他的问题:那么在使用php的memcache::get()时如何知道一个item的过期时间呢?答案是你不能。 php memcache 模块没有这个能力。
    【解决方案2】:

    不要将关键数据存储在 memcached 中。它什么都不保证。

    如果您总是需要获得“最新的好”缓存 - 您需要将数据存储在任何持久性存储中,例如数据库或平面文件。

    在这种情况下,如果在缓存中没有找到任何东西 - 你执行 twitter api 请求。如果失败 - 你从持久性中读取数据。在另一个 http 请求中,您将再次进行相同的迭代。

    或者您可以将数据从持久性存储到内存缓存中,并且生命周期非常短。例如几分钟(1-5)让推特服务器有时间恢复健康。并在过期后 - 重复请求。

    【讨论】:

    • 很高兴看到处理 twitter api 获取数据失败的异常。
    【解决方案3】:

    当您将数据放入内存缓存时 - 您还设置了缓存的有效时间。所以理论上你也可以设置缓存的创建时间和/或缓存过期的时间。稍后从缓存中获取后,您始终可以验证距离缓存过期还有多长时间并决定您想要做什么。

    但是让缓存在用户访问时重新填充在某些时候仍然存在风险 - 假设您想在缓存到期前约 5 分钟重新填充缓存 - 突然间将没有访问者进入最后 6缓存过期前几分钟 - 然后缓存仍将过期,没有人会导致它被重新填充。如果您想始终确保缓存条目存在 - 您需要定期进行检查 - 例如 - 制作一个执行缓存检查和填充的 cronjob。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2017-02-13
      • 2013-11-20
      相关资源
      最近更新 更多