2010-04-08 50 views
6

我正在使用PDO連接到我想要實現memcached的系統中的數據庫。我如何設計一個使用PDO和memcached的緩存系統?

我不知道什麼鍵用於緩存結果,因爲我無法獲得PDO的最終查詢字符串(因爲準備好的語句)。

解決此問題的好主意?

在此先感謝。

+0

你找到任何可以幫到你的東西嗎? – 2014-02-22 12:38:02

回答

7

如果你只是去直接緩存查詢結果基於查詢字符串,Mysql的查詢緩存已經爲你做了這個。不要重新發明輪子。一個潛在的不同點是Mysql的查詢緩存被強制無效,因此不會返回陳舊(過期,不正確)的數據;取決於您如何處理失效,您的策略可能會進一步減少數據庫負載,但需要定期提供陳舊,過時的數據。

此外,當更新發生時,您將無法真正地選擇性地終止各種緩存鍵(當插入/更新運行時,如何知道哪些查詢字符串應該過期?因此您只需設置一個短暫的到期時間(可能以秒爲單位),以最小化服務陳舊數據的時間。這可能意味着低緩存命中率。最後,您所描述的緩存策略實施起來很簡單,但效率不高。

請務必閱讀memecached FAQ的"Generic Design Approaches" section。一個好的緩存策略會在發生更新時立即刪除/替換緩存的數據 - 這允許您將數據緩存數小時/天/周,並且不會爲用戶提供過時數據。

+1

你說得對。 我的問題沒有意義。 謝謝! – Castro 2010-04-08 14:52:25

1

這裏是有趣的教程可能會有所幫助 - http://techportal.inviqa.com/2009/02/16/getting-started-with-memcached/

我想你可以通過實現這樣的功能自動執行的過程:

function query($name, $sql, $params, $db, $cache) { 
    $result = $this->cache->get($name); 

    if (!$result) { 
     $stmt = $db->prepare($sql); 
     $exec = $stmt->execute($params); 
     $result = $stmt->fetch(PDO::FETCH_ASSOC); 

     $cache->add($name, $result); 
    } 

    return $result; 
} 
+0

是的,我在想更透明的東西(我不想命名每個查詢),我想我會散列查詢連接其餘的參數。你怎麼看? – Castro 2010-04-08 14:47:44

+5

從$ sql + params構建緩存鍵非常簡單 - 只需將此行添加到Ivo函數的頂部,並移除$ name參數:'$ name ='querycache-'。 md5(serialize(array($ sql,$ params)));' – 2010-04-08 14:51:30