2012-04-22 115 views
1

我看了一下Memcached的衆多導遊,然而,幾件事情還不清楚對我說:Memcached的鍵:一些澄清需要

1)我見過很多例子,看或多或少是這樣的:

$sql = "SELECT `name` FROM `users` WHERE `id` = 1;"; 
$memcache->set(md5($sql), $sql, false, 60); 
$memcache->get(md5($sql)); 

然而,我有限的內存緩存的知識,我在這裏看到一個嚴重的缺陷:我不能用同樣的方法將數據存儲與INSERT/UPDATE請求爲,在技術上,這將導致不同的哈希

作爲解決方案我想我可以使用這樣的東西:cre在一個類/功能,將執行以下操作:

class db { 
function insert($sql, $ttl, $key) { // $key would be the name of the key I would manually generate for each query. To maintain uniqueness for each user where needed, could be user_id_keyname 
    $memcache->set($key, $sql, false, $ttl); 
    mysql_query($sql); 
} 


function sel($sql, $ttl, $key) { 
    if ($memcache->get($key)) then return $memcache->get($key); 
    else { 
    $memcache->set($key, $sql, false, $ttl); 
    return mysql_query($sql); 
    } 

難道這是一個適當的方法來解決我的問題?真的很希望看到關於代碼的任何評論。 } }

回答

3

爲什麼要緩存INSERT/UPDATE查詢的結果?使用SELECT查詢的md5散列沒有任何問題,因爲您不需要任何其他信息來唯一標識結果集。您只想緩存來自SELECT查詢的結果,因此您不必一直檢索數據庫中的數據。當你更新數據時,你不想鬆開它,所以你必須將查詢發送到數據庫。

您的示例中還存在另一個問題。您實際上不會將任何查詢結果存儲在緩存中。您只存儲無用的SQL查詢。

+0

謝謝你的回覆。我想要存儲'INSERT/UPDATE'請求的原因只是保持緩存是最新的。換句話說,無論緩存是否過期,如果MySQL條目已更新,緩存也會更新。我對於memcache的工作原理知之甚少,因此我迄今爲止閱讀的指南似乎有些太抽象,以至於我無法理解。 – 2012-04-22 14:49:12

+1

這實際上不是緩存設計的目的:整個想法是,您可以多次重複使用SELECT查詢的輸出。也就是說,緩存用於確保您的服務器不必運行相同的查詢兩次。然而,在你的情況下,它必須運行相同的查詢兩次,因爲輸出應該是新鮮的。你可以做的是使任何你知道受到'INSERT' /'UPDATE'查詢影響的memcached密鑰無效,這意味着你的網站將始終得到最新的結果。但這樣做確實意味着您的網站不太適合緩存。 – Daan 2012-04-22 15:13:01

+0

這是爲什麼?如果原始條目未更新,它仍會使用緩存的結果。此外,我正在考慮Memcache的** prime原因是我使用MySQL的多語言(因爲據我瞭解,.PO文件將加載整個網站的字符串,而MySQL查詢可以做索引搜索) – 2012-04-22 18:45:28