0

Я строю сайт. В нем есть группы, к которым пользователи могут присоединиться.Временное членство в группе - любой умный способ сделать это?

Разница между этим и «нормальной» группой в том, что членство временно - когда пользователь присоединяется к группе, он решает длину членства: 5 дней, а недели, 2 недели, и т.д. (варианты заранее определены). Или, возможно, все члены могут быть настроены на одну длину - скажем, неделю - если , что упрощает дело.

Хотелось бы иметь подсчет количества членов каждой группы . Число не должно быть точным до последней секунды. Но это тоже не может быть устаревший - скажем, должен быть обновлен один раз в день.

«Очевидный» способ расчета количества членов, по-видимому, составляет , выполняющий работу cron, скажем ежедневно, и каждый член каждой из группы один за другим. Если членство истекло, удалите этого члена из группы и уменьшите количество членов группы на 1.

Этот подход кажется очень неэффективным и не очень масштабируемым. С большое количество групп, это может занять много времени.

Можете ли вы придумать лучший способ сделать это? Количество участников делает не нужно быть точным до последней секунды. Он может быть приблизительным и (слегка) устаревшим. Также, если это имеет значение, все членства в могут быть установлены одинаковой длины, скажем, в неделю.

ответ

2

Сохраните список того, сколько людей в настоящее время находится в каждой группе. Также сохраните список дней. Каждый день будет содержать список групп и сколько людей вычесть из этой группы в этот день.

Когда человек присоединяется к группе, добавьте 1 к общей группе и добавьте 1 к людям для вычитания для этой группы в день, когда истечет срок его членства.

Если дата истечения срока действия человека изменяется, удалите 1 из людей для вычитания из старой даты истечения срока действия (для этой группы) и добавьте 1 к новой дате истечения срока действия.

Наконец, разумеется, раз в день вычитайте правильную сумму из каждой группы за этот день.

1

Если все членства имеют одинаковую длину, просто поддерживайте FIFO членства из-за истечения срока действия. Каждый раз, когда вы получаете нового члена, добавьте запись «expires» в конец списка с датой, установленной на 1 неделю позже.

Теперь, как вам угодно, проверьте переднюю часть списка для истечения срока членства и обновите счет группы. Остановитесь, когда вы доберетесь до первой записи, которая еще не истекла.

Это может также работать для членства с переменной длиной, но вам нужно будет вести сортированный список.

1

Когда член присоединяется, вы знаете, когда истечет срок их членства. Таким образом, вместо того, чтобы искать список участников для деактивации ежедневно (или часто), вы можете добавить каждого члена в соответствующий список членов, срок действия которых истекает в тот же день. Затем каждый день вы просто проходите и удаляете членство с истекшим сроком действия на этот день. Это в значительной степени то, что вы сказали, за исключением того, что вместо поиска вы сохраняете результаты.

Размер вашего хранилища пропорционален длине вашего максимального членства.