diff --git a/packages/apollo-server-redis/package.json b/packages/apollo-server-redis/package.json index ef369a74..8636e189 100644 --- a/packages/apollo-server-redis/package.json +++ b/packages/apollo-server-redis/package.json @@ -25,6 +25,7 @@ "dependencies": { "apollo-server-caching": "0.1.0-rc.11", "apollo-server-env": "2.0.0-rc.11", + "dataloader": "^1.4.0", "redis": "^2.8.0" }, "devDependencies": { diff --git a/packages/apollo-server-redis/src/index.ts b/packages/apollo-server-redis/src/index.ts index 7ae20246..c2088ef9 100644 --- a/packages/apollo-server-redis/src/index.ts +++ b/packages/apollo-server-redis/src/index.ts @@ -1,6 +1,7 @@ import { KeyValueCache } from 'apollo-server-caching'; import * as Redis from 'redis'; import { promisify } from 'util'; +import * as DataLoader from 'dataloader'; export class RedisCache implements KeyValueCache { readonly client; @@ -8,10 +9,16 @@ export class RedisCache implements KeyValueCache { ttl: 300, }; + private loader: DataLoader; + constructor(options: Redis.ClientOpts) { this.client = Redis.createClient(options); + this.loader = new DataLoader(keys => this.client.mget(keys), { + cache: false, + }); + // promisify client calls for convenience - this.client.get = promisify(this.client.get).bind(this.client); + this.client.mget = promisify(this.client.mget).bind(this.client); this.client.set = promisify(this.client.set).bind(this.client); this.client.flushdb = promisify(this.client.flushdb).bind(this.client); this.client.quit = promisify(this.client.quit).bind(this.client); @@ -27,7 +34,7 @@ export class RedisCache implements KeyValueCache { } async get(key: string): Promise { - const reply = await this.client.get(key); + const reply = await this.loader.load(key); // reply is null if key is not found if (reply !== null) { return reply;