Как наилучшим образом кэшировать рассчитанные метрики для информации, хранящейся в базе данных - PullRequest
2 голосов
/ 07 февраля 2012

Разобрался. Тупой вопрос.

Ответы [ 4 ]

2 голосов
/ 07 февраля 2012

Вы можете кэшировать результаты в базе данных, скажем, в поле «Оценка», а затем, когда пользователь заходит на страницу, запустить SQL-выбор, чтобы найти любые статьи с нулевым счетом.

SQL: SELECT * FROM Articles WHERE Score IS NULL

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

Примечание: баллы должны быть абсолютными, основанными исключительно на рассматриваемой статье, а не на содержании других статей в базе данных.

SQL: SELECT * FROM Articles ORDER BY Score

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

1 голос
/ 07 февраля 2012

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

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

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

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

1 голос
/ 07 февраля 2012

В настоящее время вы придерживаетесь тактики «не храните, если вы можете рассчитать», которая преподается в качестве первого шага в классах проектирования баз данных.

Однако, если «оценка» вряд ли изменится часто , тогда может быть лучше обработать все записи по расписанию, сохранить их оценки в базе данных, а затем просто извлекать наиболее высоко оцененные элементы при загрузке страницы.

0 голосов
/ 07 февраля 2012

Стандартный способ периодически запускать что-либо - cron . Вы можете периодически запускать любую команду, включая сценарии PHP.

Вы также можете кэшировать оценку сообщения или, по крайней мере, часть оценки, связанную с его содержанием, для повышения эффективности. Обработка полного текста стоит дорого, поэтому с этой точки зрения, безусловно, стоит кэшировать данные в базе данных.

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

Пример:

// fetch cached post score, which doesn't take time into account
$base_score = get_post_base_score($post_id);
// now adjust the base score given how old the post is
$score = adjust_score($base_score, time() - $post_time);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...