Как обнаружить и отладить устаревшие записи кэша?

Я использую memcached с PHP, пытаясь использовать интенсивное кэширование, чтобы избежать чтения базы данных. Я аннулирую кеш при обновлении (приложение аннулирует). Но устаревшие данные кеша становятся большой проблемой. В основном это происходит из-за ошибки в аннулировании (аннулирует неверный ключ ИЛИ забыл сделать недействительным запись в кеше при ОБНОВЛЕНИИ).

Есть ли хороший метод для обнаружения/отладки ошибок такого типа во время разработки/производства?


person Shameem    schedule 29.01.2009    source источник


Ответы (3)


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

person twk    schedule 05.02.2009

Вы можете использовать оптимистичный контроль параллелизма, который включает в себя добавление в таблицу еще одного столбца (временная метка или эквивалент, или просто целое число) и использование его при выполнении обновлений. Вот как вы можете его использовать (в случае, если обычный int является «тегом версии»):

update BlogPost set PublishedOn = :publishedOn, VersionTag = VersionTag + 1
where ID = :id and VersionTag = :versionTag

И если предположить, что метка времени автоматически обновляется вашей СУБД, вот как это делается с метками времени:

update BlogPost set PublishedOn = :publishedOn
where ID = :id and Timestamp = :timestamp
person Anton Gogolev    schedule 29.01.2009

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

Конечно, это можно уточнить:

  • Добавьте поле временной метки и не выдавайте ошибку, если временные метки ближе определенного значения (возможно, процесс не успел обновить кеш)
  • Добавьте в БД поле, указывающее источник обновления (скрипт/номер строки). Это может помочь в отслеживании части, которая пропускает часть инвалидации кеша.
person Grey Panther    schedule 09.02.2009