herokuでセッションの保存先をRedisにする

最初に言ってしまいますと、Qiita の以下の記事を（ほぼ丸々そのまま）参考にさせていただいて実装を行っています。
[RailsのセッションストアとしてRedisを使う(Mac/EC2:AmazonLinux) | Qiita](http://qiita.com/Kta-M/items/b4852c849d408e7445c6)

若干自分好みに環境設定を変えているのと、本番環境が AWS と heroku で違うだけです。
元ネタの記事をご覧になっていただいた方が話が早いかもしれません。

***

この頃評判のいい Redis をセッションの保存先として使用するよう設定してみました。
Rails のセッションの保存先はデフォルトでは Cookie ですが、下のような話もあるので検討の結果 Redis にしてみた感じです。
[Rails SessionにCookieStore使った時の問題点 | OAuth.jp](http://oauth.jp/blog/2013/09/26/rails-session-cookie/)

一応調査するにあたっていろいろ調べたのですが、こういうサイトの性能比較を見ると結構すごいな、と思わされます。
[ももクロスライダーで測る Redis vs MongoDB on Heroku 第二弾](http://yosuke-furukawa.hatenablog.com/entry/20120504/1336114367)
[NoSQLデータベースガイドを読みました。著者： @sasata299](http://yosuke-furukawa.hatenablog.com/entry/20110821/1313886186)

## Mac に Redisをインストール

全く同じ手順でうまく行きますので、[元ネタ様](http://qiita.com/Kta-M/items/b4852c849d408e7445c6#mac%E3%81%ABredis%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) を参照してください。

## Rails に Redis を導入

若干変えています。

```rb:Gemfile
gem 'redis'
gem 'redis-rails'
```

```rb:config/initializers/session_store.rb
# Rails.application.config.session_store :cookie_store, key: 'XXXXXX'
Rails.application.config.session_store :redis_store, servers: Rails.application.config.session_store_servers, expire_in: BestTeacher::Application.config.session_expires_in
```

```rb:config/environments/development.rb
Rails.application.configure do
    :
  # for session store.
  config.session_store_servers = 'redis://localhost:6379/0'
    :
end
```

```rb:config/environments/production.rb
Rails.application.configure do
    :
  # for session store.
  config.session_store_servers = ENV["REDISCLOUD_URL"]
    :
end
```
staging.rb も production.rb と同じ修正を行います。
環境変数は [Redis Cloud](https://addons.heroku.com/rediscloud) を前提としていますので、他のアドオンにする場合は適宜読み替えてください。

Redis の動作確認が正常に行っていれば、コードの修正はこれだけ。
サーバを再起動すれば正常にセッションの保存がうまく行くようになるはずです。
※ 当然セッションの保存先が変わるので、ログイン済みのユーザは再ログインが必要になります。

なお、もしセッションとは異なるデータも Redis に同居状態で格納したいという場合には、以下のように接頭詞のようなものを着けることも出来ます。

```rb:config/environments/development.rb
Rails.application.configure do
    :
  # for session store.
  config.session_store_servers = 'redis://localhost:6379/0/session'
    :
end
```

でもまあ、基本的には database を別に（末尾の0とかの数字を変えるだけ）すべきだと思います。

## Redis に保存されたデータを確認
[元ネタ様](http://qiita.com/Kta-M/items/b4852c849d408e7445c6#redis%E3%81%AB%E4%BF%9D%E5%AD%98%E3%81%95%E3%82%8C%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E7%A2%BA%E8%AA%8D) を参照してください。
なお、もし接頭詞を着けた場合はこんな感じでキーを検索できると思います。

```
127.0.0.1:6379> keys session*
1) "session:f1412e2bbe5df2091ebdf2e3025e2335"
```

## どの Redis のアドオンを使う？

現在、heroku には4つの Redis のアドオンがあります。
早晩5つめが増えるようです。

* [Redis Cloud | Add-ons | Heroku](https://addons.heroku.com/rediscloud)
* [Redis To Go | Add-ons | Heroku](https://addons.heroku.com/redistogo)
* [RedisGreen | Add-ons | Heroku](https://addons.heroku.com/redisgreen)
* [openredis | Add-ons | Heroku](https://addons.heroku.com/openredis)

正直どれがいいの？というのはよくわからないのですが、比較サイトがありました。
[HEROKU REDIS PROVIDER COMPARISON: OPENREDIS, REDIS TO GO, REDISGREEN, REDIS CLOUD](http://blog.octocall.com/post/59436616813/heroku-redis-provider-comparison-openredis-redis)
表形式で比較選択しやすいように並べて表示してあるので、大変助かります。
とりあえず安さに惹かれて [Redis Cloud](https://addons.heroku.com/rediscloud) にしてみました。

技術情報 [Redis Cloud | Heroku Dev Center](https://devcenter.heroku.com/articles/rediscloud) を見ると他の既存の Redis からデータ移行を行いやすいように整備されていて、なかなか野心的で良いと思います。
実際に触ってみないと確かなことは言えませんが、バックアップデータにアクセスも出来るようになっているあたりも素敵です。
容赦なく他のアドオンに移行することも出来るってことですよね。

プランにより複数の database をさくっと作ることが出来るのは良いのですが、 database ごとに容量制限、 quota みたいなことは出来ないんでしょうか。
Redis 本体にもそういう機能があるようには見えなかったんですが、例えばセッションとキャッシュで database を分けつつ利用したいけど、セッションの方には多めに容量確保したいとかできないかなーと思ったりしました。


なお、この記事を書いている現時点ではまだステージング環境でも評価を行っていません。
動作確認や本番リリース後、記事に間違いなどあった場合は修正しますが、未確認情報を含む点があることをあらかじめご了承ください。