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

## 概要

**Redisとは**  

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

[Redisとは \- IT用語辞典](http://e-words.jp/w/Redis.html)より抜粋

## なぜRedisを使用するのか？


* [ruby on rails \- セッションを保存するとき、なぜ、Cookieではなくmemcachedやredisを使用するのでしょうか？ \- スタック・オーバーフロー](https://ja.stackoverflow.com/questions/21539/%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D-%E3%81%AA%E3%81%9C-cookie%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8Fmemcached%E3%82%84redis%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B)
* [Ruby on Rails \- redisやmemcashedといったセッションストアの使用シーンがわかりません。\(RDBではダメなんでしょうか？\)\(11303\)｜teratail](https://teratail.com/questions/11303)


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

```$ brew install redis```

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

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

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

Redisクライアントの起動

```$ redis-cli```

``` Redisクライアントコマンド
# 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] = 'test@a.a'
  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"
```

## 参考

 * [RailsのセッションストアとしてRedisを使う\(Mac/EC2:AmazonLinux\) \- Qiita](http://qiita.com/Kta-M/items/b4852c849d408e7445c6)
 * [railsでsessionをredisに保存する \- Qiita](http://qiita.com/yu_0105/items/5073f7de6decef79412e)
 * [» Redisの使い方技術の犬小屋](http://promamo.com/?p=3358)
 * [第1回　インメモリデータストア Redisの概要：ニコニコ生放送に見る Redis 活用ノウハウ｜gihyo\.jp … 技術評論社](http://gihyo.jp/dev/feature/01/redis/0001)
 * [OS XでRedisをインストールしてRuby on Railsで使う（gem 'redis'） \- kentana20 技忘録](http://kentana20.hatenablog.com/entry/2014/05/06/182119)