GraphQL Apollo Server使用Memcached缓存及无法通过telnet取数问题
问题解答
1. 为什么缓存生效但telnet查不到Memcached中的数据
Apollo 服务端配置的全局缓存默认使用哈希生成的非明文键:
- 如果你使用的是继承自官方
RESTDataSource的自定义数据源,会自动基于请求的URL、请求参数、请求头等信息计算哈希值作为缓存键,不会使用可直接猜到的明文键 - 你自己手动测试写入的是明文键,和Apollo自动生成的键规则不同,自然无法通过telnet搜索到对应的缓存数据
你可以通过修改缓存配置加日志的方式打印出实际使用的缓存键,拿到对应键后再用telnet查询就能匹配到结果:
const cache = new MemcachedCache( '127.0.0.1:11211', { retries: 10, retry: 10000 }, ); // 临时加日志打印缓存键,确认缓存写入情况 const originalSet = cache.set.bind(cache); cache.set = async (key, value, ttl) => { console.log('写入缓存键:', key); return originalSet(key, value, ttl); }; const server = new ApolloServer({ typeDefs, resolvers, cache, dataSources: () => ({ moviesAPI: new MoviesAPI(), }), });
2. 是否需要在resolver中手动编写缓存逻辑
绝大多数场景不需要手动写缓存逻辑:
- 如果你使用官方
RESTDataSource作为基类实现数据源,它已经默认对接了你全局配置的Memcached缓存,会自动对GET请求做缓存、自动命中返回,不会触发后端API调用,完全不需要额外开发 - 只有以下特殊场景需要手动操作缓存:
- 自定义的数据源没有继承
RESTDataSource,需要自己对接缓存接口 - 需要自定义缓存TTL、指定部分请求不缓存、缓存Mutation操作结果
- 需要直接对Resolver返回的字段做缓存(可配合
@cacheControl指令实现,也不需要写硬编码逻辑)
- 自定义的数据源没有继承
内容的提问来源于stack exchange,提问作者eroy
相关产品推荐
相关产品推荐

