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にキャッシュできるようになった。

参考


Related #ruby

Bulletをテスト環境で実行してN+1を調査する

bulletのおかげで見落としていたN+1に気づける

request specでリダイレクトのテストをする

redirect_toが使えた

bot tweetするrubyスクリプト

8時間ほどで申請が通っていた

RailsのログをLogrageに変更する

ログを1行にまとめてくれるので便利

activerecord-importのクエリログを無効化する

一時的にログを無効化して処理が終わったあとに戻すようにした