缓存有两种基本用法,根据需求可大致分为两类:
需求一:缓存一些指定key,在使用的时候获取key里面的内容,key可以根据需求自由定义,按使用情况获取或者删除
需求二:自动缓存接口查询响应内容,如查询某列表或者基本详情信息接口缓存,如 findAll(),getUserInfo(),针对这种nestjs直接有封装
npm install cache-manager
npm install -D @types/cache-manager
import { CacheModule, Module } from '@nestjs/common';
import { AppController } from './app.controller';
@Module({
imports: [CacheModule.register()],
controllers: [AppController],
})
export class AppModule {}
需求一可以直接操作缓存,一般为 set 设置指定key内容、get 获取指定key、del 删除指定key、reset 重置清空
import { Injectable, CACHE_MANAGER, Inject } from '@nestjs/common'
import { Cache } from 'cache-manager'
constructor(@Inject(CACHE_MANAGER) private cacheManager: Cache) {}
//设置一个 key value
await this.cacheManager.set('key', 'value')
//设置过期时间
await this.cacheManager.set('key', 'value', { ttl: 1000 })
const value = await this.cacheManager.get('key')
await this.cacheManager.del('key')
//清空所有key
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 [];
}
}