从memcache中检索数据

时间:2010-03-19 21:17:38

标签: php ruby-on-rails memcached

我开始学习memcache的好处,并希望在我的项目中实现它。我已经理解了大部分内容,例如如何通过密钥检索数据等等。

现在我知道我可以在memcache中放一个包含所有细节的帖子并调用键POST:123,这没关系,我可以为每个帖子做。

但是当我查询表posts以获取所有帖子的列表时,如何处理这个案例。这可以用memcache完成,还是应该从表中查询?

6 个答案:

答案 0 :(得分:3)

Memcache是​​一个键值缓存,正如您所描述的,它通常在您确切知道要检索的数据时使用(即,它不用于查询和返回基于未知结果的列表)在一些过滤器上。)

通常,目标不是用memcache调用替换所有数据库查询,尤其是在不需要优化的情况下。

假设数据不适合单个值,并且您确实需要快速访问表中的所有数据,您可以考虑根据一些块值将其转储到键中,如时间戳范围。

但是,最好是保留数据库查询或直接将其加载到内存中(如果我们讨论的是编写所有更新的单个服务器)。

答案 1 :(得分:1)

您可以使用名为“posts”的键,其值为“1,2,3,4,10,12”,然后更新,每次创建,更新,删除新帖子时都会检索它。

在任何情况下,memcached都不是数据库替代品,它是一个键/值存储(快速且可扩展)。因此,您必须决定在DB中存储哪些数据以及将哪些数据卸载到memcached。

或者您可以使用“cachemoney”插件,它将通过在内存中缓存AcriveRecord进行读/写(即使在memcached中)

答案 2 :(得分:1)

查看来自Twitter的cache_money gem。这个gem在ActiveRecord级别添加了缓存。 id的查找调用将通过缓存。您可以添加对表格中其他字段的索引支持(例如您的title

class Post < ActiveRecord::Base
  index :title
end

现在,按标题过滤的查找调用将通过缓存。

Post.all(:conditions => {:title => "xxxx"})

答案 3 :(得分:0)

基本上你应该做的就是首先检查缓存,看它是否有你需要的信息。如果缓存中没有任何内容(或者缓存的数据是陈旧的),那么您应该查询表并将返回的数据放在缓存中,并将其返回到前端。

这有帮助吗?

答案 4 :(得分:0)

您无法枚举memcached内容 - 它不是按照您尝试的方式设计的。您需要存储SQL查询的完整结果集而不是单个记录。

所以,是的:做一个SELECT title FROM posts并将结果存储在memcached中(例如POSTS:ALL_UNORDERED)。这就是它的设计方式。是的,如果查询像SELECT * FROM posts WHERE id = XX这样的单个记录,那么就存储它。请记住,为您执行的每个查询创建唯一的memcached密钥。

答案 5 :(得分:0)

据我所知,您无法查询多个键和值。但是,如果您需要经常访问相同的帖子列表,为什么不用memcache中的“帖子”等密钥存储它。