извлечение данных из memcache - PullRequest
4 голосов
/ 20 марта 2010

Я начинаю изучать преимущества memcache и хотел бы реализовать его в своем проекте.Я понял большинство из них, например, как данные могут быть получены с помощью ключа и т. Д.

Теперь я понял, что могу поместить сообщение со всеми его деталями в memcache и вызвать ключ POST:123 это нормально, и я могу сделать это для каждого поста.

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

Ответы [ 6 ]

3 голосов
/ 20 марта 2010

Memcache - это кэш значения ключа, поэтому, как вы уже описали, он обычно используется, когда вы точно знаете, какие данные вы хотите получить (т. Е. Он не используется для запроса и возврата неизвестного списка результатов на основе на некоторых фильтрах).

Обычно цель состоит не в том, чтобы заменить все запросы к базе данных вызовами memcache, особенно если оптимизация не требуется.

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

Однако, вероятно, лучше либо сохранить запрос к базе данных, либо загрузить его непосредственно в память (если мы говорим об одном сервере, который записывает все обновления).

1 голос
/ 20 марта 2010

Посмотрите на камень cache_money из Твиттера.Этот драгоценный камень добавляет кеширование на уровне ActiveRecord.Поиск вызовов по идентификатору будет проходить через кеш.Вы можете добавить поддержку индексации по другим полям в вашей таблице (например, title в вашем случае)

class Post < ActiveRecord::Base
  index :title
end

Теперь вызовы поиска, которые фильтруются по заголовку, будут проходить через кеш.

Post.all(:conditions => {:title => "xxxx"})
1 голос
/ 20 марта 2010

Вы можете иметь ключ с названием «posts» со значением «1,2,3,4,10,12», а затем обновлять, извлекать его каждый раз при создании, обновлении и удалении нового сообщения.

В любом случае memcached - это не замена базы данных, это хранилище ключей / значений (быстрое и масштабируемое). Поэтому вы должны решить, какие данные хранить в БД, а какие выгружать в memcached.

В качестве альтернативы вы можете использовать плагин «cachemoney», который будет выполнять чтение / запись через кэширование вашей AcriveRecord в памяти (даже в memcached)

0 голосов
/ 20 марта 2010

Насколько я знаю, вы не можете запросить несколько ключей и значений. Но если вам нужно часто получать доступ к одному и тому же списку сообщений, почему бы вам не сохранить его с ключом типа «сообщения» в вашем memcache.

0 голосов
/ 20 марта 2010

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

Итак, да: выполните SELECT title FROM posts и сохраните результат в memcached (например, как POSTS:ALL_UNORDERED). Вот как это устроено. И да, если запрашивать отдельные записи типа SELECT * FROM posts WHERE id = XX, сохраните их. Не забывайте создавать уникальные ключи memcached для каждого выполняемого запроса.

0 голосов
/ 20 марта 2010

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

Это помогает?

...