PHP Memcache потенциальные проблемы? - PullRequest
0 голосов
/ 14 апреля 2011

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

  1. Я пишу систему обмена баннерами.
  2. Информация о баннерах хранится в базе данных.
  3. Существуют разные сайты с разным трафиком, загружающие php-скрипт, который генерирует код для этих баннеров. (чтобы баннеры отображались на сайте клиента)
  4. Когда баннер отображается впервые - он кэшируется с помощью memcache.
  5. Время жизни баннера, например, 1 час.
  6. Каждый час кэш обновляется.

Потенциальная проблема, которую я вижу в этой задаче, находится на шаге 4 и 6. Если у нас, например, 100 сайтов с большим трафиком, может случиться так, что сценарий будет запущен одновременно несколькими экземплярами. Как я могу гарантировать, что по истечении срока действия кеша он будет восстановлен один раз и данные останутся без изменений?

1 Ответ

2 голосов
/ 14 апреля 2011

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

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

// returns false if there is no value or the value is expired
result = cache_check(key)

if (!result)
{
    result = fetch_from_db()

    // set it for next time, until it expires anyway
    cache_set(key, result, expiry)
}

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

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

...