前回、ruby で redis を使ってみるを書いたのですが、今回は activesupport を入り口に redis を rails で使ってみます。
目次
実行環境
- windows
- Windows10 ver.1909
- Mac
- macOS Mojave 10.14.4
参考
- github - redis-store/redis-activesupport
- github - redis-store/redis-rails
- rails ガイド- Rails のキャッシュ機構
- Rails.cache.fetch でキャッシュがあったら返す/無かったら生成して返す
- Ruby on Rails 6.0.2.1 - ActiveSupport::Cache::Store < Object
キャッシュ利用
導入(memory_store)
通常、キャッシュする仕組みは開発環境に対して有効化されていないということなので、
config\environments\development.rb を確認します。
1 | if Rails.root.join('tmp', 'caching-dev.txt').exist? |
/tmp/caching-dev.txt
を作れば有効化できそうなので、/tmp/caching-dev.txt
を作ります。
キャッシュ先として、memory_store
を使うことがわかります。
実装(memory_store)
users テーブルへのアクセス結果をキャッシュしてみることにします。
変更前は、次のようになります。
1 | class UsersController < ApplicationController |
変更後は、次のようになります。
1 | class UsersController < ApplicationController |
確認(memory_store)
bundle exec rails s
を実行し確認します。localhost:3000/users
にアクセスします。
すると、コンソール上に初回だけUser Load (0.1ms) SELECT "users".* FROM "users"
が表示され、
ページリロード以降は表示されません。
User のレコードを追加して、localhost:3000/users
に再度アクセスしても、件数が増えていません。
キャッシュした User.all の結果を使用しているからですね。
どうやら意図通り動いているようです。
一度停止し、再度bundle exec rails s
を実行してlocalhost:3000/users
にアクセスすると増えていることを確認できます。
redis 利用
導入(redis)
ここまでは、キャッシュ先としてmemory_store
を使用していました。
キャッシュ先を redis に変えてみます。
Gemfile に、以下を追記します。
1 | gem 'redis-activesupport' |
以下を実行します。
1 | bundle install |
github - redis-store/redis-railsを参考に、config\environments\development.rb
を以下のように編集します。
1 | if Rails.root.join('tmp', 'caching-dev.txt').exist? |
確認(redis)
bundle exec rails s
を実行してlocalhost:3000/users
にアクセスします。memory_store
を使用していた時同様に、コンソール上に初回だけUser Load (0.1ms) SELECT "users".* FROM "users"
が表示されます。
redis-cli を用いて確認してみます。
以下のコマンドを実行します。
1 | redis-cli |
redis に、指定したUSERS_ALL
をキーにキャッシュされたことが確認できます。
次は、現在キャッシュ時間に任意変更とエラー対応をしてみます。
キャッシュ時間変更他
実装
app\controllers\users_controller.rb
を以下のように書き換えます。
1 | class UsersController < ApplicationController |
確認
redis-cli を使用し、一度登録したキーcache:USERS_ALL
を削除しておきます。
1 | redis-cli |
bundle exec rails s
を実行してlocalhost:3000/users
にアクセスします。
コンソール上に初回はUser Load (0.1ms) SELECT "users".* FROM "users"
が表示るのは、これまで同様です。
加えて、30 秒程度立ってからアクセスするとUser Load (0.1ms) SELECT "users".* FROM "users"
が再度表示されます。
キャッシュ時間 30 秒を行った結果が反映されました。
試しに、redis-server を停止してlocalhost:3000/users
にアクセスすると、レスポンスが遅くなります。
Chrome の開発者ツールでレスポンスを確認すると、20 秒程度かかっていました。
redis にアクセスできないとき、都度 DB にアクセスしていることも確認できました。
今回は、activesupport で memory_store でのキャッシュを試し、最後にキャッシュ先を redis に変更することを試しました。
今回 users テーブルからは 10 件程度しか取得していないのですが、DB から取得した時とキャッシュから時では、1ms 程度差が出ました。
データ数が、増えると差がより開いてくるでしょうから押さえておけたのはよかったです。
ではでは。