39
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Redisのソート済みセット型を使ってRailsで簡単ランキングを作る

Posted at

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

サービスへの実装

こんなところで使ってみました

麻布十番駅の賃貸物件人気ランキング お部屋探しのノマド

39
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?