gpt4 book ai didi

caching - 如何使 Apollo Server RESTDataSource 中的缓存失效

转载 作者:行者123 更新时间:2023-12-02 02:56:10 25 4
gpt4 key购买 nike

使用 documentation 中的简单“电影 API”示例。我在 getMovie 函数中添加了 ttl,以便将结果缓存 10 分钟。如何使 updateMovie 函数中的缓存失效?

const { RESTDataSource } = require('apollo-datasource-rest');

class MoviesAPI extends RESTDataSource {
async getMovie(id) {
return this.get(`movies/${id}`, {}, { cacheOptions: { ttl: 600 } });
}

async updateMovie(id, data) {
const movie = await this.put(`movies/${id}`, data);

// invalidate cache here?!

return movie;
}
}

我知道传递给ApolloServer的KeyValueCache接口(interface)提供了delete功能。但是,该对象似乎没有在数据源中公开。它封装在 HTTPCache 内,仅公开 fetch 函数。 KeyValueCache 也包含在 PrefixingKeyValueCache 中,因此假设 RESTDataSource< 的内部实现,在没有一些令人讨厌的黑客攻击的情况下,似乎几乎不可能在缓存中删除某些内容。/.

最佳答案

我能找到的最好的解决方案似乎是只保留 HTTP 缓存层,并使用单独的缓存层:

const { RESTDataSource } = require('apollo-datasource-rest');
import { PrefixingKeyValueCache } from 'apollo-server-caching';

class MoviesAPI extends RESTDataSource {
initialize(config) {
super.initialize(config);
this.movieCache = new PrefixingKeyValueCache(config.cache, 'movies:');
}

async getMovie(id) {
const cached = await this.movieCache.get(id);
if (cached) return cached;

const movie = await this.get(`movies/${id}`);
await this.movieCache.set(id, movie);
return movie;
}

async updateMovie(id, data) {
const movie = await this.put(`movies/${id}`, data);

await this.movieCache.delete(id);

return movie;
}
}

它仍然使用应用程序缓存,但前缀与 HTTP 缓存不同。

关于caching - 如何使 Apollo Server RESTDataSource 中的缓存失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61073879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com