redis ( redis to go ) でリアルタイム?ランキング集計してみたby ruby

redis to goの無料プラン使ってredisでランキング集計してみた
Redis To Goで利用登録すると
uriもらえるのでそれを使って接続

require 'uri'
require 'redis'
uri = URI.parse("redis://redistogo:password@barreleye.redistogo.com:11432/")
redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)

ランキング集計対象データはこんな感じで

{:id => "a", :value => "foo"}
{:id => "a", :value => "foo"}
{:id => "a", :value => "foo"}
{:id => "b", :value => "bar"}
{:id => "b", :value => "bar"}
{:id => "c", :value => "baz"}

こんな感じにランキング集計したい

{:key => "a", :score => 3}
{:key => "b", :score => 2}
{:key => "c", :score => 1}

参考サイトをみると「ソート済みセット型」を使うとよいとのこと
マニュアルよりZINCRBY(key, increment, member)コマンドで追加して
ZREVRANGE(key, start, end, [WITHSCORES])コマンドで結果取得となってるので
redis.rbのソース見てこんな感じかなと

redis.zincrby("ranking", 1, "a")
redis.zincrby("ranking", 1, "a")
redis.zincrby("ranking", 1, "a")
redis.zincrby("ranking", 1, "b")
redis.zincrby("ranking", 1, "b")
redis.zincrby("ranking", 1, "b")
redis.zincrby("ranking", 1, "b")
redis.zincrby("ranking", 1, "b")
redis.zincrby("ranking", 1, "c")
redis.zincrby("ranking", 1, "c")
p redis.zrevrange("ranking", 0, -1, :with_scores => true)
=>[["b", 5.0], ["a", 3.0], ["c", 2.0]]

いけたー
参考
https://github.com/redis/redis-rb/blob/master/lib/redis.rb
Redisでランキング機能を実装してみる - (゚∀゚)o彡 sasata299's blog
ソート済みセット型 — redis 2.0.3 documentation
http://developer.smartnews.be/blog/2013/09/24/implementation-of-ranking-algorithm-using-fluentd-and-redis/