2010-09-14 51 views
1

让我们想象我们有类别A的博客。类别A目前在100页上有1000个帖子。所有页面都缓存在文件中(例如,由Smarty模板引擎缓存)。我正在添加帖子,并希望它立即显示在第一页上。因此,我必须为所有100个类别A的页面清除或无效缓存。当添加新帖子时,使缓存的类别页面(第1页,第2页等)无效?

删除缓存页面并不是一个好主意,因为我们可能有太多文件(例如,数千页)。我认为根据请求无效缓存和重新生成页面是非常有效的方法。

我唯一的想法是将number of posts in category添加到缓存ID。因此,首先我们应该获得类别中的帖子数量(例如,从memcache),然后检查此数字是否有效。

一切看起来很好,很简单。但是,让我们想象一下当我添加新帖子时的情况,然后在1分钟后删除另一个(旧的)帖子。帖子数量仍然为1000,某些类别页面会保持旧的状态(如果在此1分钟内没有查看它们)。

解决方案是什么?

PS:对不起我的英文,但我认为我的问题将从已经遇到这种问题的人那里清楚。

谢谢

回答

0

邮件数量是不是因为当你编辑你想刷新缓存以及一些后一个很好的解决方案。

的策略情侣我能想到的:

  • 当一个改动是作为参考使用时间。

当新帖子被添加(删除,编辑) - 将当前时间戳存储在类别中,我们称之为cache_threshold。请求页面时 - 检查此页面何时被缓存。如果它超过我们的阈值 - 页面需要重新生成。

  • 切换到对象缓存而不是页面缓存。

而不是缓存整个页面,您可以缓存每个单独的帖子。如果添加新帖子(删除,编辑),您只需立即重新生成缓存,因为它不耗费时间。为了显示页面,您只需获取所需数量的缓存帖子并显示它们即可。

该解决方案需要更多的工作,但它更灵活有效。

+0

我在我的应用程序中有2级缓存。第一级缓存对象(我为此使用memcache或redis),第二级缓存是缓存页面的部分(它有助于避免执行大量的PHP代码来构建页面)。你对last_update_timestamp的想法在我看来很简单,很好!谢谢。 – Kirzilla 2010-09-15 19:58:43

相关问题