RedisのSorted Setを使う方法を最近はよく見かけますね。
大本のマスタデータとしては適当なDBに永続化しつつ、ランキング用にRedisも使うという方法です。
実際に、簡単に実装できます。
Redisには細かい点数の付加タイミングなどの情報が入りません。
そのため、再集計等の用途にはマスタデータを使います。
ポイント変動を同時にRedisに反映しておけば、簡単に上位X名を取得できます。
RedisのAPIでX番目からX番目…という取得も可能なのでページングも実装できます。
Redisそのものが高速で、キャッシュされた状態なため、大本のマスタDBに不必要な負荷を与えずに済みます。
毎回のポイント処理で、下記のような3つのポイントを同時に変動させると良いでしょう。
これで日、週、月、(年)のランキングを別々に付けることができます。
zincrby daily_points_{date} {1/-1} {user_id}
zincrby weekly_points_{week} {1/-1} {user_id}
zincrby monthly_points_{month} {1/-1} {user_id}
// zincrby annually_points_{year} {1/-1} {user_id}
※日、週(はどう指定するか微妙ですが)、月、年をキー名に含めることでそれぞれの切り替わりに対応します。
テーブルの方は誰が、いつ、ポイントを付けたのかということを仔細に書き込んで良いです。
それによってポイントの重複付加を排除したりできるでしょうし、再集計時の選択肢が広くなります。
Redisで別途キャッシュしているため、マスタ本体はランキングの読み出しに影響を与えません。
注意点としては、何もしなければキャッシュにデータが残り続けてしまうということです。
バッチ処理か、Expirelyを付けることによって不要なキャッシュデータがクリンナップされるようにしてください。
下記のリンクはとりあえず適当にグーグルしたものの上位2件ですが…
http://qiita.com/niisan-tokyo/items/170ef3ac47ee39cfb46c
http://qiita.com/HirokiTakaba/items/bed4d278d8c571af3a2d
二重管理になってはしまいますが、簡単に実装できますし高速ですから、検討してみてはどうでしょうか。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。