Какие механизмы используются для автоматического удаления устаревших данных из кэша
Что проверяют
Понимаете ли вы, какие кэши живут на стороне фронтенда и кто в каждом из них отвечает за удаление старого: браузер, сервис-воркер или библиотека запросов. Следом обычно спрашивают, как сделать, чтобы пользователь увидел новые данные сразу после мутации.
Как отвечать
Назовите общие стратегии одной строкой: TTL (по времени), LRU (давно не использованное), LFU (редко используемое), FIFO. Потом покажите, где они встречаются во фронтенде:
- HTTP-кэш браузера: управляется заголовками.
Cache-Control: max-ageзадаёт срок свежести, после него браузер делает условный запрос сETagилиLast-Modifiedи получает304.stale-while-revalidateразрешает отдать устаревший ответ и обновить его в фоне. Статике с хэшем в имени ставятmax-age=31536000, immutable; - Cache Storage в Service Worker: собственного TTL нет, записи живут, пока вы их не удалите. Старые версии чистят в событии
activate, а в Workbox для этого естьExpirationPluginсmaxEntriesиmaxAgeSeconds; - квота хранилища: при нехватке места браузер вытесняет данные целых origin, начиная с давно не посещённых. Защитить их можно запросом
navigator.storage.persist(); - кэш серверного состояния: в TanStack Query данные устаревают через
staleTime(по умолчанию 0) и удаляются из памяти черезgcTime(по умолчанию 5 минут) после ухода последнего подписчика. В RTK Query аналогkeepUnusedDataFor, 60 секунд по умолчанию; - инвалидация по событию:
invalidateQueriesпосле мутации, теги в RTK Query, обновление через WebSocket. Это надёжнее любого таймера.
Где спотыкаются
Думают, что localStorage или IndexedDB когда-нибудь очистятся сами по сроку. Срока у них нет, время жизни придётся хранить рядом с данными и проверять при чтении.
Путают staleTime и gcTime. Устаревшие данные по-прежнему лежат в кэше и показываются, пока идёт фоновый запрос, а удаляются только по gcTime.
Кэшируют HTML-страницу с долгим max-age. После релиза пользователи получают старую разметку со ссылками на удалённые бандлы, а до истечения срока браузер даже не спросит сервер.