Можно ли запросить кэшированную коллекцию записей в Rails?


Я кэширую результаты такой модели (с Memcached):

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

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

Спасибо!

2 2

2 ответа:

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

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

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

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