Ruby on Railsのセッション管理にRedisを使ってみた


概要

Redisとは

メモリ上にKey-Valueストア(KVS)を構築することができるソフトウェアの一つ。
KVSは任意の保存したいデータ(値:value)に対し、対応する一意の標識(キー:key)を設定し、これらをペアで保存するデータベースの一種で、Redisはコンピュータのメインメモリ上にKVSを構築し、外部のプログラムからデータの保存と読み出しができる。

Redisとは - IT用語辞典より抜粋

なぜRedisを使用するのか?

Redisのイントール

Homebrewを使用しRedisをイントールします。

$ brew install redis

Redisクライアントの基本操作

Redisサーバーの起動(Ctrl+Cで終了)

$ redis-server /usr/local/etc/redis.conf

Redisクライアントの起動

$ redis-cli

# DB選択(初期は0, 0〜15まで選択可能)
127.0.0.1:6379> select 1 
OK
# keyとvalueをセット
127.0.0.1:6379[1]> set key val
OK
# 指定したkeyのvalueを閲覧
127.0.0.1:6379[1]> get key
"val"
# 保存されているkeyを閲覧
127.0.0.1:6379[1]> keys *
1) "key"
# 保存されているkeyの数
127.0.0.1:6379[1]> dbsize
(integer) 1
# 削除
127.0.0.1:6379[1]> flushdb
OK
# Redisクライアントの終了
127.0.0.1:6379[1]> exit

Railsアプリの準備

環境

ruby 2.3.3
Rails 4.2.7.1

Railsアプリを任意の場所に作成。

$ cd Desktop

$ mkdir redis

$ cd redis

$ rails new redistest

RailsアプリにRedisを導入

1.下記をGemfileに追記し$ bundle installを実行。

gem 'redis'
gem 'redis-rails'

2.初期設定をコメントアウトする。

config/initializers/session_store.rb
  1 # Be sure to restart your server when you modify this file.
  2 # ↓この行をコメントアウト
  3 # Rails.application.config.session_store :cookie_store, key: '_redistest_session'

3.development.rbに下記を追記。

config/environments/development.rb
Rails.application.configure do
  # (中略)
  # ↓この行を追加(6379/0の0はDBのID、expire_inはセッションの生存期間、ここでは1分に設定している)
  config.session_store :redis_store, servers: 'redis://localhost:6379/0', expire_in: 1.minutes
end

Redisにセッションを保存する

1.テスト用のコントローラーを作成。(redistest直下で)

$ rails g controller redis

2.1で作成したコントローラーに下記を記述。

app/controllers/redis_controller.rb
class RedisController < ApplicationController
  require 'redis'

  def test
    render text: 'テスト'
    Redis.current.set("hoge", "fuga")
    session[:user_email] = '[email protected]'
  end
end

3.ルーティング設定

Desktop/redis/redistest/config/routes.rb
Rails.application.routes.draw do
# (中略)
# ↓この行を追加
match ':controller(/:action(/:id))', via: [ :get, :post, :patch ]
end

4.Redis接続情報を作成

Desktop/redis/redistest/config/inisitalizers/redis.rb
require 'redis'
Redis.current = Redis.new(:host => '127.0.0.1', :port => 6379)

5.Rails・Redisサーバー・Redisクライント・RailsConsoleの起動(既に起動している際は再起動)

  • Railsサーバーの起動

    $ rails s

  • RailsConsoleの起動

    $ rails console

  • Redisサーバーの起動

    $ redis-server /usr/local/etc/redis.conf

  • Redisクライアントの起動

    $ redis-cli

6.1.2で作成したコントローラーの実行

RailsConsoleで下記のコマンドを実行
irb(main):001:0> app.get "http://localhost:3000/redis/test"

7.Redisクライアントで保存されたセッションの確認

127.0.0.1:6379> keys *
1) "XXXXXXXXXXXXXXXXXXX" ←セッション(上記で生存期間を1分にしているため1分経過後消える)
2) "hoge"

参考