【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については、こちらで詳しく解説しているので、ぜひ参考にしてください。

【Ruby入門】今更聞けない!Ruby bundlerとは
更新日 : 2019年1月11日

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キャッシュの使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。

【Rails入門】cacheの使い方まとめ
更新日 : 2017年9月10日

まとめ

いかかでしたか?

今回はRedisを使ったRuby on Railsの高速化方法について解説しました。

Redisは、メモリ上にデータを保存する超高速のデータベースの一種です。

Ruby on Railsのセッション管理データの保存先をRedisにすると、高速化だけでなくセキュリティー強化にもなるため、ぜひ活用してみてください。

そして、Ruby on RailsでRedisを使うための設定方法を忘れてしまったらこの記事を確認してくださいね!

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

オオイシ

オオイシ

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