node-redis icon indicating copy to clipboard operation
node-redis copied to clipboard

Migrating from ioredis with keyv on ApolloServer

Open mirankorkmaz opened this issue 1 year ago • 1 comments

Hi, I'm migrating my implementation from ioredis to this package instead. Current implementation looks kinda like:

import Keyv from 'keyv';
import KeyvRedis from '@keyv/redis';
import Redis from 'ioredis';
import { KeyvAdapter } from '@apollo/utils.keyvadapter';

  const instances =
    config.redis.host?.split(',').map((data) => {
      const [host, port] = data.split(':');
      return { host, port: Number.parseInt(port) };
    });

  const createTheCache = () => {
    const redis = new Redis.Cluster(instances, {
      scaleReads: 'slave',
    });
    return new Keyv({
      store: new KeyvRedis(redis),
      namespace: 'my-namespace',
    });
  };

const server = new ApolloServer({
    cache: new KeyvAdapter(createTheCache(), {
      disableBatchReads: true, 
    }),
  })
  

I've tried using createCluster.

import Keyv from 'keyv';
import KeyvRedis from '@keyv/redis';
import { createCluster from 'redis';
import { KeyvAdapter } from '@apollo/utils.keyvadapter'; 


  const instances =
    config.redis.host?.split(',').map((data) => {
      const [host, port] = data.split(':');
      return { host, port: Number.parseInt(port) };
    });

  const createTheCache = async () => {
    const client = createCluster({
      rootNodes: instances.map(({ host, port }) => ({
        url: `redis://${host}:${port}`
      })),
    });
  
    client.on('error', (err: any) => { console.log("Fail!", err )});
  
    await client.connect();
  
    const store = new KeyvRedis(client as any);
    return new Keyv({
      store,
      namespace: 'my-namespace',
    });
  };

 const server = new ApolloServer({
    cache: new KeyvAdapter(await createTheCache(), {
      disableBatchReads: true, 
    }),
  )}

However I'm getting an error

| Error: connect ECONNREFUSED 127.0.0.1:6379
|     at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1606:16)
| Emitted 'error' event on Keyv instance at:
|     at KeyvRedis.<anonymous> (/var/www/app/node_modules/keyv/src/index.js:60:46)
|     at KeyvRedis.emit (node:events:519:28)
|     at KeyvRedis.emit (node:domain:488:12)
|     at EventEmitter.<anonymous> (/var/www/app/node_modules/@keyv/redis/src/index.js:18:40)
|     at EventEmitter.emit (node:events:519:28)
|     at EventEmitter.emit (node:domain:488:12)
|     at EventEmitter.silentEmit (/var/www/app/node_modules/ioredis/built/Redis.js:482:30)
|     at Socket.<anonymous> (/var/www/app/node_modules/ioredis/built/redis/event_handler.js:196:14)
|     at Object.onceWrapper (node:events:634:26)
|     at Socket.emit (node:events:531:35)
|     at Socket.emit (node:domain:488:12)
|     at emitErrorNT (node:internal/streams/destroy:169:8)
|     at emitErrorCloseNT (node:internal/streams/destroy:128:3)
|     at processTicksAndRejections (node:internal/process/task_queues:82:21) {
|   errno: -111,
|   code: 'ECONNREFUSED',

Has anyone tried migrating from ioredis on apolloServer before, what am I missing?

mirankorkmaz avatar Aug 27 '24 09:08 mirankorkmaz

From the error stack trace it seems like the error is coming from ioredis (and not node-redis).. If you want we can debug this together, just ping me on the redis discord (my handle is @leibale)

leibale avatar Sep 19 '24 12:09 leibale

This issue has been automatically marked as stale due to inactivity. It will be closed in 30 days if no further activity occurs. If you believe this issue is still relevant, please add a comment to keep it open.

github-actions[bot] avatar Sep 20 '25 00:09 github-actions[bot]

This issue has been automatically closed due to inactivity. If you believe this issue is still relevant, please reopen it or create a new issue with updated information.

github-actions[bot] avatar Oct 20 '25 00:10 github-actions[bot]