⬆️

時間経過によって変わる人気ロジックの実装

2024/03/25に公開

今回の話

サービス内で人気のXX急上昇のXXなどのロジックが必要なことがあるかと思います。
とてもシンプルな形であれば、何かのイベントが発生したら人気度を上げることで実現できますが、仕様によっては時間経過によって変化する必要があるかもしれません。
今回はそのようなケースを想定して、時間経過によって変わる人気ロジックの実装方法をご紹介します。

設計

  • 1ランクの単位(RankBase)を60*60*1000 とする(1時間)
  • ある一点からずっと人気のXX が作れないように、最大値(MaxRank)を定義(1日、1週間などにするとわかりやすいです)
  • イベントごとに weight を決める(例えば、いいねは 1、コメントは 2 など)
    • 例) - 閲覧 ... 1、お気に入り ... 6、コメント ... 4、フォロー ... 24

コード

// Rank の計算
func AddRank(rank int64, weight int) int64 {
	// rank の最小値考慮
	now := // 現在時刻を unixtime で取得
	if rank < now {
		rank = now
	}
	rank += int64(weight * RankBase)

	// rank の最大値考慮
	maxRank := now + int64(MaxRank)
	if rank > maxRank {
		rank = maxRank
	}

	return rank
}

unixtime で取得した現在時刻を基準に、weight に応じて rank を加算しているため、時間経過によって rank が変化します。
AddRank が呼ばれるのはイベントが発生した時なので、取得する際に rank 降順で取得することで、人気のXX などを実現できます。

最後に

単純に rank を加算していくだけでも人気のXXの実現は可能ですが、ずっと人気のXXが変わらないと言う事態が起きがちなので、現在時刻を基準とすることでより直近の人気度を反映させることができます。

Discussion