2012-05-24 2 views
2

Я кэширование результатов модели, как так (с Memcached):Можно запросить кешированный набор записей в Rails?

Rails.cache.fetch('Store.all') { Store.all } 

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

Спасибо!

ответ

2

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

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

Если у вас есть большое количество магазинов, это будет анти-оптимизация, чтобы попытаться кэшировать Store.all в качестве одного ключа кеша, а затем попытаться отфильтровать его с помощью рубина для данного города или любых других критериев. Ваша программа будет вынуждена перебирать всех городов, так как массивы не имеют индексов на city_id. Вам будет намного лучше позволить базе данных выполнить эту работу с предложением «где» и использовать мощность индексирования, предоставляемую базой данных.

0

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

Смежные вопросы