【发布时间】:2011-09-04 05:42:10
【问题描述】:
现在我们正在 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);
}
...
优点:
- 更简单
缺点:
- 如果我更改单个项目,我必须删除所有缓存(这可能会很痛苦)
- 我的结果可能重复(不同查询中的相同项目)
对
存储每个项目
$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 上存储两次相同的项目
- 更容易使多个查询的结果无效(只是我们更改的项目)
缺点:
- 更复杂的业务逻辑。
你怎么看?每种方式还有其他优点或缺点吗?
一些链接
【问题讨论】:
标签: memcached