2012-03-14 90 views
2

我正在实现MVC应用程序中的视图级别上的缓存。该应用程序是一个自定义的PHP MVC +一些zend库,但我认为这个问题将适用于任何MVC堆栈。是否有使用索引或标记的缓存库

我想达到的是缓存,使部分/块而不是整个页面失效。 视图由布局组成,每个布局可以由块/部分组成,每个部分本身可以再次由部分组成。没有什么不寻常的。许多部分使用相同的数据,如果他们的数据更改都应该失效。以同样的方式,一些分部使用来自不同模型的数据,并且如果任何数据改变,应该使其失效。

我想实现的是一个系统,我不必回到我的模型来更改代码,只要创建新的部分或布局。我的想法是,如果每个缓存项目都可以“标记”,那么当我处于数据级别时,我可以简单地使用该标签使所有缓存项目失效。如果我然后创建一个新的部分,我只需要确保使用该缓存块中使用的所有标记对它进行标记。

我可以想象,你会存储一个索引缓存链接一个标签与所有相关CacheId的。

问题1:这样的图书馆是否存在?我不想重新发明轮子。
问题2:OR是否有不同的“最佳实践”,是我的推理有缺陷。

阐述:
对面这是接近我wan't实现来了,但是在PHP http://37signals.com/svn/posts/3112-how-basecamp-next-got-to-be-so-damn-fast-without-using-much-client-side-ui

我的问题是我怎么缓存键映射到数据,以便当数据更新我知道哪些缓存无效?缓存键设置在视图中,清除在模型中完成(onSave,onDelete)。模型如何知道应该删除哪些缓存?

例如:

以下是在视图缓存,每个生成用于检索的唯一密钥。

部分1:由用户Y
乘积x = partial1/x.id-y.id由用户Y
产物Z = partial1/z.id-y.id

我使用相同的用户再次,但这次征求意见

部分2:
评论一个由用户Y = partial2/a.id-y.id
由用户 注释b Y形= partial2/b.id-y.id

现在,如果我更新用户y,在onSave中,我无法知道所有依赖y的缓存部分。我可以,但是我必须检索所有缓存键,并且如果y在其中,则一个接一个地进行测试。

所以我的想法是,如果我保持一个地图,关键取决于y.id,我可以很容易地清除缓存而不必知道什么键被命名。视图级别填充索引,模型可以使用它来查找键并使这些缓存无效。所以在上面的例子中,创建缓存后,我将有以下指标:

x.id = [partial1/x.id-y.id] 
z.id = [partial1/z.id-y.id] 
a.id = [partial2/a.id-y.id] 
b.id = [partial2/b.id-y.id] 
y.id = [partial1/x.id-y.id, partial1/x.id-y.id, partial1/z.id-y.id, 
partial2/a.id-y.id, partial2/b.id-y.id] 

回答

0

我不知道你在哪里与标签故事会,你可能要稍微进一步解释。

但是,部分缓存可以使用服务器端包含(可以轻松由PHP处理)完成:只需使用<?include('cached/partial1.html')?>,其中partial1.html是从后端生成的缓存的html数据块。这样,您可以存储文章的文本,然后在编辑文章时更新html文件。

+0

我阐述的问题,希望这清除了我想要实现的。 – 2012-03-14 16:09:52

0

我建议一个简单的方法来缓存呈现的页面到文件,这可能会加速Apache的很多因素Apache是​​静态页面的理想选择。

缓存机制是这样的:

(1) No caching for POST requests 

(2) Save all rendered pages for GET requests, save to files, eg. 
$Cache_File = "cache/".md5($_SERVER["REQUEST_URI"]).".html"; 

(3) Up on a new GET request, get the md5 of URI, 
then check if file existing in cache, take it out and 
flush to browser. 
+1

这适用于基本上静态的网站,但是如果数据不断变化,您要么有陈旧的缓存,要么必须经常清除缓存,这样做的好处不大。我已经添加了一个我想要的例子的链接,它最好地解释了它 – 2012-03-14 16:13:10

相关问题