使缓存和所有引用无效

时间:2012-03-14 17:48:52

标签: php caching memcached

我从37个信号(here)中找到了标题为How Basecamp Next got to be so damn fast without using much client-side UI的文章,但无法理解缓存无效的方式。

让我们说:

我有一个post对象,数组形式如下:

$post = array(
    'id' => 3232,
    'title' => 'Test Post'
)

我使用名为post-3232的缓存键将其保存在缓存中。我有一个latest posts数组,如下所示:

$latest = array(
    array(
        'id' => 3232,
        'title' => 'Test Post'
    ),
    array(
        'id' => 3233,
        'title' => 'Test Post 1'
    ),
    array(
        'id' => 3234,
        'title' => 'Test Post 2'
    )
)

我使用缓存键将此列表保存在缓存中:latest-posts-140320121947

我的最新帖子列表如何知道是否有任何帖子被删除,更改或插入新帖子? 我无法从文章中找出答案。也许我可以从StackOverflow找到一些帮助。

2 个答案:

答案 0 :(得分:0)

根据评论:

  

Sakuraba,它支持Active Record。 belongs_to :project, touch: true表示当todolist为。时,项目将自动更新updated_at。

您需要在自己的设置中实现这种依赖系统。

答案 1 :(得分:0)

  

我的最新帖子列表如何知道是否有任何帖子被删除,更改或插入新帖子?

简单来说,他们不能 - 缓存的问题是你故意提供旧数据。当然,有时候没关系。

但是,您可以使一些缓存无效。因此,如果您重写单个帖子,则应该使其缓存无效,以便下次查看时它会重新缓存新数据。像这样的单品很容易。

但是如果你有一个包含大量数据的缓存(比如分页屏幕的缓存版本,比如最新帖子,每页一个缓存项目)那么它往往太尴尬/更新其中的单个表行很慢。如果是这样,那么最好将这个屏幕提供给未屏蔽的。但如果最新帖子只包含最后10个项目,则为此整个缓存无效并重新绘制。

可以让这个页面的缓存副本包含每个表行的缓存项(即更大的缓存表中的几个缓存行);但是,缓存区域越小,获得的好处就越少。但这肯定会让自己只有一行无效。