Как обнаружить и отладить устаревшие записи в кэше? - PullRequest
5 голосов
/ 29 января 2009

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

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

Ответы [ 3 ]

3 голосов
/ 06 февраля 2009

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

0 голосов
/ 09 февраля 2009

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

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

  • Добавить поле метки времени и не выдавать ошибку, если метки времени ближе определенного значения (возможно, процесс не успел обновить кэш)
  • Добавить поле в БД, в котором указан источник обновления (номер скрипта / строки). Это может помочь в отслеживании части, которая пропускает часть аннулирования кэша
0 голосов
/ 29 января 2009

Вы можете использовать оптимистичное управление параллелизмом, которое включает добавление еще одного столбца к таблице (либо метки времени, либо эквивалентного ему, либо просто обычного типа int) и использование его при выполнении обновлений. Вот как вы можете использовать его (в случае, когда обычный 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...