Redisって何?ランキング簡単なの?
Redisにはソート済みセット型という型が用意されており、これを使うとアクセスランキングみたいなモノがお手軽に作れたのでRailsでの実装方法をメモ。
ソート済みセット型についての解説はこちらのブログがとても分かり易いです。
Redisでアクセスランキングを実装
環境設定等
まずはredisのインストール
Gemfileを忘れずに
gem 'redis'
続いてRailsのconfig/environmentsにエンドポイントを記述して環境変数にセット
ENV["REDIS"] = "http://localhost:6379"
Railsのconfig/initializersにて環境変数からRedisオブジェクトを生成
require 'redis'
uri = URI.parse(ENV["REDIS"])
REDIS = Redis.new(host: uri.host, port: uri.port)
これで準備はおkです
ランキングデータの保存と呼び出し
例えばカテゴリ別の記事アクセスランキング何かを作る場合、アクセス時にこんな感じでランキングデータをセット
REDIS.zincrby "ranking/#{category.id}/#{Date.today.to_s}", 1, "#{article.id}"
週間ランキングの上位20カテゴリを呼び出すならkeyをマージしてこんな感じ
(7.days.ago.to_date..Date.today).each do |date|
keys << "ranking/#{category.id}/#{date.to_s}"
end
REDIS.zunionstore("ranking/#{category.id}/weekly", keys)
REDIS.zrevrange "ranking/#{category.id}/weekly", 0, 19
スコア付きで欲しいならオプションを指定
REDIS.zrevrange "ranking/#{category.id}/monthly", 0, 19, withscores: true
いずれも配列形式で返って来ます
Redisすげー!
この手のランキングは勿論リレーショナルデータベース+バッチ処理とかで作れますが、早晩破綻してしまうという経験は業界あるあるなのではないでしょうか。
ソート済みセット型はランキング以外だと何に使えるのかまだ見つけておりませんが、Redisの高速データセットを使うおかげでバッチが悲鳴を上げてしまう事態を避けられるのは嬉しい限りです。
参考にした資料
MacにRedisをインストールする
Redisでアクセスランキングを実装
Ruby Doc
サービスへの実装
こんなところで使ってみました