Когда использовать memcached - PullRequest
11 голосов
/ 27 марта 2011

Я понимаю, как работает memcached. Вы используете его для хранения фрагментов данных для повышения производительности сайта. Когда вы хотите получить некоторые данные, вы сначала проверяете, есть ли они в memcached, если это так, то вы извлекаете их, в противном случае вы проверяете свою базу данных / файловую систему и т. Д.

Я просто не знаю, как / когда его использовать? Что было бы хорошей возможностью?

У меня есть следующие таблицы:

Автор:

id логин пароль пароль соль email_salt email_verified ip_address

Author_threads:

thread_id, author_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 здесь?

Ответы [ 3 ]

9 голосов
/ 27 марта 2011

Я просто не знаю, как / когда его использовать?

Используйте его только после того, как доказано , что добавление кэширования лучшееповышение производительности вы можете получить .Добавление кэширования данных или выходного кэширования в сложное приложение, которое ранее не имело никакого вида кэширования, может обнаружить большое количество тонких ошибок и странного поведения.

Сначала используйте профилировщик кода .Узнайте, где у вашего кода реальные проблемы с производительностью.Определите узкие места и исправьте их.Если это исправление связано с кэшированием, пусть будет так, но сначала соберите доказательства .

1 голос
/ 27 марта 2011

Там нет установленных руководящих принципов о том, когда его использовать. Вы должны выяснить, какие запросы к базе данных являются наиболее частыми и / или наиболее дорогостоящими, и кэшировать их. В вашем случае я бы, вероятно, кешировал результат этого вызова функции.

Где я бы запутался (как вы можете быть), это то, что нужно делать, когда создаются новые темы. Ваш запрос будет давать разные результаты каждый раз, когда кто-то создает поток. Итак, что вы должны сделать в этом случае, когда кто-то создает поток, это обновить базу данных, а затем скорректировать ваш результирующий набор в кеше, выбив самый старый поток и добавив новый. Вам даже не нужно будет перезагружать новейшие 30 потоков из кэша, так как он будет обновлен.

1 голос
/ 27 марта 2011

Вероятно, многие пользователи вашего сайта будут запрашивать список последних тем, поэтому кэширование всего результата SQL с использованием memcached звучит как отличная возможность.

Очень простой подход к memcached заключается в использовании SQL-запросов в качестве ключей и их соответствующих результатов в качестве значений (, т. Е. См. Это руководство здесь ). Возможно, вы захотите попробовать это сначала для всех высокочастотных запросов к базе данных и профилировать результат, прежде чем начинать дальнейшую оптимизацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...