如何在 NestJs 中的 Typeorm 缓存配置中重用 Redis 连接

Swa*_*ali 1 node.js node-redis typescript typeorm nestjs

我正在使用 Redis 在 TypeOrm 中缓存查询。

但问题是,TypeOrm 和 Redis 包正在打开单独的连接,我只想为两者重用相同的连接。

这是 typeorm 配置:

import { TypeOrmModuleOptions } from '@nestjs/typeorm';
import { Constants } from '../utils/Constants';

export const typeOrmConfig: TypeOrmModuleOptions = {
    type: Constants.DB_TYPE,
    host: Constants.DB_HOST,
    port: Constants.DB_PORT,
    username: Constants.DB_USER_NAME,
    password: Constants.DB_PASSWORD,
    database: Constants.DB_NAME,
    entities: [ __dirname + '/../**/*.entity.{js,ts}' ],
    synchronize: true,
    logging: true,
    cache: {
        type: 'ioredis',
        duration: 60000,
        options: {
            host: 'localhost',
            password: 'swapnil',
            port: 6379
        }
    },
    extra: {
        max: 10,
        connectionTimeoutMillis: 2000
    }
};
Run Code Online (Sandbox Code Playgroud)

我正在为 redis使用@svtslv/nestjs-ioredis包:

import { Constants } from '../utils/Constants';

export const config = {
    host: Constants.REDIS_HOST,
    port: parseInt(Constants.REDIS_PORT),
    db: parseInt(Constants.REDIS_DB),
    password: Constants.REDIS_PASSWORD
};
Run Code Online (Sandbox Code Playgroud)

使用这个包,我可以使用以下方法访问我的服务类中的redis:

public constructor(@InjectRedis() private readonly redis: Redis,) {}
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 5

在深入研究 TypeORM 代码库后,我发现了两种解决方案(其中一个有点 hacky,我的案例也有问题)

ORM 自定义查询结果缓存

根据文档,您可以实现自己的缓存处理程序,请参阅:https ://github.com/typeorm/typeorm/blob/master/docs/caching.md 。

这是更好但更难的解决方案,因为需要实现接口https://github.com/typeorm/typeorm/blob/master/src/cache/QueryResultCache.ts

此外,您需要使用forRootAsync注册 TypeOrmModule才能首先连接到 Redis。

黑客的欢乐时光

根据代码库,您应该能够访问 TypeORM 正在创建的 Redise 客户端(连接)。

在 ORM 类型上,connection有一个名为connection.queryResultCache管理缓存的成员。client但queryResultCache( connection.queryResultCache.client)上还有一个成员名称

请参阅 TypeORM redis 缓存植入: https://github.com/typeorm/typeorm/blob/master/src/cache/RedisQueryResultCache.ts

import { Connection } from 'typeorm';

@Module({
  imports: [TypeOrmModule.forRoot()],
})
export class AppModule {
  constructor(private connection: Connection) {

    connection.queryResultCache.client // <-- Cache client.
  }
}
Run Code Online (Sandbox Code Playgroud)

但不用说,这不是预期的用途,这会将您的数据库耦合到 Redis,这对于让您的代码库面向未来来说并不是那么重要。

我的诚实意见

根据关注点分离的想法,我建议坚持使用两个连接而不是一个连接,以保持DB query Cache和标准Cache分离。

这将使您在未来进行集成测试和重构时更加灵活。

请参阅: https: //github.com/nestjs/typeorm/issues/59