Active Model Serializerのデータをredisにキャッシュする
active_model_serializersで出力しているAPIレスポンスをRedisにキャッシュしたかったの対応した。
Rails 5.2から公式でRedisのキャッシュストアが対応されたとのことなのでキャッシュの導入は非常に手軽。
まずはGemfileにredisとhiredisを追加する。
# Gemfile
gem 'redis'
gem 'hiredis'
config/environments/xxxのcache_storeをredisに変更する。
# config/environments/production.rb
config.cache_store = :redis_cache_store, { url: "redis://#{ENV.fetch('REDIS_HOST') { 'localhost' }}:#{ENV.fetch('REDIS_PORT') { '6379' }}/#{ENV.fetch('REDIS_DB') { '1' }}" }
これでキャッシュストアにredisが使えるようになった。
active_model_serializersの出力をキャッシュするには↓のようにrender_to_stringを使う。
class PostsController < ApplicationController
def index
posts = cached_posts_json
render json: json
end
private
def cached_posts_json
Rails.cache.fetch("posts", expires_in: 5.minutes) do
posts = Post.all
render_to_string json: posts
end
end
end
これでpostsを5分間redisにキャッシュできるようになった。