You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS请求作用域服务中Redis缓存过期时间不生效问题咨询

请求作用域服务中Cache Manager过期时间不生效的解决方案

问题根源

请求作用域服务每次请求都会生成新实例,若Cache Manager的调用方式或注入逻辑不符合NestJS的作用域规则,会导致TTL参数无法被正确识别,最终 fallback到默认的5000毫秒。

具体修正步骤

  1. 修正set方法的参数格式
    官方文档中cacheManager.set的第三个参数应为包含ttl字段的配置对象,而非直接传入数字。你的代码需要调整为:

    await this.cacheManager.set(
      'locations',
      location_data,
      { ttl: 6000 } // 包裹成options对象
    );
    

    非请求作用域服务可能因旧版本兼容或隐式转换生效,但请求作用域下必须严格遵循参数格式。

  2. 确保Cache Manager为单例注入
    即使将CacheModule移至本地模块,也要保证其注册为单例(默认即为单例),避免请求作用域服务每次创建新的缓存实例。本地模块的CacheModule注册示例:

    @Module({
      imports: [
        CacheModule.register({
          // 你的缓存配置(如Redis连接等)
          // 若未全局设置ttl,这里可以不指定,使用传入的ttl参数
        }),
      ],
      providers: [YourRequestScopedService],
      exports: [CacheModule], // 若其他模块需要使用,需导出
    })
    export class LocalModule {}
    
  3. 检查默认TTL配置
    若本地模块的CacheModule注册时设置了全局默认ttl: 5000,会导致传入的TTL参数被覆盖。此时需移除全局默认TTL,或确保传入的ttl优先级更高(官方逻辑中传入的ttl会覆盖全局默认)。

  4. 验证注入逻辑
    请求作用域服务中注入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:20:30