Redisを使って「急上昇」を実装

やりたいこと

Redisを使って「急上昇」を実装したい

やってみたやりかた

  • ソート済みセット型のインスタンスとして 以下を使う

    • スコアの最新の増減を記録する用:score_diff
    • 過去のスコアを記録する用:score
  • 手順

    • アイテムのスコアを変動させる
      diffは変動量でitem_idはアイテムのIDとする
zincrby score_diff diff item_id
  • 一定時間ごとにscoreを更新
    その際にweightsで重みを設定することで古いスコア変動の影響を小さくする
    score_(n+1) = score_diff_n + 0.7 * score_n = Σ(i, 1→n-1) (0.7 ^ (n-i)) * score_diff_i
zunionstore score 2 score score_diff weights 0.7 1.0  
del score_diff  
  • 現在の急上昇リストを取得
zrevrange score 0 list_size

参考

redis.shibu.jp