Yura_Mart
@Yura_Mart

Как лучше реализовать постоянный отсчёт времени и суммирование значений?

Добрый день, есть вопрос как лучше реализовать одну вещь.

Есть пользователи. Каждый пользователь может купить карточку на определённый срок (10 дней). За это каждый день ему будут начисляться баллы (100 баллов).

Получается на сервере нужно будет запускать скрипт для проверки сроков и суммирования баллов. Я думаю можно запускать этот скрипт по cron.

Вопрос в том, насколько часто можно его запускать и как сильно эту будет влиять на производительность? Например, если будет 1000 пользователей и у каждого будет 4-5 карточек, и скрипту нужно будет пройти их все.

Является ли данное решение верным или есть ещё способы реализации?
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
sergiks
@sergiks Куратор тега PHP
♬♬
Надо ли иметь в БД статичное значение баллов? Может, оставить свойство вычисляемым — когда требуется узнать про конкретного пользователя, сколько у него баллов — выполняется поиск купленных им карточек за последние 10 дней и до сих пор активных, и суммируются.

Либо можно обновлять базу cron-задачей. Округлить до какого-то интервала времени: 1 сутки (если все в одном городе), или 1 час, если пользователи со всех частей света. Карта начинает действовать в ближайший следующий «момент» после активации. В ближайшую полночь, скажем.

1000 пользователей по 5 карточек — это не нагрузка, всё легко отработает.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
xEpozZ
@xEpozZ
Веб-разработчик
> "Если в реляционной базе данных, то начисление 1000 пользователей с 4-5 карточками у каждого делается одним SQL-запросом"
> да, так и планировал сделать.

Не советую так делать, если не хотите зафакапить данные.
Даже обход в цикле 5000 тысяч строк не займет больше 5 минут. Зависит от сетапа, конечно.

Делайте поочередную выгрузку, последующее обновление с логированием куда-нибудь в файл, бд, stdout.
В случае, когда что-то пойдет не так, можете заглянуть в логи и увидеть, что 1 и 5000 строчек не обновилась, вместо того, чтобы все 5000 строк не были затронуты.
Если много памяти потреблять будет, то можно воспользоваться батч-запросами или курсором.
Скрипт на 5 минут в день не повлияет на вашу производительность приложения. Делать 1 запросом может и быстрее, но только если вы уже всё отстроили и точно уверены в том, что этот запрос никогда сбоить не будет. Даже после изменения схемы БД другим программистом, который забудет поправить ваш скрипт ;)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы