Введение
Мне интересно, как лучше всего реализовать уникальную систему просмотров... Я думаю, что знаю, как это сделать, поэтому, если бы я мог объяснить, как это сделать, и вы указываете на какие-либо ошибки или улучшения.
очевидно, мне нужно будет сохранить таблицу журналов, содержащую идентификатор видео и то, что (относительно) однозначно идентифицирует пользователя. Сначала я рассмотрел комбинацию запроса заголовка и IP, но решил сохранить его простым и использовать только IP. Также таким образом пользователь не может увеличивать представления своего видео с помощью другого браузера.
Вот как я мог бы это сделать:
Когда пользователь посещает, я делаю SELECT аналогично этому:
SELECT 1 FROM tbl_log WHERE IP =
$usersip AND video_id = $video_id
INSERT into tbl_log (IP,video_id)
VALUES ($usersip, $video_id)
SELECT views FROM tbl_video WHERE
video_id = $video_id
UPDATE tbl_video SET views =
$result['views'] + 1 WHERE video_id
= $video_id
Вопросы
Я думаю, я не хочу, чтобы миллионы записей журналов замедляются мой сайт, поэтому я должен запустить задание cron для пустой журнал журнала один раз в день?
Должен ли я создавать представления на транзакциях? (Я думаю, немного уменьшенное количество просмотров меньше важно, чем медленный сайт из-за блокировки строк)
Есть ли способ уменьшить нагрузку на
сервер mysql.... я боюсь, если каждый
для просмотра требуется увеличенное количество просмотров
и IP-журнал, который будет довольно
дорогая. Я видел, что youtube
и тому подобное не обновляют представления
мгновенно... они кэшируют
обновляет некоторые способы, а затем запускает их в
один раз? если да, то как?
Насколько эффективна моя система? Ты можешь подумайте о каких-либо улучшениях?
Вот некоторые идеи для улучшений, которые вы можете сделать.
Установите первичный ключ на tbl_log как IP + video_id. Тогда вы можете просто сделать
REPLACE INTO tbl_log (IP,video_id) VALUES ($usersip, $video_id)
(Обязательно избегайте этих переменных php, чтобы избежать SQL-инъекции.)
Теперь вы обновляете свою таблицу журналов только одним запросом. Затем вы можете периодически обновлять поле views в tbl_video с помощью следующего:
UPDATE tbl_video SET views = (select count(*) from tbl_log where video_id = $video_id) where video_id = $video_id
Вы можете сделать это с помощью задания cron, или вы можете добавить поле last_count_update и обновить видео, когда оно будет доступно, если последнее время отсчета составляет более 2 часов или что-то еще. Это будет немного меньше, если у вас есть куча видео, которые часто не посещаются.
Думаю, я не хочу миллионы записей журналов замедляют мой сайт, поэтому я должен запустить cron задание для опорожнения таблицы журналов один раз в день?
Рассмотрим использование синтаксиса mysql ON DUPLICATE KEY UPDATE, чтобы избежать использования SELECT, у которого будет дорогостоящее предложение WHERE. Если в вашей таблице журналов также был столбец временной отметки, вы можете обновить это значение.
INSERT into tbl_log (IP,video_id) VALUES ($usersip, $video_id) ON DUPLICATE KEY UPDATE time_recorded = now();
Это потребует, чтобы у вас было ограничение UNIQUE для столбцов IP
и video_id
.
Должен ли я сделать представления транзакционными? (Думаю, слегка обесцененный вид счет менее важен, чем медленный сайт из-за блокировки строк)
Нет, потому что вы можете достичь этого с помощью одного запроса UDPATE.
UPDATE tbl_video SET views = views + 1 WHERE video_id = $video_id
Есть ли способ уменьшить нагрузку на сервер mysql.... я боюсь, если каждый для просмотра требуется увеличенное количество просмотров и IP-журнал, который будет довольно дорогая. Я видел, что youtube и тому подобное не обновляют представления мгновенно... они кэшируют обновления некоторые как и затем запускают их сразу? если так как?
Это не так уж плохо - на самом деле нет другого способа надежного захвата данных в режиме записи. В случае с Youtube это скорее задерживает записи или репликацию, которые вызывают задержку, которую вы замечаете, поскольку у них сотни серверов (хотя возможно, что они также кэшируют значение).
Насколько эффективна моя система? Ты можешь подумайте о каких-либо улучшениях?
Кроме того, что я уже упоминал здесь, не с головы.