性能优化
接口缓存
缓存是一种很棒且简单的技术,可帮助您提高应用程序的性能。它充当提供高性能数据访问的临时数据存储。
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 {}