如何在nestjs中使用redis客户端?

Alo*_*wer 1 javascript redis node.js microservices nestjs

我在 NestJs 中有一个微服务,这是 main.ts 文件:

async function bootstrap() {
  const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
    transport: Transport.REDIS,
    options: {
      url: 'redis://localhost:6379',
    }
  })
  await app.listen();
  console.log('Redis is running');
}
bootstrap();
Run Code Online (Sandbox Code Playgroud)

我想从服务调用 redis db:

import { createClient } from '@redis/client';

async createWorkspaceShareCode(data: GetWorkspaceShareCodeMessage) {
    const client = createClient({
      url: 'redis://localhost:6379'
    });
    await client.connect();

    await client.set('key', 'value');
    const value = await client.get('key');
    return value;
  }
Run Code Online (Sandbox Code Playgroud)

但这不是我想要的,问题如下:

  • 每次我发出请求时,它都会创建新的连接
  • 我需要在每个函数中编写此代码来连接到 Redis(即使我已经在 main.ts 文件中连接),问题是:如何在我的 NestJs 微服务中使用某种 RedisService?我已经尝试安装 redis 和 Nestjs-redis 库,但第一个会产生上述问题,第二个只会引发错误: https: //github.com/skunight/nestjs-redis/issues/97

Jay*_*iel 12

我要做的就是保留你createMicroservice现有的,因为它对于基于 Redis 的微服务服务器是必要的。然后您可以创建一个导出 Redis 服务的模块,如下所示:

@Module({
  providers: [
    {
      provide: 'REDIS_OPTIONS',
      useValue: {
        url: 'redis://localhost:6379'
      }
    },
    {
      inject: ['REDIS_OPTIONS']
      provide: 'REDIS_CLIENT',
      useFactory: async (options: { url: string }) => {
        const client = createClient(options);
        await client.connect();
        return client;
      }
    }
  ],
  exports: ['REDIS_CLIENT'],
})
export class RedisModule {}
Run Code Online (Sandbox Code Playgroud)

现在,在包含要使用的服务的模块中,添加RedisModuleimports数组中,并且在服务中,您可以@Inject('REDIS_CLIENT') private readonly redis: Redis注入 Redis 实例并使用它this.redis.get('key')this.redis.set('key', value) 我们可以从“ioredis”库导入“Redis”。它工作得很好。总而言之,我们需要redisioredis库。redis用于Redis 的createClientioredis

1. import { createClient } from "redis";<br>
2. import { Redis } from 'ioredis';
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用 [node-redis](https://www.npmjs.com/package/redis) 包,它看起来应该是 `RedisClientType`。我想我是为 redis v3 而不是 v4 编写这个示例的。另一种选择是使用“ioredis”,它具有更直接的类型 (2认同)