Когда использовать memcached

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

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

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

Автор:

id имя пользователя пароль пароль соль   email_salt email_verified   ip_address

Author_threads:

thread_id, author_id

Тема:

id, title, content, created

Tag:

id, name

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?

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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