railsでsessionをredisに保存する

## 概要
今回は、永続化可能なKVSとしてよく使わているredisについて説明します。
redisは単純にkey-valueの関係でデータを保存することができ、session管理や、その他様々なシーンで使われています。

活用例としては[ニコニコ生放送に見る Redis 活用ノウハウ](http://gihyo.jp/dev/feature/01/redis)など目を通しておくとイメージしやすいかと思います。

今回はredisのインストール、基本操作、そして実際にrailsのsession storeとして使用されるまでを書いていきます。

## redisのインストール

### Mac
macでredisをインストールするためにはbrewを使用します。

```
~ brew install redis
```

起動および接続は以下のコマンドにて。

```
~ redis-server /usr/local/etc/redis.conf
~ redis-cli
```


### Cent
centの場合はyumを使用してインストールを行います。

```
~ sudo yum --enablerepo=epel install redis
```

起動および接続は以下のコマンドにて。

```
~ sudo /etc/init.d/redis start
~ redis-cli
```

## redisの基本操作
以下redisの基本操作となります。

```
# DBの選択(何番目のDBなのか。0 ~ 15まであります)
> select 0

# 保存されているキー数
> dbsize

# value閲覧
> get key_here

# 削除
> flushdb

# 終了
> exit
```

## redis.confの設定
実際に細かい設定について見ていきます。redis.confのパスはそれぞれ以下の通り。

```
# Mac
/usr/local/etc/redis.conf

# Cent
/etc/redis.conf
```

以下最低限見ておけば良い項目です（あくまで開発用で）。

```
# サービスとして起動したい場合はデーモンをyesにする
daemonize no

# デーモン化した場合のpidのパス指定
pidfile /usr/local/var/run/redis.pid

# redisが動くport指定
port 6379

# 接続元の制限（Master, Slave構成にする際に制御したりなど。0.0.0.0を設定するとすべてのサーバーからアクセス可能になります）
bind 127.0.0.0

# timeout時間の設定
timeout

# redisのログレベル設定(項目についてはredis.conf内のコメント参照)
loglevel verbose

# ログファイルの場所
logfile /usr/local/var/log/redis.log

# スナップショットの保存条件（以下は10分に1度でも変更があったら保存）
save 600 1

# dbファイルの圧縮
rdbcompression yes
```


## master, slave構成
通常のDBでもよくやるmaster, slaveの構成もredisは簡単に構築することができます。

### bindの設定
slaveとなるredisからmasterへの接続ができるように、masterのredis.confのbindの設定を行います。

```
# 接続を許可するipを記載
bind xxx.xxx.xxx.xxx
```

その後redisの再起動を行い、以下のコマンドでmasterのredisにアクセスできるかを確認します。

```
~ redis-cli -h <master redis ip>
```

※アクセスできない場合は、iptables等の設定にも原因があるかと思いますので、そちらも確認してみてください。

### slave設定
slaveとなるredisのredis.confにslaveofという項目があるので、こちらの設定を行います。

```
slaveof <master ip> <master port>
```

再び再起動を行い、きちんと反映されているかを以下のコマンドで確認します。

```
~ redis-cli
> INFO
・
・
# Replication
role:slave
・
・
```

## Railsでsession storeに使用する
ここまででredisの基本的なことに触れてきました。最後に実際にrailsのsession storeとして使用する例を書いていきます。

### 環境
* ruby 2.2.0
* ruby on rail 4.2.3

### gemの導入
railsでredisを使う際には[redis-rails](https://github.com/redis-store/redis-rails)がよく使われます。今回もこちらを使用します。
Gemfileにredis-railsを記載し、bundle installをします。

```
gem 'redis-rails'

~ bundle install --path vendor/bundle
```

### sessionの保存設定
railsはデフォルトでconfig/initializers/session_store.rbにセッションの設定が書いてあります。
まずこのデフォルトの設定をコメントアウトします。

```
~ vim config/initializers/session_store.rb

# Rails.application.config.session_store :cookie_store, key: '_app_session'
```

続いて各環境ごとに新たに設定を書き加えていきます(今回はdevelopment環境を例とします)。

```
~ vim config/environments/develpoment.rb

Rails.application.configure do

  ・
  ・
  ・

  config.session_store :redis_store, {               
     servers: {            
         host: 'localhost',      
         port: 6379,             
         db: 0,                  
         namespace: 'sessions' 
     },                             
    expire_after: 60.minutes     
 }

end
```

これでサーバーを再起動し、sessionを生成するとredisの方に保存されているかと思います。


## 参考
* [Rails で Redis をセッションストアに使うメモ](http://hiyosi.tumblr.com/post/88279879818/rails-%E3%81%A7-redis-%E3%82%92%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B9%E3%83%88%E3%82%A2%E3%81%AB%E4%BD%BF%E3%81%86%E3%83%A1%E3%83%A2)
* [RailsのセッションストアとしてRedisを使う(Mac/EC2:AmazonLinux)](http://qiita.com/Kta-M/items/b4852c849d408e7445c6)
* [redisサーバー構築メモ](http://konboi.hatenablog.com/entry/2013/03/05/155107)
* [redis.confの設定をしてみる](http://qiita.com/suin/items/3b513fffc300452b4e9e)