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

2 min 114 views
muraoka

muraoka

pixiv、nanaでプロダクトマネージャーを経験。
現在はマーケティングやwebサービス開発のコンサルティングを行っています。

FOLLOW

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が良さそう。

muraoka

muraoka

pixiv、nanaでプロダクトマネージャーを経験。
現在はマーケティングやwebサービス開発のコンサルティングを行っています。

FOLLOW

関連記事