LoginSignup
7
5

More than 5 years have passed since last update.

Redis-Objectを使って簡易ランキング機能を実装する

Last updated at Posted at 2016-01-22

ネットで見かけた記事が article.id=1 を経由するやり方でなんかイケてなかったので。

[準備]redis-objectを利用する

redis-objectをプロジェクトのgemに追加します

source 'https://rubygems.org' do
  # use redis server
  gem 'redis-objects',  '1.2.0'
end

モデルの設定

redis-objectをインクルードします。
sorted_set以外については公式のREADMEにまとまっているので参照のこと
redis-objects::Github

models/article.rb
class Article < ActiveRecord::Base
  include Redis::Objects

  sorted_set :ranking, global: true
end

global: true のオプションをつけることでidに紐付かないkeyとして保存される
ついでに、PVをインクリメントするインスタンスメソッドも作っておく

models/article.rb
class Article < ActiveRecord::Base
  # ~略~
  def ranking_increment
    ranking.increment(self.id)
  end
end

コントローラからは @article.ranking_increment を呼ぶたびにスコアが1ずつインクリメントされる

ランキングを取得する

ランキングを取得する際はインスタンスメソッドを経由する必要はなく以下で良い。

# スコアの上位1-5を取得
Article.ranking.revrange(0,4)

Article.ranking[0..4] だとscoreの小さい順からになるので、 revrange で取得する

以上です。
Redis-Objectは簡単で便利なのですが、メソッドの構成があんまり直感的じゃないので
Redisを理解してる場合はRedisで独自で実装した方がわかりよいような気がしました。

Enjoy Redis!

7
5
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
7
5