Низкоуровневое кеширование Rails не работает для активных записей - PullRequest
0 голосов
/ 18 июня 2020

Я использую graphql для моего api rails. И используйте redis для кеш-хранилища.

В запросе graphql я использую кеш для оптимизации производительности:

graphql / types / query_type.rb

field :labels, [Types::LabelType], null: false do
  description 'Get all food labels'
end

def labels
  Rails.cache.fetch("labels", expires_in: 24.hours) do
    Label.all
  end
end

10 меток загружаются в базу данных, и когда я тестирую запрос в localhost:3000/graphiql, он показывает 10 результатов правильно. Однако, если я вручную удалю строку в базе данных, она вернет 9 записей вместо 10 кешированных результатов.

Вот моя конфигурация среды:

config / environment / development.rb

if Rails.root.join('tmp', 'caching-dev.txt').exist?
  config.action_controller.perform_caching = true
  config.cache_store = :redis_cache_store, { url: ENV.fetch("REDIS_URL_CACHING", "redis://localhost:6379/0") }
  config.public_file_server.headers = {
    'Cache-Control' => "public, max-age=#{2.days.to_i}"
  }
else
  config.action_controller.perform_caching = false
  config.cache_store = :null_store
end

Я запустил rails dev:cache, и в tmp каталоге есть caching-dev.txt. Что мне здесь не хватает?

1 Ответ

0 голосов
/ 18 июня 2020

Я нашел похожие вопросы и попробовал на них ответы. Предлагаемые решения:

Первый и второй работают правильно.

graphql / types / query_type.rb

def labels
  Rails.cache.fetch("labels", expires_in: 24.hours) do
    Label.all.load
  end
end

Советы: Запустите Rails.cache.clear в консоли rails всякий раз, когда вы меняете блок кэша

Проблема заключалась в том, что кэшировался именно блок Label.all, а не результаты.

Независимо от того, как я меняю блок, он уже кэширован, поэтому результаты НЕ кэшируются.

Я запустил Rails cache clear в консоли rails, и он работал правильно.

...