2011-03-27 72 views
11

我喜歡memcached如何工作。您可以使用它存儲數據塊以提高網站性能。當你想檢索一些數據時,你首先檢查它是否在memcached中,如果是的話,那麼你檢索它,否則你檢查你的數據庫/文件系統等。何時使用memcached

我只是不知道如何/何時使用它?什麼會是一個好機會?

我有以下表格:

作者:

ID的用戶名郵箱密碼鹽 email_salt email_verified IP_ADDRESS

Author_threads:

的thread_id,AUTHOR_ID

主題:

ID,標題,內容,創造

標籤:

ID,名稱

Thread_tags:

tad_id,THREAD_ID

我想選擇最新的30個線程,它們的作者和他們所有的標籤。這是在SQL語句中使用:

 SELECT thread.title, thread.id as thread_id, 
     thread.content, author.username, author.id as author_id, 
     GROUP_CONCAT(DISTINCT tag.name ORDER BY tag.name DESC SEPARATOR ',') AS tags 
     FROM thread 
     JOIN thread_tags ON thread.id = thread_tags.thread_id 
     JOIN tag ON thread_tags.tag_id = tag.id 

     JOIN author_threads ON thread.id = author_threads.thread_id 
     JOIN author ON author_threads.author_id = author.id 

     GROUP BY thread.id DESC 
     LIMIT 0, 30 

這是我使用PHP:

function get_latest_threads($link, $start) 
{ 

    $start = minimal_int($start); 

    $threads = sql_select($link, "SELECT thread.title, thread.id as thread_id, 
           thread.content, author.username, author.id as author_id, 
           GROUP_CONCAT(DISTINCT tag.name ORDER BY tag.name DESC SEPARATOR ',') AS tags 
           FROM thread 
           JOIN thread_tags ON thread.id = thread_tags.thread_id 
           JOIN tag ON thread_tags.tag_id = tag.id 

           JOIN author_threads ON thread.id = author_threads.thread_id 
           JOIN author ON author_threads.author_id = author.id 

           GROUP BY thread.id DESC 
           LIMIT $start, 30" # I only want to retrieve 30 records each time 
         ); 

    return $threads; 

} 

在哪裏/如何將memcached的是使用嗎?

回答

9

我只是不知道如何/何時使用它?

使用它,只有當你有證明,添加緩存最好的性能提升,你可以得到。將數據緩存或輸出緩存添加到先前沒有任何緩存的複雜應用程序可以發現大量微妙的錯誤和奇怪的行爲。

Use a code profiler first。找出你的代碼在真實的性能問題。找出瓶頸並加以解決。如果該修復涉及緩存,那就這樣吧,但首先收集證據

+1

非常感謝使用代碼分析器的想法。 – kta 2015-01-22 23:18:39

1

最新線程列表可能會被很多網站用戶請求,所以使用memcached緩存整個SQL結果聽起來像是一個絕好的機會。

memcached的一個非常簡單的方法是使用SQL查詢作爲鍵和它們各自的結果作爲值(i.e. see this tutorial here)。您可能希望首先在所有高頻數據庫查詢上進行嘗試,並在開始進一步優化之前對結果進行分析。

+0

不是SQL做這種類型的查詢緩存已經?或者緩存失效時間很短? – Tesserex 2011-03-27 19:06:31

1

關於何時使用它沒有設置指南。您必須找出哪些數據庫查詢最常見和/或成本最高,並對其進行緩存。在你的情況下,我可能會緩存該函數調用的結果。

在哪裏我會感到困惑(因爲你可能)是什麼做新線程創建。每次有人創建一個線程時,您的查詢會給出不同的結果。所以在這種情況下,當有人創建一個線程時,你應該做的是更新數據庫,然後通過踢出最舊線程並添加新線程來調整緩存中的結果集。您甚至不需要從緩存中重新加載最新的30個線程,因爲它將被更新。