0

私はウェブサイトを構築しています。ユーザーが参加できるグループがあります。

このグループと「通常の」グループの違いは、メンバーシップが一時的なものであるということです。ユーザーがグループに参加すると、メンバーシップの長さを5日、1週間、2週間などで決定します(選択肢は事前に定義されています)。または、すべてのメンバーシップを同じ長さに設定することもできます(たとえば、1週間)。

各グループのメンバー数を集計したいのですが。数値は、最後の1秒まで正確である必要はありません。ただし、古すぎることもありません。たとえば、1日1回更新する必要があります。

メンバーの数を計算する「明白な」方法は、毎日、たとえばcronジョブを実行し、すべてのグループのすべてのメンバーを1つずつ調べているようです。メンバーシップの有効期限が切れている場合は、そのメンバーをグループから削除し、グループのメンバーシップ数を1つ減らします。

そのアプローチは非常に非効率的で、あまりスケーラブルではないようです。グループの数が多いと、それは永遠にかかる可能性があります。

これを行うためのより良い方法を考えられますか?メンバーシップ数は、最新の秒まで正確である必要はありません。概算で(わずかに)古くなっている可能性があります。また、違いが生じる場合は、すべてのメンバーシップを同じ長さ、たとえば1週間に設定できます。

4

3 に答える 3

2

各グループに現在何人いるかのリストを保存します。日のリストも保存します。毎日、グループのリストと、その日にそのグループから差し引く人数が含まれます。

ある人がグループに参加するときは、グループの合計に1を加え、メンバーシップの有効期限が切れる日にそのグループの減算する人に1を加えます。

人の有効期限が変更された場合は、(そのグループの)古い有効期限から減算する人から1を削除し、新しい有効期限に1を追加します。

最後に、もちろん、1日1回、その日の各グループから正しい金額を差し引きます。

于 2010-07-15T19:54:08.350 に答える
1

すべてのメンバーシップが同じ長さである場合は、有効期限が切れるためにメンバーシップのFIFOを維持するだけです。新しいメンバーを取得するたびに、リストの最後に「expires」エントリを追加し、日付を1週間後に設定します。

ここで、必要に応じて、リストの先頭にあるメンバーシップの有効期限を確認し、グループの数を更新します。まだ有効期限が切れていない最初のエントリに到達したら停止します。

これは可変長のメンバーシップでも機能する可能性がありますが、ソートされたリストを維持する必要があります。

于 2010-07-15T19:48:14.917 に答える
1

メンバーが参加すると、メンバーシップの有効期限がいつ切れるかがわかります。したがって、毎日(または頻繁に)非アクティブ化するメンバーのリストを検索する代わりに、同じ日に期限切れになるメンバーシップの適切なリストに各メンバーを追加できます。次に、毎日、その日の期限切れのメンバーシップを確認して削除します。検索する代わりに結果を保存することを除いて、それはあなたが言ったこととほとんど同じです。

ストレージのサイズは、最長のメンバーシップの長さに比例します。

于 2010-07-15T19:54:26.647 に答える