Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to cache using apollo-server

The apollo basic example at https://www.apollographql.com/docs/apollo-server/features/data-sources.html#Implementing-your-own-cache-backend they state that doing a redis cache is as simple as:

const { RedisCache } = require('apollo-server-cache-redis');

const server = new ApolloServer({
  typeDefs,
  resolvers,
  cache: new RedisCache({
    host: 'redis-server',
    // Options are passed through to the Redis client
  }),
  dataSources: () => ({
    moviesAPI: new MoviesAPI(),
  }),
});

When I look at the examples of non-redis, it states that it's a simple { get, set } for cache. This means I should theoretically be able to do.

cache : {
   get : function() {
     console.log("GET!");
   },
   set : function() {
     console.log("SET!");
   }
}

No matter what I try, my cache functions are never called when I'm utilizing the graphQL explorer that apollo-server provides natively.

I have tried with cacheControl : true and with cacheControl set like it is in https://medium.com/brikl-engineering/serverless-graphql-cached-in-redis-with-apollo-server-2-0-f491695cac7f . Nothing.

Is there an example of how to implement basic caching in Apollo that does not utilize the paid Apollo Engine system?

like image 780
Nucleon Avatar asked Aug 15 '26 10:08

Nucleon


1 Answers

You can look at the implementation of this package which caches the full response to implement your own cache.


import { RedisCache } from "apollo-server-redis";
import responseCachePlugin from "apollo-server-plugin-response-cache";


 const server = new ApolloServer({
    ...
    plugins: [responseCachePlugin()],
     cache: new RedisCache({
        connectTimeout: 5000,
        reconnectOnError: function(err) {
          Logger.error("Reconnect on error", err);
          const targetError = "READONLY";
          if (err.message.slice(0, targetError.length) === targetError) {
            // Only reconnect when the error starts with "READONLY"
            return true;
          }
        },
        retryStrategy: function(times) {
          Logger.error("Redis Retry", times);
          if (times >= 3) {
            return undefined;
          }
          return Math.min(times * 50, 2000);
        },
        socket_keepalive: false,
        host: "localhost",
        port: 6379,
        password: "test"
      }),
 });


like image 197
Abhishek Avatar answered Aug 18 '26 04:08

Abhishek