You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js GraphQL服务端实现数据缓存以降低数据库访问频次

服务端GraphQL内部缓存实现方案

以下是Node.js生态下适配你需求的几个成熟方案,按照落地难度从低到高排列:

1. Apollo Server内置缓存(新手优先选择)

如果你用Apollo作为GraphQL服务端实现,直接用官方自带的缓存能力即可,不需要额外引入第三方依赖,完全匹配你的需求:

  • 支持自动对相同查询+变量的请求生成缓存键,不同客户端发起相同请求会直接返回缓存结果
  • 支持标签化缓存,数据库变更时可以批量清理指定类型的缓存,不需要逐个维护缓存键
    配置示例:
import { ApolloServer, InMemoryLRUCache } from '@apollo/server';

const server = new ApolloServer({
  typeDefs,
  resolvers,
  // 开启内置LRU内存缓存
  cache: new InMemoryLRUCache({
    maxSize: Math.pow(2, 20) * 100, // 缓存上限100MB,可自行调整
    ttl: 3600, // 默认缓存1小时
  }),
});

给查询打标签、清理缓存示例:

// resolver中给图书列表查询打标签
const resolvers = {
  Query: {
    books: async (_, __, { cacheInfo }) => {
      cacheInfo.setCacheHint({ tags: ['books:list'] });
      return db.books.findAll();
    }
  }
}
// 图书表数据变更时,清理对应标签的所有缓存
await server.cacheKeyCache.deleteByTag('books:list');

2. 自定义LRU缓存(适合非Apollo的GraphQL实现)

如果你用的是graphql-js原生或者其他轻量GraphQL框架,可以用lru-cache包自行实现缓存逻辑:

  • 安装依赖:npm install lru-cache
  • 缓存封装示例:
import { LRUCache } from 'lru-cache';

// 初始化全局缓存实例
const gqlCache = new LRUCache({
  max: 500, // 最大缓存条目数
  ttl: 1000 * 60 * 60, // 缓存1小时过期
});

// resolver中使用缓存
const resolvers = {
  Query: {
    books: async () => {
      const cacheKey = 'query:books:all';
      // 优先读缓存
      const cachedData = gqlCache.get(cacheKey);
      if (cachedData) return cachedData;
      // 无缓存读数据库
      const books = await db.books.findAll();
      // 写入缓存
      gqlCache.set(cacheKey, books);
      return books;
    }
  }
}

// 图书表变更时清理对应缓存
gqlCache.delete('query:books:all');

3. Redis分布式缓存(适合多实例部署场景)

如果你的GraphQL服务需要多实例扩容,单实例内存缓存会出现多实例数据不一致的问题,这时候用Redis做全局共享缓存即可:

  • 所有服务实例共享同一份缓存数据,你清理缓存时只需要删除一次Redis对应键,所有实例返回的数据都会同步更新,完全满足所有用户数据集一致的要求。
  • 用法和上面的LRU缓存逻辑一致,只是把缓存读写逻辑换成Redis客户端的get/set/del操作即可。

注意如果你同时使用了GraphQL Subscriptions,建议在订阅触发数据推送的逻辑里,同步清理对应缓存,避免出现订阅已经推送了新数据,但用户主动查询还拿到旧缓存的问题。

内容的提问来源于stack exchange,提问作者Jan S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:39:03