性能优化

接口缓存

缓存是一种很棒且简单的技术,可帮助您提高应用程序的性能。它充当提供高性能数据访问的临时数据存储。

In-memory cache

Nest 为各种缓存存储提供商提供了统一的 API。内置的一个是内存中的数据存储。但是,您可以轻松地切换到更全面的解决方案,例如 Redis。为了启用缓存,请首先导入 CacheModule 并调用其 register() 方法。

import { CacheModule, Module } from "@nestjs/common";
import { AppController } from "./app.controller";

@Module({
  imports: [CacheModule.register()],
  controllers: [AppController]
})
export class ApplicationModule {}

然后,只需将 CacheInterceptor 绑定到要缓存数据的位置即可。

@Controller()
@UseInterceptors(CacheInterceptor)
export class AppController {
  @Get()
  findAll(): string[] {
    return [];
  }
}

全局缓存

为了减少所需的样板数量,可以将 CacheInterceptor 全局绑定到所有端点:

import { CacheModule, Module, CacheInterceptor } from "@nestjs/common";
import { AppController } from "./app.controller";
import { APP_INTERCEPTOR } from "@nestjs/core";

@Module({
  imports: [CacheModule.register()],
  controllers: [AppController],
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: CacheInterceptor
    }
  ]
})
export class ApplicationModule {}

自定义缓存

所有缓存的数据都有其自己的到期时间(TTL)。要自定义默认值,请将 options 对象传递给 register()方法。

CacheModule.register({
  ttl: 5, // seconds
  max: 10 // maximum number of items in cache
});

启用全局高速缓存后,高速缓存条目存储在基于路由路径自动生成的 CacheKey 下。您可以逐个方法覆盖某些缓存设置(@CacheKey()和@CacheTTL()),从而允许为各个控制器方法定制缓存策略。使用不同的缓存存储区时,这可能是最相关的。

@Controller()
export class AppController {
  @CacheKey("custom_key")
  @CacheTTL(20)
  findAll(): string[] {
    return [];
  }
}

@CacheKey()装饰器可以与或不与相应的@CacheTTL()装饰器一起使用,反之亦然。可以选择仅覆盖@CacheKey()或仅覆盖@CacheTTL()。未用装饰器覆盖的设置将使用默认值(全局注册)。

我们也可以选择使用不同的缓存数据源:

import * as redisStore from "cache-manager-redis-store";
import { CacheModule, Module } from "@nestjs/common";
import { AppController } from "./app.controller";

@Module({
  imports: [
    CacheModule.register({
      store: redisStore,
      host: "localhost",
      port: 6379
    })
  ],
  controllers: [AppController]
})
export class ApplicationModule {}
上一页