cache
, переданный ApolloServer
, насколько мне известно, строго используется в контексте RESTDataSource
. При извлечении ресурсов из конечной точки REST сервер проверяет заголовок Cache-Control
в ответе и, если он существует, соответствующим образом кэширует ресурс. Это означает, что если заголовок равен max-age=86400
, ответ будет кэшироваться с TTL 24 часа, и до истечения срока действия записи в кэше он будет использоваться вместо вызова того же URL-адреса REST.
Это отличается от механизма кэширования, который вы реализовали, поскольку ваш код кэширует ответ из базы данных. Их намерения одинаковы, но они работают с разными ресурсами. Единственный способ, которым ваш код эффективно продублирует то, что уже делает cache
ApolloServer, - это если бы вы написали аналогичный DataSource
для конечной точки REST.
Хотя оба этих кэша сокращают время, необходимое для обработки вашего ответа GraphQL (выборка из кэша заметно быстрее, чем из базы данных), кэширование на стороне клиента уменьшает количество запросов, которые должны быть отправлены на ваш сервер. В частности, InMemoryCache
позволяет вам повторно использовать один запрос в разных местах вашего сайта (например, в различных компонентах React), получая запрос только один раз.
Поскольку кэш на стороне клиента нормализован, это также означает, что если ресурс уже кэшируется при выборке с помощью одного запроса, вы можете избежать его повторного добавления при запросе с другим запросом. Например, если вы извлекаете список пользователей с одним запросом, а затем извлекаете пользователя с другим запросом, ваш клиент может быть настроен на поиск пользователя в кэше вместо выполнения второго запроса.
Важно отметить, что, хотя ресурсы, кэшированные на стороне сервера, обычно имеют TTL, InMemoryCache
не имеет. Вместо этого он использует «политики выборки» для определения поведения отдельных запросов. Это позволяет вам, например, иметь запрос, который всегда выбирает с сервера, независимо от того, что находится в кэше.
Надеюсь, это поможет проиллюстрировать, что кэширование на стороне сервера и на стороне клиента полезно, но совершенно по-разному.