一時的なグループのメンバーシップのタリー - それをするための賢い方法は?
-
16-09-2020 - |
質問
私はウェブサイトを構築しています。ユーザーが参加できるグループがあります。
このと「通常」グループの違いは、メンバーシップが 一時 - ユーザーがグループを結合するとき、彼は会員の長さを決定します:5日、 週,2週間など(選択肢は事前定義されています)。または潜在的にすべて メンバーシップは同じ長さになるように設定することができます - 週に言う - if それは物事をより簡単にします。
それぞれのメンバーの数を走っています。 グループ。この数は、最後の2番目まで正確にする必要はありません。 しかし、それはにすることはできませんのどちらかがいずれか - 言う、一度更新する必要があります 一日。
メンバーの数を計算する「明白な」方法は Cronの仕事を実行して、毎日言って、すべてのメンバーを通過します 1つずつグループ。メンバーシップが期限切れになった場合は、そのメンバーを削除してください グループからグループのメンバーシップ数を1回減らす。
そのアプローチは非常に非効率的であり、あまりスケーラブルではありません。とともに 多数のグループ、それは永遠にかかる可能性があります。
これを行うためのより良い方法を考えることができますか?会員数の道 最新の2番目に正確である必要はありません。それはおよそすることができます そして(少し)時代遅れ。それが違いを生み出すならば メンバーシップは同じ長さになるように設定することができます、週に言ってください。
解決
現在各グループにいる人数のリストを保存します。また日数を保存します。毎日にグループのリストを含み、その日にそのグループからそのグループから引く人数を含みます。
人がグループに参加したとき、グループの合計1に1を追加し、そのグループに1を減算します。
人の有効期限が変更された場合は、人から減算した古い有効期限(そのグループの場合)から1を削除し、新しい有効期限を追加します。
最後に、もちろん、1日に1回、その日の各グループから正しい量を減算します。
他のヒント
すべてのメンバーシップが同じ長さが同じであれば、単に期限切れのメンバーシップのFIFOを維持するだけです。新しいメンバーを取得するたびに、1週間後に日付を設定して、リストの末尾に 'expires'エントリを追加します。
今すぐ頻繁には、会員期限を切るためにリストの前面を確認し、グループのカウントを更新してください。あなたがまだ期限切れになっていない最初のエントリに着くときに停止します。
これは変動長メンバーシップにも機能する可能性がありますが、ソートリストを維持する必要があります。
会員が参加するとき、あなたは彼らの会員がいつ期限切れになるか知っています。したがって、メンバーのリストを毎日無効にする代わりに(または頻繁に)、同じ日に期限切れになるメンバーシップの適切なリストに各メンバーを追加できます。それから、毎日あなたはちょうどその日の期限切れのメンバーシップを削除します。それはあなたが言ったこと、検索の代わりにあなたが結果を保存することを除いて、あなたが言ったことです。
あなたの記憶域の大きさはあなたの最長会員の長さに比例します。