Question

Je construis un site web. Il a des groupes que les utilisateurs peuvent rejoindre.

La différence entre cela et des groupes "normaux" est que l'adhésion est temporaire - Lorsqu'un utilisateur rejoint un groupe, il décide de la durée de l'adhésion: 5 jours, un semaine, 2 semaines, etc. (choix sont prédéfinis). Ou potentiellement tout Les membres pourraient être fixés pour être de la même longueur - disons une semaine - si cela rend la chose plus simple.

J'aimerais avoir une décision en cours de fonctionnement du nombre de membres de chaque grouper. Le numéro n'a pas besoin d'être précis jusqu'à la dernière seconde. Mais cela ne peut pas être trop Désactivé soit - dites, devrait être mis à jour une fois une journée.

Le moyen "évident" de calculer le nombre de membres semble être courir un travail de cron, dire quotidiennement et passer à travers chaque membre de chaque groupe un par un. Si une adhésion a expiré, supprimez ce membre Du groupe et décrémenter le nombre d'adhésion du groupe par 1.

Cette approche semble très inefficace et non très évolutive. Avec un grand nombre de groupes, cela pouvait prendre pour toujours.

Pouvez-vous penser à une meilleure façon de le faire? Les membres comptent pas besoin d'être précis pour la dernière seconde. Il peut être approximatif et (légèrement) obsolète. Aussi si cela fait une différence tout Les adhésions peuvent être définies pour être de la même longueur, par exemple une semaine.

Était-ce utile?

La solution

stocker une liste de combien de personnes sont actuellement dans chaque groupe.Stockez également une liste de jours.Chaque jour contiendra une liste de groupes et combien de personnes à soustraire de ce groupe ce jour-là.

Lorsqu'une personne rejoint un groupe, ajoutez-en 1 au total du groupe et ajoutez-en 1 au peuple à soustraire pour ce groupe le jour de son adhésion expirera.

Si la date d'expiration d'une personne change, supprimez 1 de la personne à soustraire de l'ancienne date d'expiration (pour ce groupe) et ajoutez 1 à la nouvelle date d'expiration.

Enfin, bien sûr, une fois par jour soustrayez le montant correct de chaque groupe pour ce jour.

Autres conseils

Si toutes les adhésions ont la même longueur, maintenez simplement une FIFO d'adhésions dues à expirer.Chaque fois que vous obtenez un nouveau membre, ajoutez une entrée «expiration» à la fin de la liste, avec la date définie 1 semaine plus tard.

Maintenant, aussi souvent que vous le souhaitez, vérifiez le recto de la liste pour expulser les adhésions à expiration et mettre à jour le nombre du groupe.Arrêtez-vous lorsque vous arrivez à la première entrée qui n'a pas encore expiré.

Cela pourrait également fonctionner pour des appartenances à longueur variable, mais vous devez conserver une liste triée.

Lorsqu'un membre se joint, vous savez quand leur adhésion expirera.Ainsi, au lieu de rechercher une liste de membres pour désactiver tous les jours (ou souvent), vous pouvez ajouter chaque membre à la liste des adhésions appropriées qui expirent le même jour.Ensuite, tous les jours, vous venez de passer et de supprimer les abonnements expirés pour ce jour-là.C'est à peu près ce que vous avez dit, sauf que, à la place de la recherche, vous stockez les résultats.

La taille de votre stockage est proportionnelle à la longueur de votre plus longue adhésion.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top