NestJS请求作用域服务中Redis缓存过期时间不生效问题咨询
请求作用域服务中Cache Manager过期时间不生效的解决方案
问题根源
请求作用域服务每次请求都会生成新实例,若Cache Manager的调用方式或注入逻辑不符合NestJS的作用域规则,会导致TTL参数无法被正确识别,最终 fallback到默认的5000毫秒。
具体修正步骤
修正
set方法的参数格式
官方文档中cacheManager.set的第三个参数应为包含ttl字段的配置对象,而非直接传入数字。你的代码需要调整为:await this.cacheManager.set( 'locations', location_data, { ttl: 6000 } // 包裹成options对象 );非请求作用域服务可能因旧版本兼容或隐式转换生效,但请求作用域下必须严格遵循参数格式。
确保Cache Manager为单例注入
即使将CacheModule移至本地模块,也要保证其注册为单例(默认即为单例),避免请求作用域服务每次创建新的缓存实例。本地模块的CacheModule注册示例:@Module({ imports: [ CacheModule.register({ // 你的缓存配置(如Redis连接等) // 若未全局设置ttl,这里可以不指定,使用传入的ttl参数 }), ], providers: [YourRequestScopedService], exports: [CacheModule], // 若其他模块需要使用,需导出 }) export class LocalModule {}检查默认TTL配置
若本地模块的CacheModule注册时设置了全局默认ttl: 5000,会导致传入的TTL参数被覆盖。此时需移除全局默认TTL,或确保传入的ttl优先级更高(官方逻辑中传入的ttl会覆盖全局默认)。验证注入逻辑
请求作用域服务中注入Cache Manager时,需使用正确的Token:import { Inject, Injectable, Scope } from '@nestjs/common'; import { Cache } from 'cache-manager'; import { CACHE_MANAGER } from '@nestjs/cache-manager'; @Injectable({ scope: Scope.REQUEST }) export class YourRequestScopedService { constructor( @Inject(CACHE_MANAGER) private readonly cacheManager: Cache, ) {} // 你的业务方法 }
验证方式
调整后再次执行终端命令TTL locations,若返回值为6(对应6000毫秒=6秒),则说明TTL设置生效。
内容的提问来源于stack exchange,提问作者fsdeveloper
相关产品推荐
相关产品推荐

