Apollo Server - 关于缓存/数据源选项的混淆

2024-02-24

文档(https://www.apollographql.com/docs/apollo-server/features/data-sources.html#Using-Memcached-Redis-as-a-cache-storage-backend https://www.apollographql.com/docs/apollo-server/features/data-sources.html#Using-Memcached-Redis-as-a-cache-storage-backend)显示这样的代码:

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(),
  }),
});

我想知道怎么会这样cache使用 key ,考虑到缓存实际上是在类似的东西中自定义实现的MoviesAPI()然后通过使用context.dataSources.moviesAPI.someFunc()。例如,假设我想为 SQL 数据库实现自己的缓存。它看起来像

  cache: new RedisCache({
    host: 'redis-server',
  }),
  dataSources: () => ({
    SQL: new SQLCache(),
  }),
});

where SQLCache有我自己的功能连接到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);
      });
    });
  }

所以这意味着我有RedisCache在两个ApolloServer cache钥匙和dataSource执行。显然,RedisCache用于dataSource实施,但是那又是什么呢?ApolloServer cache关键究竟是做什么?

同样在客户端上,示例主要显示了使用InMemoryCache而不是Redis缓存。客户端 Apollo 缓存是否应该与服务器缓存不同,或者应该是相同的缓存,例如RedisCache都在两个地方吗?


The cache传递给ApolloServer据我所知,严格用于RESTDataSource。当从 REST 端点获取资源时,服务器将检查Cache-Control响应中的标头,如果存在,将适当地缓存资源。这意味着如果标题是max-age=86400,响应将以 24 小时的 TTL 进行缓存,并且在缓存条目过期之前,将使用它而不是调用相同的 REST url。

这与您实现的缓存机制不同,因为您的代码缓存来自数据库的响应。他们的意图是相同的,但他们使用不同的资源。您的代码有效复制 ApolloServer 的唯一方法cache如果你已经写了类似的DataSource改为 REST 端点。

虽然这两种缓存都减少了处理 GraphQL 响应所需的时间(从缓存获取明显快于从数据库获取),但客户端缓存减少了必须向服务器发出的请求数量。最值得注意的是,InMemoryCache允许您在站点中的不同位置(例如 React 中的不同组件)重复使用一个查询,同时只获取一次查询。

由于客户端缓存是标准化的,这也意味着如果通过一个查询获取资源时已经缓存,则您可以避免在通过另一个查询请求该资源时重新获取该资源。例如,如果您使用一个查询获取用户列表,然后使用另一个查询获取用户,则可以将客户端配置为在缓存中查找该用户,而不是进行第二个查询。

需要注意的是,虽然服务器端缓存的资源通常具有 TTL,但InMemoryCache才不是。相反,它使用“获取策略”来确定各个查询的行为。例如,这可以让您进行以下查询always从服务器获取,无论缓存中有什么。

希望这有助于说明服务器端和客户端缓存都很有用,但方式却截然不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apollo Server - 关于缓存/数据源选项的混淆 的相关文章

随机推荐

  • 从 git 中永久删除目录

    在我的个人 git 存储库中 我有一个目录 其中包含数千个不再需要的小图像 有没有办法从整个 git 历史记录中删除它们 我努力了 git filter branch index filter git rm rf cached ignore
  • 无法将 Android 库资源设为私有?

    created 公共 xml那里的价值观和增加的公共资源
  • 在 JavaScript 中包含 JSF 表达式语言

    我找到了这个问题和答案在 JavaScript 文件中混合 JSF EL https stackoverflow com q 2547814 1502416 这个问题是在 2 年前提出的 所以想知道 JSF 2 0 是否还有其他替代方案 我
  • 使用 Mock.side_effect 作为实例方法

    我正在尝试在 Python 中模拟一个带有副作用的实例方法 我希望 期望使用初始 self 参数来调用我的副作用 我可以用它来确定返回值 所以我有这样的事情 import mock class TestCases unittest Test
  • 创建新的 WPF 项目时已添加具有相同键的项目

    我刚刚创建了一个新的 WPF 我在 Visual Studio 2015 Pro 中创建了一个项目 在 创建项目 对话框消失后 我没有得到设计器 这个 ArgumentException 只是显示在那里 我没有添加任何控件或任何东西 刚刚创
  • 空基类优化现在是强制优化吗(至少对于标准布局类)?

    根据C 11 9 1 7 草案 n3376 a 标准布局class 是一个类 没有非标准布局类 或此类类型的数组 类型的非静态数据成员或引用 没有虚函数 10 3 和虚基类 10 1 对所有非静态数据成员具有相同的访问控制 第 11 条 没
  • 连续按下视图控制器时缺少导航或后退按钮标题

    我有一个问题UINavigationController当连续推动视图控制器时 有关信息 我使用 XCode 7 0 针对 iOS 8 进行构建 并在 Simulator 9 0 上运行应用程序 这是用户手动点击表格视图单元格时的视图 如上
  • 使用 concat() 将行附加到数据框

    我定义了一个空数据框 df pd DataFrame columns Name Weight Sample 并想要在 for 循环中追加行 如下所示 for key in my dict row Name key Weight wg Sam
  • 子类是否应该调用直接超类中指定的初始值设定项?

    我看到了一些示例代码 这让我想知道如何在超类中调用指定的初始值设定项 假设我有一些代码 interface NewTableViewCell UITableViewCell end implementation NewTableViewCe
  • Google 是否允许其他人使用他们的“您是说”API 吗?

    我查遍了互联网 但没有找到确切的API 我想在我自己的网站上使用他们的 你的意思是吗 功能 Pygoogle 有一个 api 调用 http pygoogle sourceforge net dist doc public google m
  • Magento Memcached 会话

    我目前正在尝试使用以下设置为 Magento 设置生产环境 2 个 Web 服务器 1 个数据库服务器 负载均衡器 因此 负载均衡器将在 Web 服务器之间分配流量 但不会使用粘性会话 为了解决服务器之间共享会话的问题 我选择使用 Memc
  • Tensorflow 2.1 满内存和 tf.function 被调用两次

    我正在使用 Tensorflow 2 1 开发卷积自动编码器 这是代码 class ConvAutoencoder def init self input shape latent dim self input shape input sh
  • 关闭选项菜单不起作用?

    我只想使用以下代码在特定选项卡中显示选项菜单 public class MainActivity extends FragmentActivity implements ActionBar TabListener The link andr
  • 在android studio中将Unity场景显示为子视图

    我对在 android studio 项目中显示 3D 模型和图形有点困惑 我一直在与Rajawali https github com Rajawali Rajawali 这是一个 Android OpenGL ES 2 0 3 0 引擎
  • 找出重复数字的重复次数

    这是我和朋友们一起写的算法 在 stackoverflow 网站上 该算法将仅找到第一个重复的数字并返回它 这适用于O n 我想完成这个算法 帮助我通过重复获得重复的数字 认为我有 1 1 3 0 5 1 5 我希望这个算法返回2重复的数字
  • 从聚合返回整个文档

    我使用以下查询来获取数据库中每篇文章的最新评论 db comments aggregate match post id in ObjectId 52c5ce24dca32d32740c1435 ObjectId 52c5ce24dca32d
  • jRails 与原型

    我并不是想让这个问题成为一个偏好问题 我真的想知道人们使用 jQuery 和 Rails 或 jRails 进行开发的经验如何 到目前为止 包括我在内的大多数 Rails 用户都在使用 Prototype 然而 我混合了很多 jQuery
  • “iframe沙箱”技术安全吗?

    Update 由于这个问题没有答案 我稍微改变一下问题 下面链接的 Dean 博客上的帖子评论表明该技术在 Safari 中不起作用 我现在的问题是 下面描述的技术在现代浏览器中是否有效 特别是有人可以确认它是否在 Safari 中有效 这
  • 原始资源与 SQLite 数据库

    我正在创建一个应用程序 它将使用大量数据 无论出于何种意图和目的 这些数据都是静态的 我原以为使用 SQLite 数据库来处理该数据是最有意义的 我想知道仅使用 XML 文件然后将其作为原始资源访问是否有意义 请记住 可能会有大量数据 大约
  • Apollo Server - 关于缓存/数据源选项的混淆

    文档 https www apollographql com docs apollo server features data sources html Using Memcached Redis as a cache storage ba