我正在建立一个网站。它有用户可以加入的组。
这个和“正常”群体之间的区别在于会员资格 临时 - 当用户加入群组时,他决定会员的长度:5天,a 一周,两周等(选择是预先定义的)。或者可能全部 会员资格可以设置为相同的长度 - 例如一周 - 如果 这让事情更简单。
我想对每个成员的数量进行计算 组。该数字不需要精确到最后一秒。 但它也不能太过时 - 比如应该更新一次 一天。
计算成员数量的“明显”方式似乎是 每天说,做一个cron工作,并通过每个成员 小组一个接一个。如果成员资格已过期,请删除该成员 来自小组,并将小组的会员数减1。
这种方法似乎非常低效且不具备扩展性。有了 大量的团体,可能需要永远。
你能想到更好的方法吗?会员数量 不需要准确到最新的第二。它可以是近似的 和(略)过时了。如果它有所作为的话 会员资格可以设置为相同的长度,比如一周。
答案 0 :(得分:2)
存储每个组中当前人数的列表。还存储一个天数列表。每天将包含一个组列表,以及当天从该组中减去的人数。
当一个人加入一个群组时,在群组总数中加1,并在他/她的会员资格到期当天将该群体的减值加1。
如果一个人的到期日期发生变化,请从旧的到期日期(对于该组)中删除1,并将1添加到新的到期日期。
最后,当然,每天一次减去当天每组的正确数量。
答案 1 :(得分:1)
如果所有成员资格的长度相同,只需维护一个由于到期而成为会员资格的FIFO。每次获得新成员时,都会在列表末尾添加“过期”条目,并在1周后设置日期。
现在,您可以根据需要随时检查列表的前面是否有成员资格,并更新该组的计数。当你到达尚未过期的第一个条目时停止。
这也适用于可变长度成员资格,但您必须维护一个已排序的列表。
答案 2 :(得分:1)
当会员加入时,您知道他们的会员资格何时到期。因此,您可以将每个成员添加到在同一天到期的相应成员列表,而不是每天(或者经常)搜索要停用的成员列表。然后,您每天都会通过并删除当天过期的会员资格。这几乎就是你所说的,除了不是搜索,你存储结果。
存储空间的大小与最长成员资格的长度成正比。