我从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找到一些帮助。
答案 0 :(得分:0)
根据评论:
Sakuraba,它支持Active Record。
belongs_to :project, touch: true
表示当todolist为。时,项目将自动更新updated_at。
您需要在自己的设置中实现这种依赖系统。
答案 1 :(得分:0)
我的最新帖子列表如何知道是否有任何帖子被删除,更改或插入新帖子?
简单来说,他们不能 - 缓存的问题是你故意提供旧数据。当然,有时候没关系。
但是,您可以使一些缓存无效。因此,如果您重写单个帖子,则应该使其缓存无效,以便下次查看时它会重新缓存新数据。像这样的单品很容易。
但是如果你有一个包含大量数据的缓存(比如分页屏幕的缓存版本,比如最新帖子,每页一个缓存项目)那么它往往太尴尬/更新其中的单个表行很慢。如果是这样,那么最好将这个屏幕提供给未屏蔽的。但如果最新帖子只包含最后10个项目,则为此整个缓存无效并重新绘制。
你可以让这个页面的缓存副本包含每个表行的缓存项(即更大的缓存表中的几个缓存行);但是,缓存区域越小,获得的好处就越少。但这肯定会让自己只有一行无效。