【问题标题】:How to reuse Redis connection inside Typeorm cache config in NestJs如何在 NestJs 中的 Typeorm 缓存配置中重用 Redis 连接
【发布时间】:2020-08-25 12:45:50
【问题描述】:

我正在使用 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
    }
};

我正在为 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
};

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

public constructor(@InjectRedis() private readonly redis: Redis,) {}

【问题讨论】:

    标签: node.js typescript nestjs typeorm node-redis


    【解决方案1】:

    在对 TypeORM 代码库进行了一些挖掘之后,我遇到了两种解决方案(其中一种有点笨拙,而且我的案例有问题)

    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 正在创建的 Redis 客户端(连接)。

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

    查看 TypeORM redis Cache 植入: 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.
      }
    }
    

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

    我的诚实意见

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

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

    见:https://github.com/nestjs/typeorm/issues/59

    【讨论】:

    • 打开多个连接会导致开销?
    • 我不认为这是开销,因为每个Redis 连接服务器都有不同的工作(尽管它们都托管在一起)。如果你是什么优化,你应该选择第一个解决方案。
    猜你喜欢
    • 2019-09-17
    • 2021-09-08
    • 2020-09-13
    • 2020-12-20
    • 2019-04-22
    • 2020-09-22
    • 2021-03-16
    • 2021-05-27
    • 1970-01-01
    相关资源
    最近更新 更多