Redisとは?RailsにRedisを導入


はじめに

自分の管理するサービスでもRedisを使ってはいるが、splitというgemを使うのに必要で入れているだけで、
せっかくRedisを入れていてもほぼ役目を果たしていないのでRedisをちゃんと使う前に改めてRedisについて整理したいなーと思ってメモがてら書いてます。

Redisとは?

  • キャッシュシステムとして有名であり、NoSQLの1つ
  • NoSQLの中でも、KVS(キーバリューストア)。キーとバリューの組み合わせを保存する。
  • データ型にいろいろ使える
    • String,List,Set,Sorted Set,Hash
  • インメモリなので高速
  • 永続化設定可能
  • シングルスレッド
  • スケールアウト可能
  • 使いどころ
    • セッションなど有効期限のあるデータを扱う場合
    • ランキングデータなど重たいSQLを走らせないといけない処理を扱う場合

Redis のインストール

brew を使ってインストールしました。
他のインストール方法はこちら(https://qiita.com/KurosawaTsuyoshi/items/f8719bf7c3a10d22a921)

$ brew install redis

これでインストール完了。

Redis サーバーの起動

つづいて Redis のサーバーを起動させます。

$ redis-server

これでローカル環境で Redis を使えるようになります。

Redis に接続する

$ redis-cli
127.0.0.1:6379>

Redis を使ってみる

redis-cli で Redisサーバーに接続したあとに下記のように操作してみます。

  • SET を使って Key と Value を設定しデータを保存する
  • GET で Key を指定して Value を取得する
  • quit で redis-cli を終了
redis> SET mykey "Hello"
OK
redis> GET mykey
"Hello"
redis> quit

(https://redis.io/commands/set)

RailsにRedisを導入

環境

ruby 2.5.1
Rails 5.2.2

Rails アプリの作成

ここではとあるページにRedisから値を取り出して表示するだけの簡単なアプリケーションを作ります。

$ rails new redis_sample

gem redis-rails のインストール

Rails で Redis を使うので Gemfile を以下のようにします。普通の Ruby で使う場合は gem redis でよさげ。

gem 'redis-rails'
$ bundle install
config/application.rb
config.cache_store = :redis_store, 'redis://localhost:6379/0/cache', { expires_in: 90.minutes }

config/application.rb に書いていますが、実際は環境毎に参照する Redis サーバーは違うと思うので、config/enviroments/◯◯.rb に書くとよいかと

サンプルページの作成

config/initializers/redis.rb
Redis.current = Redis.new

ローカル環境なので Redis.new しか書いていませんが、下記のように hostport を指定できるので、AWSのElastiCacheのRedisなどを使う場合はそれぞれを指定する必要がある。(ローカル含めて環境変数で管理するのがおすすめ)

Redis.new(:host => '127.0.0.1', :port => 6379)

つづいてページを表示するために、ルーティング、コントローラ、ビューを書いていきます。

resource :redis, only: %i[show]
app/controllers/redis_controller.rb
class RedisController < ApplicationController
  def show
    Redis.current.set('mykey', 'Hello')
  end
end

config/initializers/redis.rb で定義した Redis.current に対して値を保存します。

app/views/redis/show.html.erb
<%= Redis.current.get('mykey') %>

で、上で保存した値をビューの中で取り出して表示します。

まとめ

実装自体はたったこれだけです。
ランキングページなど、重たいSQL必要なところとか、フラグメントキャッシュとかで使っていきたいなと思いました。
あとはAWSの場合はElastiCacheでRedisサーバーを立てて、そのエンドポイントを config/initializers/redis.rb で指定すればよいかと思います!(自分はセキュリティグループの設定忘れてて詰まったので気にしてみてくださいw)