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