【Rails入門】Redisでセッションを高速化しよう!キャッシュも解説

こんにちは!システムエンジニアのオオイシです。

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_5

次項では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-railsGemfileに追記します。

# 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 のサーバーを再起動して、アプリケーションがエラーなく実行できることを確認してみましょう。

なお、Gembundlerについては、こちらで詳しく解説しているので、ぜひ参考にしてください。

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を使うための設定方法を忘れてしまったらこの記事を確認してくださいね!

この記事を書いた人

システムエンジニア歴15年のオオイシです!好物は Java と Ruby。プログラミング、システムアーキテクトからマネジメントに到るまでなんでも食べます。
システム開発の相談やお困りごとがあればお気軽に
makoto.oishi.0705@gmail.com まで連絡頂けると幸いです

目次