Перечень ячеек есть (седьмая часть). Теперь нужно регулярно сверять: всё ли из перечня лежит в кэше и с правильной ли версией. Это сторож полноты. Он работает раз в 5 минут, поэтому должен стоить копейки.

Это восьмая часть цикла «Кэш фрагментов и Redis».

Сверка одним запросом

Пока ячейки жили во временных записях WordPress в базе, сверка делалась одним SQL-запросом по префиксу ключей: 1417 ячеек за 0,02 с.

Ловушка: сверять версию, а не наличие

После выката все ячейки на месте — но со старой версией кода, а значит, при чтении дадут MISS. Сторож, который проверяет только наличие, пишет «холодных: 0». Ровно в тот момент, когда холодно всё.

Первая попытка — искать версию в самом значении через LIKE по сериализованным данным: 10,79 с на 4609 ячеек и 400 МБ. Для пятиминутного сторожа слишком дорого.

Решение нашлось в соседней колонке. У каждой временной записи WordPress хранит время истечения. Если срок жизни у всех ячеек одинаковый, то время истечения − срок — это время записи. Записана раньше выката — значит, со старым кодом.

SELECT SUBSTRING(option_name, 20) AS k
FROM wp_options
WHERE option_name LIKE '\_transient\_timeout\_frag\_%'
  AND CAST(option_value AS UNSIGNED) - 604800 < @code_version;

0,05 с, точность 99,7 %. Требование одно — единый срок жизни у всех ячеек.

Перечень — теми же функциями, что ставят в очередь

Ожидаемый перечень сторож должен строить теми же функциями, что строят очередь прогрева, — иначе они разойдутся. На одном сайте ожидалось 1202 ячейки, а в реестре было 1156. «Почти совпадает» — это и есть дыра: 46 ячеек, которые никто никогда не греет.

Построение перечня тоже надо делать дёшево: tax_query одним запросом вместо has_term в цикле — 4,3 → 2,3 с.

Сколько добирать за раз

Сторож ставит холодное в очередь порциями. Порция в 200 ячеек за 5 минут оказалась вдвое медленнее воркера — воркер простаивал, а холодное ждало. Подняли до 1000.

Как доказать, что сторож работает

  1. поменять версию кода у одной ячейки — сверка должна показать 1;
  2. изменить время манифеста сборки — сверка должна показать весь перечень.

Ловушка при разработке: если на тестовой копии запущена сборка фронта в режиме наблюдения, каждая пересборка меняет время манифеста — и каждый раз весь кэш блоков становится холодным.

Сторож кэша докладывает «всё тёплое», а посетители ждут?

Пришлите адрес — проверю, что именно сверяет ваш сторож.

· полезно?
АЧ
Алексей Чикун веб-разработчик, команда TRIOHEAD

Делаю сайты и сервисы целиком: от вёрстки до сервера. Пишу о том, что проверил на своих проектах.

Комментарии

// загружаю комментарии…

Комментарии публикуются после проверки. Ссылки и HTML не принимаются.