是否有使用索引或标记的缓存库

时间:2012-03-14 09:22:48

标签: php model-view-controller caching tags indexing

我正在努力在MVC应用程序中的视图级别实现缓存。该应用程序是一个自定义的php MVC +一些zend库,但我认为这个问题适用于任何MVC堆栈。

我想要实现的是使部分/块无效而不是整页的缓存。 视图由布局组成,每个布局可以由块/部分组成,每个部分本身也可以由部分组成。没有什么不寻常的。许多部分使用相同的数据,如果数据发生变化,则所有部分都应该无效。同样地,一些部分使用来自不同模型的数据,并且如果任何数据发生变化则应该无效。

我想要实现的是一个系统,无论何时创建新的部分或布局,我都不必回到我的模型来更改代码。我的想法是,如果每个缓存项都能以某种方式被“标记”将会很棒,所以当我处于数据级别时,我可以简单地使用该标记使所有缓存项无效。如果我然后创建一个新的partial,我只需要确保使用该缓存块中使用的所有标记来标记它。

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

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

精化:
刚刚遇到这个接近我想要实现的东西,但是在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部分:
     产品x由用户y = partial1 / x.id-y.id
     产品z由用户y = 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]  

2 个答案:

答案 0 :(得分:0)

我不知道你在哪里使用标签故事,你可能想要进一步解释。

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

答案 1 :(得分: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.