KeyValue 缓存接口
export interface KeyValueCache<
V = string,
SO extends KeyValueCacheSetOptions = KeyValueCacheSetOptions,
> {
get(key: string): Promise<V | undefined>;
set(key: string, value: V, options?: SO): Promise<void>;
delete(key: string): Promise<boolean | void>;
}
这个接口定义了一个最小相容的缓存,意在被阿波罗服务器使用(但不限于). 执行者主要是: KeyvAdapter 从 @apollo/utils.keyvadapter 软件包。 (KeyvAdapter 与a项一并审议 Keyv 可能你更有趣 除非你真的在建缓存!)
记忆LRUCACHE
这个课包 lru-cache 执行 KeyValueCache 接口。 它接受 LRUCache.Options 象建筑者所争论的那样 LRUCache 被创造的。 默认 maxSize 财务报告和审定财务报表 sizeCalculator 用于防止未绑定的缓存;这些都可以通过构造器参数来调整.
const cache = new InMemoryLRUCache({
// create a larger-than-default `LRUCache`
maxSize: Math.pow(2, 20) * 50,
});
前置 KeyValue 缓存
这个课包了一个 KeyValueCache 为通过此包输入缓存的密钥提供指定的前缀.
const cache = new InMemoryLRUCache();
const prefixedCache = new PrefixingKeyValueCache(cache, "apollo:");
使用这个方法的一个原因是,如果一个软件的单块想要使用缓存来进行多个特性. 例如,你可以通过一个 KeyValueCache 作为 cache 选项到 @apollo/server是因为 ApolloServer class; 它向插件和其他特性提供此缓存作为默认要使用的缓存( 如果用户不提供特定插件自己的缓存) 。 每个特性都使用 PrefixingKeyValueCache 具有不同的前缀来防止不同特性相踩对方的数据.
但是,如果你明确配置其中之一,你可以 没有 想要添加此前缀 。 这样的话,你可以将您的缓存包裹在一个缓存中 PrefixingKeyValueCache.cacheDangerouslyDoesNotNeedPrefixesForIsolation。这个缓存与它所包裹的缓存的唯一区别是,当它直接传递到一个 PrefixingKeyValueCache,不应用前缀.
也就是说,我们假设你正在使用一个这样的课程:
class SomePlugin {
private cache: KeyValueCache;
constructor(cache: KeyValueCache) {
this.cache = new PrefixingKeyValueCache(cache, "some:");
}
}
如果您将您的插件设置为 new SomePlugin({ cache: myRedisCache }) 然后插件会添加 some: 当与您的缓存交互时, 切入到所有键上, 但如果您设置为 new SomePlugin({ cache: PrefixingKeyValueCache.cacheDangerouslyDoesNotNeedPrefixesForIsolation(myRedisCache) }),然后插件不会应用其前缀。 您只应该在您确信此特性使用此缓存不会与其它特性相重叠的情况下这样做:也许这是您为使用此缓存而配置的唯一特性,或者也许该特性提供了对缓存密钥的适当控制,您可以确保该密钥的隔离而无需插件的前缀.
软件 ApolloServer 传出单曲 KeyValueCache 如果 PrefixesAreUnnecessaryForIsolationCache 向它提供; 它可以用静态检查这个条件 PrefixingKeyValueCache.prefixesAreUnnecessaryForIsolation 方法(比 instanceof 检查万一有多个副本 @apollo/utils.keyvaluecache 已安装).
错误是 misses 缓存
这个课包了一个 KeyValueCache 为通过Redis这样的客户端连接的缓存提供出错容性。 如果有一个 错误,这个包件将把它当作缓存错失(如果 logger 页:1.
实例用法( 使用 keyv Redis客户端和我们的 KeyvAdapter看起来像这样
import Keyv from "keyv";
import { KeyvAdapter } from "@apollo/utils.keyvadapter";
import { ErrorsAreMissesCache } from "@apollo/utils.keyvaluecache";
const redisCache = new Keyv("redis://user:pass@localhost:6379");
const faultTolerantCache = new ErrorsAreMissesCache(
new KeyvAdapter(redisCache),
);