2011-05-29 98 views
0

现在我们正在Memcache上存储一些查询结果。在进一步调查之后,我看到很多人将每个单独的项目保存在Memcache中。这样做的好处是他们可以在任何其他请求中从Memcache获取这些项目。我应该在Memcache中存储一个数组还是单个项目?

存储阵列

$key = 'page.items.20'; 
if(!($results = $memcache->get($key))) 
{ 
    $results = $con->execute('SELECT * FROM table LEFT JOIN .... LIMIT 0,20')->fetchAll(); 
    $memcache->save($results, $key, 3600); 
} 
... 

优点:

  • 更容易

缺点:

  • 如果我改变个别项目,我必须删除所有缓存(这可能是一个痛苦)
  • 我可以有重复的结果(在不同的查询同一项目)

VS

商店每个项目

$key = 'page.items.20'; 
if(!($results_ids = $memcache->get($key))) 
{ 
    $results = $con->execute('SELECT * FROM table LEFT JOIN .... LIMIT 0,20')->fetchAll(); 

    $results_ids = array(); 
    foreach ($results as $result) 
    { 
     $results_ids[] = $result['id']; 
     // if doesn't exist, save individual item 
     $memcache->add($result, 'item'.$result['id'], 3600); 
    } 

    // save results_ids 
    $memcache->save($results_ids, $key, 3600); 
} 
else 
{ 
    $results = $memcache->multi_get($results_ids); 
    // get elements which are not cached 
    ... 
} 
... 

优点:

  • 我没有在Memcache上存储两次相同的项目
  • 更容易失效几个查询结果(只是我们改变项)

缺点:

  • 更复杂的业务逻辑。

您怎么看?每种方式上的其他PROS或CONS?

一些链接

回答

1

获取统计数据并尝试计算命中率或可能的改进,如果您缓存完整查询与在MC中执行单个项目抓取。剖析这种代码对于实际了解您的理论如何应用也非常有帮助。

这取决于查询的功能。如果您拥有一组用户,然后想要与其中一些朋友一起获得“前10名音乐亲和力”,那么有两种方法值得: - 每个朋友(实际上,该网站的每个用户) - 前10个查询为每个用户(空间比CPU时间便宜)

但总的来说,它是值得存储在MC所有个人实体将要频繁使用(无论是在相同的代码执行,或在随后的请求或其他用户)。然后像CPU或资源大量查询和数据处理的东西要么是MC,要么是委托它们进行异步处理。而不是实时制作(例如,前10位网站用户不需要实时,可以每小时或每天更新)。 当然,考虑到如果您存储和MC个别实体,您必须从数据库中删除所有参照完整性,以便能够单独或成组地重复使用它们。

+0

谢谢!是的,计算命中是我们要做的事情,所以我们有更多的数据来决定。你存储的实体或/和也是一块HTML? – fesja 2011-05-29 12:02:02

+1

取决于场景...如果渲染成本高昂可能对缓存所有内容感兴趣,但除了在一般渲染中不适用(例如客户端渲染)的场景与DB访问相比便宜且快速之外,更便宜 – Kartones 2011-05-29 15:16:32

0

的问题是主观的,议论......

这取决于你的使用模式。如果您不断通过ID拉取单个节点,请分别存储每个节点。

另外,请注意,在任何情况下,存储列表并不是全部有用,除了前20位。如果您以前20位不再有效的方式插入/更新/删除节点,你最终可能需要刷新下一个20,等等。

最后,请记住它是一个缓存。如果您使用的是缓存,那么您可以做出基本声明,如果您输出的数据稍微陈旧,则没有什么大不了的。

+0

当然,它只会用于不同查询的前N个。关于缓存,它取决于我们拥有的元素的数量。例如,如果我们要求前10名,而我们只有5名;下次我添加一个新项目时,我希望该缓存过期,因此我可以显示6(如果没有,用户会觉得出现问题)。 – fesja 2011-05-29 11:50:06

0

memcached以特定大小的块存储数据,如下面的链接中所述。

http://code.google.com/p/memcached/wiki/NewUserInternals

如果memcached的数据分布是大的,那么大的大小的块的数量会更少,因此最近最少使用算法将推动数据出来,即使他们是在其它块可用空间大小。最近最少使用的算法适用于各个组块。 您可以根据memcached中的数据大小分布来决定选择哪种实现。

相关问题