使用 Nestjs 在 redis 存储中存储值

Jac*_*bdo 5 redis nestjs

我有一个简单的 nestjs 应用程序,我在其中设置了一个CacheModuleusingRedis商店,如下所示:

import * as redisStore from 'cache-manager-redis-store';

CacheModule.register({
      store: redisStore,
      host: 'redis',
      port: 6379,
    }),
Run Code Online (Sandbox Code Playgroud)

我想用它来存储单个值,但是,我不想通过将拦截器附加到控制器方法来以内置方式执行此操作,而是想手动控制它并能够设置和检索代码中的值。

我将如何去做,我什至会为此使用缓存管理器吗?

Hoa*_*inh 11

您可以使用 Nest.js 的官方方式:

1. 创建您的 RedisCacheModule:

1.1. redisCache.module.ts

import { Module, CacheModule } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import * as redisStore from 'cache-manager-redis-store';
import { RedisCacheService } from './redisCache.service';

@Module({
  imports: [
    CacheModule.registerAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => ({
        store: redisStore,
        host: configService.get('REDIS_HOST'),
        port: configService.get('REDIS_PORT'),
        ttl: configService.get('CACHE_TTL'),
      }),
    }),
  ],
  providers: [RedisCacheService],
  exports: [RedisCacheService] // This is IMPORTANT,  you need to export RedisCacheService here so that other modules can use it
})
export class RedisCacheModule {}
Run Code Online (Sandbox Code Playgroud)

1.2. redisCache.service.ts

import { Injectable, Inject, CACHE_MANAGER } from '@nestjs/common';
import { Cache } from 'cache-manager';

@Injectable()
export class RedisCacheService {
  constructor(
    @Inject(CACHE_MANAGER) private readonly cache: Cache,
  ) {}

  async get(key) {
    await this.cache.get(key);
  }

  async set(key, value) {
    await this.cache.set(key, value);
  }
}
Run Code Online (Sandbox Code Playgroud)

2. 在需要的地方注入 RedisCacheModule:

让我们假设我们将在模块中使用它DailyReportModule

2.1. dailyReport.module.ts

import { Module } from '@nestjs/common';
import { RedisCacheModule } from '../cache/redisCache.module';
import { DailyReportService } from './dailyReport.service';

@Module({
  imports: [RedisCacheModule],
  providers: [DailyReportService],
})
export class DailyReportModule {}
Run Code Online (Sandbox Code Playgroud)

2.2. dailyReport.service.ts

我们将在redisCacheService这里使用:

import { Injectable, Logger } from '@nestjs/common';
import { Cron } from '@nestjs/schedule';
import { RedisCacheService } from '../cache/redisCache.service';

@Injectable()
export class DailyReportService {
  private readonly logger = new Logger(DailyReportService.name);

  constructor(
    private readonly redisCacheService: RedisCacheService, // REMEMBER TO INJECT THIS
  ) {}

  @Cron('0 1 0 * * *') // Run cron job at 00:01:00 everyday
  async handleCacheDailyReport() {
    this.logger.debug('Handle cache to Redis');
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里查看我的示例代码。


Jac*_*bdo 4

基于 Ahmad 的上述评论,我使用以下命令在 Nestjs 应用程序中启用 Redis:

  1. 根据文档安装和设置nestjs-redis https://www.npmjs.com/package/nestjs-redis

  2. 请参阅此处有关如何在 Redis 存储中写入和读取值的文档: https: //github.com/NodeRedis/node-redis

  • 该项目看起来已被废弃,并且与 NestJS 8+ 不兼容。 (3认同)