Выявление проблем в реализации проверки срока жизни кеша

Проверка времени отдельно от значения создаёт гонки и stampede: много запросов одновременно начинают обновление. В примере также не показано, откуда берётся data и что означает cachedTime.

Короткий ответ

Что ответить на собеседовании

Проверка времени отдельно от значения создаёт гонки и stampede: много запросов одновременно начинают обновление. В примере также не показано, откуда берётся data и что означает cachedTime.

Подробный разбор

Ответ с пояснениями

Условие

В представленном фрагменте PHP‑кода реализована проверка времени жизни кешированных данных. Необходимо проанализировать и указать недостатки данного подхода, особенно в условиях одновременной обработки большого количества запросов.

$cachedTime = $memCache->get("time_$key");

if ($cachedTime < time()) {
    // обновляем кеш
    return $data;
} else {
    return $data;
}

Обратите внимание на возможные гонки, избыточные обращения к кешу и другие проблемы, которые могут возникнуть при параллельной работе.

Ответ

Проверка времени отдельно от значения создаёт гонки и stampede: много запросов одновременно начинают обновление. В примере также не показано, откуда берётся data и что означает cachedTime.

Храните значение с нативным TTL или вместе с expires_at, явно различайте cache miss и допустимые данные. Для дорогого обновления используйте блокировку с владельцем и ограниченным сроком; после захвата повторно проверьте кеш. Остальным запросам можно вернуть допустимую устаревшую копию или ограниченно подождать. Случайный разброс TTL уменьшает массовое одновременное истечение. Обе одинаковые ветки return сами по себе ничего не обновляют.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее