【NestJS】内存Caching基本用法
基本需求定义基本需求定义
缓存有两种基本用法,根据需求可大致分为两类:
需求一:缓存一些指定key,在使用的时候获取key里面的内容,key可以根据需求自由定义,按使用情况获取或者删除
需求二:自动缓存接口查询响应内容,如查询某列表或者基本详情信息接口缓存,如 findAll(),getUserInfo(),针对这种nestjs直接有封装
安装
pnpm add cache-manager
pnpm add -D @types/cache-manager
pnpm add -D cache-manager-redis-store
导入模块
import { CacheModule, Module } from '@nestjs/common';
import { AppController } from './app.controller';
@Module({
imports: [CacheModule.register()],
controllers: [AppController],
})
export class AppModule {}
项目中使用了.env配置了参数,需要动态获取
import { CacheModule, forwardRef, Module } from '@nestjs/common'
import * as redisStore from 'cache-manager-redis-store'
import { ConfigModule, ConfigService } from '@nestjs/config'
import { TreeService } from './tree.service'
import { TreeController } from './tree.controller'
import { TypeOrmModule } from '@nestjs/typeorm'
import { TreeRepository } from '../db/repositories/TreeRepository'
import { AuditModule } from '../audit/audit.module'
@Module({
imports: [
forwardRef(() => AuditModule),
TypeOrmModule.forFeature([TreeRepository]),
CacheModule.registerAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (configService: ConfigService) => {
const { host, port } = configService.get('redis')
return {
store: redisStore,
host,
port
}
}
})
],
controllers: [TreeController],
providers: [TreeService]
})
export class TreeModule {}
直接操作缓存
注入 CACHE_MANAGER
import { Injectable, CACHE_MANAGER, Inject } from '@nestjs/common'
import { Cache } from 'cache-manager'
constructor(@Inject(CACHE_MANAGER) private cacheManager: Cache) {}
set操作
//设置一个 key value
await this.cacheManager.set('key', 'value')
//设置过期时间
await this.cacheManager.set('key', 'value', { ttl: 1000 })
get操作
const value = await this.cacheManager.get('key')
del操作
await this.cacheManager.del('key')
reset操作
await this.cacheManager.reset()
自动缓存接口响应
要自动缓存接口查询结果,直接使用nestjs封装好的CacheInterceptor即可
缓存指定控制器
@Controller()
@UseInterceptors(CacheInterceptor)
export class AppController {
@Get()
findAll(): string[] {
return [];
}
}
全局缓存
如果指定单个比较麻烦,也可以直接全局缓存,不过使用前还是根据实际情况来
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 AppModule {}
全局自定义缓存限制
自动接口缓存一般还是要指定下过期时间和最大缓存数量,在模块注册的时候可以全局自定义一个默认值
CacheModule.register({
ttl: 5, // seconds
max: 10, // maximum number of items in cache
});
个性化重写缓存限制
在某个控制器也可以单独定义针对某个控制器的限制时间和一些缓存key
@Controller()
export class AppController {
@CacheKey('custom_key')
@CacheTTL(20)
findAll(): string[] {
return [];
}
}