heroku data for redisを用いてrailsのキャッシュ保存

目次

マーケター、エンジニアを月1時間からジョインできるプラットフォーム

airteamは月1時間からマーケターやエンジニアに相談できるプラットフォーム。 雇うのはハードル高いけどプロをチームに入れたい。そんな経営者のためのサービスです。 相談にのる方も募集しています。

タスクなしだから月一時間からジョイン可能

作業はなくオンライン相談メイン。 月1時間からさっと経験者に継続的に相談できます。

多様な経験者を雇用するより何倍も早くチームに

あらゆるジャンルの経験者がいるので あなたのチームのノウハウの選択肢が広がります。

NDAはすでに締結済み、契約もスムーズ

契約の煩雑なやりとりはなく、NDAはすでに締結済み、書面のやりとりはありません。

herokuでrailsを用いていてredisを使いたい場合、addonのheroku data for redisだとサクッとredisを導入できます。この記事ではheroku data for redisを導入する際にしたことと運用の注意点をまとめてました。

そもそもredisとは?

redis自体はオープンソースで誰でも使えるものになっています。heroku data for redisはそのredisを使えるようにしたインフラです。キーバリューを用いて読み書きができます。

redisを使うとどんなメリットがあるか?

redisを使うことでセッションなどを保存し、ページの高速化などができます。例えば通常ページを表示させる場合、様々なロジックでコンテンツを出し分けし、ページを生成しています。この生成されたページをそのままredisに保存させ、再度生成しなくても表示できるようにすることで表示速度をあげることができます。

設定

redisの導入は下記の流れでできます。

  • addonの追加
  • gem導入
  • config/initializers/redis.rb作成
  • キャッシュの保存先をredisに変更
  • キャッシュへの保存実装

development環境の設定

開発中もキャッシュの挙動を試したい場合、一工夫必要です。デフォルトだとmemory_storeへの保存になっているはずです。明示的にコード内でredisへの保存を書いている場合、結局redisへの保存がうまくいっているのか判断しにくいので開発環境でもredisを使う形にしました。

config/initializers/redis.rb

if 開発環境の条件文
  $redis = Redis.new(url: ENV["REDIS_URL"], ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE }) # 開発環境ではSSL認証なし
else
  $redis = Redis.new(
    url: ENV["REDIS_URL"],
    ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_PEER } # 本番環境ではSSL認証あり
  )
end

https://devcenter.heroku.com/ja/articles/connecting-heroku-redis#connecting-in-ruby

上記の公式ドキュメントにはSSL接続なしのみで記載されているが本番かどうかで切り替える。

gem追加

gemfile

gem 'redis'

保存先の指定

config/environments/production.rb

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

古いデータを消すように

redisにデータが満帆になった際の処理を設定

noevictionはメモリ・リミットに達するとエラーを返します。
allkeys-lruは最近使用されたキーから順に削除します。
volatile-lruは、有効期限が設定されている最近使用された鍵から順に削除する。
allkeys-randomはランダムな鍵を消去する。
volatile-random は、有効期限が設定されているランダム鍵を消去する。
volatile-ttl は、有効期限が設定され、TTLが短い鍵を消去する。
volatile-lfuは、有効期限が設定されている鍵のうち、近似LFUを使用して 復帰させる。
allkeys-lfuは、近似LFUを使用して任意の鍵を退避させる。

https://devcenter.heroku.com/articles/heroku-redis#maxmemory-policy

キャッシュの場合はvolatile-lruが良さそう。