Вопрос

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

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

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

«очевидный» способ расчета количества членов, кажется, Запуск работы CRON, скажем ежедневно и проходите каждый член каждого группа один за другим. Если у членства истекло, удалите этот член Из группы и уменьшение количества членства Группы на 1.

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top