スライドショースライドショー

【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

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

オオイシ

オオイシ

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

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説