处理缓存动态数据

3
我正在使用一个名为Quickcache的PHP插件,它可以提供完整的网页缓存。虽然它工作得很好,但我的问题是我的网站是动态的,当开启缓存时,某些内容无法按照我想要的方式更新。
例如,如果用户登录,即使对于服务器而言该用户已登录(我可以进入网站的非缓存部分,它仍能显示用户已登录),登录框仍会出现。更改用户设置等情况也是如此。
我也不能每次用户登录或更改微小设置时都清除缓存,这样会过度消耗资源。
似乎我无法使用缓存,因为它会使网站无法使用,而如果不使用缓存,在任何可感知的负载下网站都将无法使用。
我应该如何解决这个问题?我对缓存还很陌生,这是我第一次为生产环境推出自己的网站。其他人肯定也遇到并解决了类似的问题。
4个回答

8

我不是php专家,但我可以告诉你关于缓存的事情。

动态网站按用户生成内容是最棘手的,但是可以做到。这将需要您查看应用程序中数据流以确定如何、在哪里以及什么要缓存。以下是一些指南:

  • 每个用户或每个页面都不变的数据 - 缓存在应用程序内存中,并抓取它而不是访问数据库。
  • 每个用户更改但每页不变的数据 - 在用户会话中缓存
  • 每页更改但每个用户不变的数据 - 使用页面名称作为键,在应用程序内存中进行缓存
  • 每个用户和每页都更改的数据 - 使用页面名称作为键在会话中进行缓存
  • 每个页面请求唯一的数据 - 不要缓存。

不仅来自数据库的数据可以缓存。如果您有一块复杂逻辑来操作数据,请考虑缓存该逻辑的输出。


在浏览器的上下文中,“应用程序内存”是什么意思? - Hashim Aziz

1

你的网站一开始就有这么多流量,你真是太幸运了,不是吗?

我不确定这个特定的工具“Quickcache”是如何工作的,但从概念上讲,你需要一个顶层的PHP文件,并包含可以被缓存的部分,这样你就可以从缓存副本中加载半静态部分,而每次加载包含动态内容的顶级文档。我相信Smarty允许你使用模板来实现这一点。对于简单的情况(以及一些不那么简单的情况),我通常编写自己的代码。

然后根据需要仅清除包含文件的缓存,例如每天通过cron或由管理更新触发的代码更改值。


0

你使用的库文档很差,我找不到好的资料。

但是我建议你使用自己的缓存系统,例如使用Zend_Cache库(如果你正在使用这个框架)。你可以决定缓存什么以及如何缓存,这基本上是你可以实现的最佳效果。

页面加载后,你将检查缓存中的页面,如果存在,则使用它。

这是我能提出的最好的方法,因为你不想缓存一些动态操作(路由)。你可以简单地从你将要制作的缓存系统中排除它们。我正在处理复杂查询的类似事情,但你可以缓存所有东西。并且在你更改页面上的某些内容后,你可以刷新缓存。


0

很抱歉重新激活一个旧帖子,但是在阅读后,我觉得原帖的问题仍然非常相关。

据我所知,您在这里遇到的是个性化和新鲜度问题,这是处理动态网站时非常普遍的问题。

您需要做的是:

A. 监控内容使用情况,以识别经常重新提供(但未缓存)的动态对象。请注意,识别绝对(100%)不变的对象将有助于避免与个性化相关的问题,因此您需要确保使用交叉验证、坚如磐石的方法...(即检查大小,直至字节)

B. 一旦找到好的“潜在候选人”,通过覆盖/创建新的HTTP指令来使其可缓存。

C. 继续监视内容使用情况,定期重新加载新版本(通常)并将其与当前缓存的对象进行比较,以保持其新鲜。

这就是要点。类似“学习”缓存机制的描述可以在此处找到:Dynamic Caching

内部使用了类似的学习启发式算法来缓存动态内容,并且刷新频率为5分钟。

GL。


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