Временное членство в группе - Есть ли какой-нибудь умный способ сделать это? - PullRequest
0 голосов
/ 15 июля 2010

Я создаю сайт.У него есть группы, к которым пользователи могут присоединиться.

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 15 июля 2010

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

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

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

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

1 голос
/ 15 июля 2010

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

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

1 голос
/ 15 июля 2010

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

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

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

...