Лучший способ сделать кеширование на Reddit-подобном веб-сайте - PullRequest
2 голосов
/ 09 февраля 2010

У нас есть PHP-сайт, такой как reddit, пользователи могут голосовать за истории.

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

Позвольте мне объяснить на примере: у нас есть массив из 100 историй, который хранится в кеше в течение 5 минут. Пользователь проголосовал за некоторые истории, поэтому рейтинг историй изменился. Когда другой пользователь зайдет на сайт, он / она увидит кэшированные данные, следовательно, старые данные. (Это то же самое, если пользователь избирателя обновит страницу, он также увидит старый номер голосования за истории.)

Мы не можем понять, любая помощь будет высоко ценится

Ответы [ 2 ]

6 голосов
/ 09 февраля 2010

Это вопрос поиска баланса между обновлениями с низкой задержкой и общей нагрузкой на систему / сеть (иначе говоря, производительность и стоимость).

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

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

  3. Следующая альтернатива - иметь общий кэш (например, memcached, но общий для разных машин). Обновления базы данных всегда будут обновлять кэш. Это снижает нагрузку на базу данных и дает вам ответы с меньшей задержкой (поскольку поиск в кэше обычно дешевле, чем запросы к реляционной базе данных). Но если вы сделаете это, вам нужно будет тщательно измерять размер кэша и иметь достаточную избыточность, чтобы общий кэш не был единственной точкой отказа.

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

AFAIK, reddit не поддерживает прямое распространение голосования с низкой задержкой. Если вы проголосуете, это не сразу отражается на других клиентах. Я предполагаю, что они проводят некоторую агрегацию (как в # 4), но это только я размышляю.

3 голосов
/ 09 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...