こんにちは!システムエンジニアのオオイシです。
Redisを使うとRuby on Railsのセッション管理を高速化出来ることをご存知ですか?
Redisはメモリ上にデータを保存する超高速のデータベースの一種です。
この記事では、
- Redisとは?
- RailsでRedisを使うメリットとは?
- Redisをインストールしてみよう
といった、基本的な解説から
- Railsのセッション管理をRedisにしてみる
- Redisに保存されたデータを見る
- RailsキャッシュをRedisにする
などの応用的な使い方関しても解説していきます。
今回はそんなRedisを使ったRuby on Railsの高速化方法についてわかりやすく解説します!
Redisとは?
Redisとは、データをメモリ上に保存するタイプのインメモリ型のKVS(Key Value Store)です。
KVSとは、主としてキーとバリューのシンプルなデータを保存するタイプのデータベースのことで、RDB(Relational Database)のような複雑なデータは扱えない反面、高速に動作するという特徴があります。
データの永続化を目的とする場合は向いていません。
そんな特徴から主な利用用途は、
- キャッシュ
- セッションデータ
- 大量メール
などの一時的なデータの保存先としてとても有効です。
その有用性の証拠として、AWSなどのクラウドサービスのプロダクトとしてRedisが使われているのですよ!
そんなRedisをRuby on Railsで使うことのメリットについて次項で解説していきます。
RailsでRedisを使うメリットとは?
Redisはシンプルでかつ高速なデータベースであるため、
- キャッシュ(Rails.cache)
- Ruby on Rails のセッションデータ
- 大量データ送信データ(Active Job)
などの一時的なデータ保存先としてRedisを利用するとRailsを高速化することができます!
さらに、セッションデータの場合は、Redisへ変更することでセッションハイジャックなどのセキュリティリスクを軽減できます!
次項ではRailsのセッション管理をRedisに変更する方法について紹介していきたいと思います!
Redisをインストールしてみよう
各種環境に応じたインストール方法を紹介します。
CentOS:
yum -y install epel-release yum install -y redis
Mac:
brew install redis
Homebrewのインストールについてはこちらを参照してください。
Windows:
MicrosoftのGitHubのMicrosoftArchive/redisから任意にmsiをダウンロードしてインストールしてください。
Redisサーバーを起動するためには次のコマンドを実行します。
redis-server
実行結果:
27041:C 12 Jun 17:34:38.501 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 27041:C 12 Jun 17:34:38.501 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=27041, just started 27041:C 12 Jun 17:34:38.501 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf 27041:M 12 Jun 17:34:38.502 # You requested maxclients of 10000 requiring at least 10032 max file descriptors. 27041:M 12 Jun 17:34:38.502 # Server can't set maximum open files to 10032 because of OS error: Operation not permitted. 27041:M 12 Jun 17:34:38.502 # Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'. 27041:M 12 Jun 17:34:38.503 # Not listening to IPv6: unsupproted _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 4.0.9 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 27041 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _. ~~ 省略 ~~
このようにRedisサーバーを起動することができました。
つづいて、Ruby on Rails のセッション管理をRedisにする設定方法について解説していきます。
なお、Ruby on Railsのセッション管理については、こちらで詳しく解説していますので、ぜひ参考にしてください。
Railsのセッション管理をRedisにしてみる
Ruby on Railsのセッション管理をRedisに変更するため設定方法について、順を追って解説していきます!
1. Ruby on RailsとRedisを連携するためにはredis-railsをGemfileに追記します。
# Gemfile gem 'redis-rails'
2. bundel installします。
$ bin/bundle install
3. config/initializers/session_store.rbを新規に作成しセッション管理をRedisにするための設定を記述します。
# config/initializers/session_store.rb アプリケーション名::Application.config.session_store :redis_store, { servers: [ { host: "localhost", # Redisのサーバー名 port: 6379, # Redisのサーバーのポート db: 0, # データベースの番号(0 ~ 15)の任意 namespace: "session" # 名前空間。"session:セッションID"の形式 }, ], expire_after: 90.minutes # 保存期間 }
設定については以上です。
Ruby on Rails のサーバーを再起動して、アプリケーションがエラーなく実行できることを確認してみましょう。
なお、Gemやbundlerについては、こちらで詳しく解説しているので、ぜひ参考にしてください。
Redisに保存されたデータを見る
本当にセッションデータがRedisに保存されているの?
と不安に思う人のために、RailsコンソールからRedisのデータを確認する方法について紹介します。
1. Railsコンソールを起動します。
$ bin/rails c
2. Redisに保存したセッションデータをすべて削除します
>redis = Redis.new(url: 'redis://localhost:6379/0') # Redisに接続 # セッションを保存しているデータベースを選択 > redis.select 0 => "OK # Redisのセッションデータをクリア > redis.flushdb => "OK" # キーの一覧を取得 > redis.keys => []
3. Railsアプリケーションからセッションに保存する操作してください。
4. RailsコンソールからRedisにセッションデータが保存されたことを確認
# キーの一覧を取得 > redis.keys => ["session:de7b87c3c487b3622c8a505c5e1ce69a", "session:7d12e83552cd35bb1e082480fbaee71d"] # 保存データの中身を確認 > redis.get "session:de7b87c3c487b3622c8a505c5e1ce69a" => "\u0004\b{\u0006I\"\u0010_csrf_token\u0006:\u0006EFI\"13u/SxOI4lsxx836eIAKj8yOnViUXGcAMF02kvvDQFB8=\u0006;\u0000F"
このように、RailsコンソールからRedisに接続できることが確認できました。
次項では、Railsキャッシュの高速化について解説していきます。
RailsキャッシュをRedisにする
速度の遅いデフォルトのRailsキャッシュ(Rails.cache)をRedis保存(redis_store)に変更して見ましょう。
以下のファイルに追記します。
module アプケーション名 class Application < Rails::Application 〜〜 省略 〜〜 config.cache_store = :redis_store, { host: "localhost", # Redisサーバーのホスト名 port: 6379, # Redisサーバーのポート db: 0 # 保存するデータベース 0 ~ 15の任意 },{ expires_in: 90.minutes # 保存期間 } end end
Ruby on Rails サーバーを再起動したら反映されます。
Railsキャッシュの使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。
まとめ
いかかでしたか?
今回はRedisを使ったRuby on Railsの高速化方法について解説しました。
Redisは、メモリ上にデータを保存する超高速のデータベースの一種です。
Ruby on Railsのセッション管理データの保存先をRedisにすると、高速化だけでなくセキュリティー強化にもなるため、ぜひ活用してみてください。
そして、Ruby on RailsでRedisを使うための設定方法を忘れてしまったらこの記事を確認してくださいね!