現在我們正在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