Размер кэша в RTK Query определяет, сколько времени и при каких условиях данные, полученные из запроса, сохраняются в памяти Redux store. Это один из ключевых механизмов оптимизации, влияющий на количество сетевых запросов, скорость отклика интерфейса и поведение приложения при повторных обращениях к одним и тем же данным.
Кэш в RTK Query не является статической структурой. Он управляется через жизненный цикл подписок на данные и через параметры конфигурации, связанные с очисткой неиспользуемых записей. Основной принцип заключается в том, что данные сохраняются до тех пор, пока они считаются «актуально используемыми» хотя бы одним компонентом или подпиской.
Ключевым инструментом регулирования размера кэша выступает параметр
keepUnusedDataFor, задаваемый в createApi или
на уровне отдельных endpoint’ов.
T_{cache} = T_{unsubscribed} + keepUnusedDataFor
Этот параметр определяет, сколько секунд данные продолжают храниться в кэше после того, как последний подписчик перестал их использовать.
keepUnusedDataFor запись удаляется из
кэша.Значение по умолчанию — 60 секунд, что обеспечивает баланс между повторным использованием данных и освобождением памяти.
RTK Query использует модель подписок, где каждая активная подписка удерживает данные в памяти.
Таким образом, размер кэша фактически динамически определяется числом активных подписок, а не количеством запросов.
Каждый уникальный набор аргументов запроса создает отдельную запись в кэше. Это означает, что размер кэша растет линейно относительно разнообразия параметров.
Пример:
getUsers() → 1 записьgetUsers({ page: 1 }) → отдельная записьgetUsers({ page: 2 }) → еще одна записьN_{cache} = _{i=1}^{n} Q_i
где Q_i — уникальная комбинация аргументов запроса.
Это приводит к необходимости контролировать количество уникальных запросов, особенно в интерфейсах с пагинацией, фильтрацией и сортировкой.
Мутации (useMutation) напрямую не увеличивают размер
кэша в классическом смысле, но влияют на него косвенно через механизмы
инвалидации.
После выполнения мутации:
tagsТаким образом, агрессивная стратегия инвалидации может приводить к увеличению количества активных записей.
Размер кэша также зависит от стратегии повторной загрузки данных.
Если включен этот параметр:
Принудительное обновление игнорирует существующий кэш и может создавать новые записи, увеличивая временный размер хранилища до завершения старых запросов.
RTK Query выполняет дедупликацию запросов:
Это критический механизм, предотвращающий неконтролируемый рост кэша при частых повторных вызовах одного endpoint.
Однако важно учитывать, что дедупликация действует только на активные запросы. После завершения и истечения времени хранения создаётся новая запись при следующем вызове.
Типовые значения:
Выбор значения напрямую влияет на объем памяти, занимаемый Redux store.
RTK Query хранит кэш в памяти JavaScript, что означает:
Особенно это заметно в SPA с длительной сессией и большим количеством фильтров и страниц.
Полный сброс кэша возможен через
api.util.resetApiState().
Последствия:
Используется в сценариях:
Контроль размера кэша достигается сочетанием нескольких подходов:
keepUnusedDataForАрхитектурные решения напрямую определяют поведение кэша:
RTK Query эффективно работает только при предсказуемой структуре запросов и контролируемом разнообразии параметров.
При длительной сессии наблюдается следующий цикл:
Баланс между накоплением и очисткой определяет фактический размер кэша в любой момент времени.