在PHP中获取Memcache项目的过期时间?

4
我正在网站上缓存推文(30分钟过期时间)。当缓存为空时,第一个发现的用户将重新填充它。
然而,在那个时候,Twitter API可能会返回200。在这种情况下,我想延长之前的数据30分钟。但是之前的数据已经丢失了。
所以,我希望在过期时间前5分钟就重新填充缓存,这样我就不会丢失任何数据。
那么,在使用php的memcache ::get()时,如何知道项目的过期时间?
另外,有更好的做法吗?
3个回答

5
在这种情况下,难道这不是更好的逻辑吗?
  • 如果缓存超过30分钟,请尝试从Twitter获取
  • 如果成功检索到新数据,则覆盖缓存
  • 无限期地缓存数据(或比您打算缓存的时间长得多)
  • 在单独的键中记录缓存上次更新的时间(当前时间)
  • 反复执行此操作
重点是,只有在有新数据时才替换数据,不要让旧数据自动丢失。

是的,那是做法,但最近我追求完美,认为实际上读取缓存的过期时间而不必设置单独的键会更好。但你是对的,因为现在我知道我不会丢失数据。所以虽然你回答了我应该做什么的问题,但这并没有回答帖子中真正的问题(现在已经不相关了)。我仍然会将你的答案标记为正确的,但如果这是stackoverflow的行为,请让我知道。 - Jonatan Littke
这并没有回答他的问题:那么,在使用php的memcache :: get()时,我如何知道项目的过期时间?答案是你不能。php memcache模块没有这个能力。 - Brént Russęll

1
不要将关键数据存储在Memcached中,它不能保证任何东西。
如果您总是需要获取“最新的好”缓存 - 您需要将数据存储在任何持久性存储中,例如数据库或平面文件。
在这种情况下,如果在缓存中找不到任何内容 - 您可以进行Twitter API请求。 如果失败 - 从持久存储读取数据。 在另一个HTTP请求中,您将再次执行相同的迭代。
或者,您可以将来自持久存储的数据放入具有相当短寿命的Memcache中。 例如几分钟(1-5)以让Twitter服务器有时间变得健康。 过期后,重复请求。

很高兴看到处理Twitter API获取数据失败的异常。 - kta

0
当你将数据放入memcache时,你也要设置缓存的有效时间。理论上,你还可以设置缓存创建的时间和过期时间。在从缓存中获取数据后,你可以始终验证距离缓存过期还有多少时间,并决定要做什么。
但是,让缓存在用户访问时重新填充仍然存在一定的风险 - 假设你想在缓存到期前约5分钟重新填充缓存 - 突然在缓存到期前6分钟没有访问者进来 - 那么缓存仍然会过期,没有人会导致它重新填充。如果你想始终确保缓存条目存在 - 你需要定期进行检查 - 例如制作一个定时任务来进行缓存检查和填充。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接