2011-05-29 95 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中的數據大小分佈來決定選擇哪種實現。

相關問題