0

我正在建立一个网站。它有用户可以加入的组。

此组与“正常”组之间的区别在于成员资格是临时的 - 当用户加入组时,他决定成员资格的长度:5 天、一周、2 周等(选择是预定义的)。或者可能所有的会员资格都可以设置为相同的长度——比如一周——如果这样可以让事情变得更简单。

我想对每个组的成员数量进行统计。该数字不需要精确到最后一秒。但它也不能太过时——比如说,应该每天更新一次。

计算成员数量的“明显”方法似乎是运行一项 cron 作业,例如每天,并逐个检查每个组的每个成员。如果成员资格已过期,请将该成员从组中删除,并将组的成员计数减 1。

这种方法似乎非常低效且不可扩展。如果有大量的组,这可能需要很长时间。

你能想出更好的方法来做到这一点吗?成员计数不需要精确到最新的秒数。它可能是近似的并且(稍微)过时。此外,如果有所不同,所有成员资格都可以设置为相同的长度,比如一周。

4

3 回答 3

2

存储每个组中当前有多少人的列表。还存储天的列表。每天将包含一个组列表,以及当天从该组中减去多少人。

当一个人加入一个小组时,将小组总数加 1,并在他/她的会员资格到期之日为该小组的减员加 1。

如果一个人的到期日期发生变化,请从 people-to-subtract 从旧的到期日期(对于该组)中删除 1,并将 1 添加到新的到期日期。

最后,当然,每天从每组中减去当天的正确数量。

于 2010-07-15T19:54:08.350 回答
1

如果所有成员的长度相同,只需维护一个即将到期的成员的 FIFO。每次获得新成员时,在列表末尾添加一个“过期”条目,日期设置为 1 周后。

现在,根据您的喜好,检查列表前面的过期成员,并更新组的计数。当您到达第一个尚未过期的条目时停止。

这也适用于可变长度的成员资格,但您必须维护一个排序列表。

于 2010-07-15T19:48:14.917 回答
1

当会员加入时,您知道他们的会员资格何时到期。因此,您可以将每个成员添加到在同一天到期的相应成员资格列表中,而不是每天(或经常)搜索要停用的成员列表。然后,每天您只需检查并删除当天过期的会员资格。这几乎就是您所说的,除了您存储结果而不是搜索。

您的存储空间大小与您最长会员资格的长度成正比。

于 2010-07-15T19:54:26.647 回答