我目前正在按照文档https://docs.nestjs.com/techniques/caching
中所述使用NestJS缓存机制使用此代码,我可以使用以下内容自定义整个模块的缓存:
CacheModule.register({
ttl: 5, // seconds
max: 10, // maximum number of items in cache
});
但是,我想某些端点要比其他端点缓存更长的时间。 (例如长期运行的操作不会像其他操作那样频繁更改)
这里描述了类似的内容:https://github.com/nestjs/nest/issues/695,但看起来它是封闭的,并未真正解决整个问题。
我在想类似的东西:
@Cache({ ttl: 600 })
@Get()
findAll(): string[] {
return service.longRunningOperation();
}
有什么想法吗?
答案 0 :(得分:0)
尚不支持由decorator控制ttl缓存。 github中有一个feature request,可以在以后的版本中添加它。
但是,您可以使用更详细的方法来处理它。将cache-manager对象注入到控制器的构造函数中,并在每个所需的路由上使用'wrap'函数:
create table metadata
(
id int
, property_en sysname
, desc_en varchar(500)
)
insert metadata values
(1, 'sex', 'Sex. 1 denotes male, 2 denotes female')
, (2, 'year', 'The year of the event record')
declare @SQL nvarchar(max) = ''
select @SQL = @SQL + 'EXEC sys.sp_addextendedproperty @name=N''' + d.property_en + ''', @value=N''' + d.desc_en + ''', @level0type=N''SCHEMA'', @level0name=N''' + s.name + ''', @level1type=N''TABLE'', @level1name=N''' + t.name + ''', @level2type=N''COLUMN'', @level2name=N''' + d.property_en + ''';'
from metadata d
join sys.columns c on c.name = d.property_en
join sys.tables t on t.object_id = c.object_id
join sys.schemas s on s.schema_id = t.schema_id
select @SQL
--once you are comfortable that the dynamic sql works uncomment the line below.
--exec sp_executesql @SQL
答案 1 :(得分:0)
您不能通过使用cacheManager来这样做。 您可以使用另一种方法,可以使用utils-decorators lib(npm install --save utils-decorators)并利用AsyncMemoize装饰器。然后,您只需要向控制器功能添加装饰器即可:
import {memoizeAsync} from 'utils-decorators';
class Controller {
@Get('endpointA')
@memoizeAsync(60 * 60 * 1000 * 12)
endpointA() {
}
@Get('endpointB')
@memoizeAsync(60 * 60 * 1000 * 24)
endpointB() {
}
}
答案 2 :(得分:0)
您可以使用模块的通用ttl值注册Cache模块
然后,在控制器中,同时使用'@nestjs/common'
包中的类CacheInterceptor和CacheTTL装饰器,如下所示
@Get()
@CacheTTL(100)
@UseInterceptors(CacheInterceptor)
findAll(): string[] {
return service.longRunningOperation();
}
CacheTTL Decorator中的值将覆盖缓存的默认过期时间值