现在我们正在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?
一些链接
谢谢!是的,计算命中是我们要做的事情,所以我们有更多的数据来决定。你存储的实体或/和也是一块HTML? – fesja 2011-05-29 12:02:02
取决于场景...如果渲染成本高昂可能对缓存所有内容感兴趣,但除了在一般渲染中不适用(例如客户端渲染)的场景与DB访问相比便宜且快速之外,更便宜 – Kartones 2011-05-29 15:16:32