Rails Redis Cache Store

Rails Redis Cache Store

Начиная с Rails 5.2 можно использовать в качестве кеша Redis. Несколько разных типов кеша доступны в Rails:  MemCacheStore, FileStore и MemoryStore. Теперь начиная с версии 5.2 мы имеем встроенную поддержку Redis в качестве хранилища кеша.

Как работает кеш в Rails можно почитать здесь. По умолчанию Rails использует кеширование фрагментов. Для использования кеширования страниц или действий нужно добавить actionpack-page_caching и actionpack-action_caching  в Gemfile. Также по умолчанию кеш включен только для production окружения. Для включения кеша в режиме разработки необходимо установить опцию config.action_controller.perform_caching в true  в файле config/environments/development.rb

config.action_controller.perform_caching = true

Кеширование фрагментов выглядит так

<% @products.each do |product| %>
  <% cache product do %>
    <%= render product %>
  <% end %>
<% end %>

При первом запросе страницы, Rails создаст уникальные записи для каждой итерации/элемента. Для обновления элементов в кеше Rails использует updated_at.

Можно кешировать коллекцию целиком, для этого в render указать опцию cache

<%= render partial: 'products/product', collection: @products, cached: true %>

Теперь все фрагменты будут получены из кеша одним запросом.

Redis

Для начала необходимо добавить в Gemfile

gem 'redis'

Для поддержки библиотеки hiredis добавим ruby обертку

gem 'hiredis'

Redis автоматически будет использовать hiredis если он доступен. Настройка не нужна.

Добавим конфигураци в соотвестствующий файл config/environments/*.rb

config.cache_store = :redis_cache_strore, { url: ENV['REDIS_URL'] }

более детальная настройка для использования в production может выглядеть примерно так:

cache_servers = %w(redis://cache-01:6379/0 redis://cache-02:6379/0)
config.cache_strore = :redis_cache_strore, { url: cache_servers,
  connect_timeout: 30, # default 20s
  read_timeout: 0.2, # default 1s
  write_timeout: 0.2, # default 1s
  reconnect_attempts: 1, # default 0
  
  error_handler: -> (method:, returning:, exception:) {
    # reports to Sentry
    Raven.capture_exception exception, level: 'warning',
    tags: { method: method, returning: returning }
  }
}

rails dev:cache

в режиме разработки можно включить кеширование в памяти

rails dev:cache

будет создан файл caching-dev.txt в директории tmp. При запуске rails в файле config/environments/development.rb сработает проверка на наличие этого файла и будут использованы настройки кеширования в памяти.

 config.action_controller.perform_caching = true

 config.cache_store = :memory_store
 config.public_file_server.headers = {
   'Cache-Control' => "public, max-age=#{2.days.to_i}"
 }

Иначе кеширование отключено:

config.action_controller.perform_caching = false
config.cache_store = :null_store