The docs (https://www.apollographql.com/docs/apollo-server/features/data-sources.html#Using-Memcached-Redis-as-a-cache-storage-backend) show code like this:
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(),
}),
});
I was wondering how that cache
key is used, considering it seems like the caching is actually custom implemented in something like MoviesAPI()
and then used via context.dataSources.moviesAPI.someFunc()
. For example, say I wanted to implement my own cache for a SQL database. It'd look like
cache: new RedisCache({
host: 'redis-server',
}),
dataSources: () => ({
SQL: new SQLCache(),
}),
});
where SQLCache
has my own function that connects to the RedisCache
like:
getCached(id, query, ttl) {
const cacheKey = `sqlcache:${id}`;
return redisCache.get(cacheKey).then(entry => {
if (entry) {
console.log('CACHE HIT!');
return Promise.resolve(JSON.parse(entry));
}
console.log('CACHE MISS!');
return query.then(rows => {
if (rows) redisCache.set(cacheKey, JSON.stringify(rows), ttl);
return Promise.resolve(rows);
});
});
}
So that means I have RedisCache
in both the ApolloServer
cache
key and dataSource
implementation. Clearly, the RedisCache
is used in the dataSource
implementation, but then what does that ApolloServer
cache
key do exactly?
Also on the client, examples mostly show use of InMemoryCache
instead of Redis cache. Should the client Apollo cache be a different cache from the server cache or should the same cache like RedisCache
be in both places?