Перечень ячеек есть (седьмая часть). Теперь нужно регулярно сверять: всё ли из перечня лежит в кэше и с правильной ли версией. Это сторож полноты. Он работает раз в 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;
- изменить время манифеста сборки — сверка должна показать весь перечень.
Ловушка при разработке: если на тестовой копии запущена сборка фронта в режиме наблюдения, каждая пересборка меняет время манифеста — и каждый раз весь кэш блоков становится холодным.
Сторож кэша докладывает «всё тёплое», а посетители ждут?
Пришлите адрес — проверю, что именно сверяет ваш сторож.
// загружаю комментарии…