NestJS集成Redis集群缓存时出现MOVED错误求助
解决NestJS集成Redis集群缓存时的"MOVED"错误
问题原因
你当前的配置是按照单Redis实例编写的,但实际连接的是Redis集群。Redis集群会根据键的哈希槽将数据分配到不同节点,单实例客户端无法自动处理MOVED重定向指令,因此触发该错误。
解决方案
切换到支持Redis集群的缓存存储库,并将配置修改为集群模式:
清理重复导入
删除仅支持单实例的cache-manager-ioredis导入,保留支持集群的cache-manager-ioredis-yet。更新CacheModule集群配置
替换原单实例的host/port配置,改为集群节点列表,并配置认证等必要参数。
修改后的代码
app.module.ts
import { CacheModule } from '@nestjs/cache-manager'; import { redisStore } from 'cache-manager-ioredis-yet'; import { ConfigModule } from '@nestjs/config'; import { KnexModule } from '@nestjs/knex'; // 导入其他必要模块... @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, envFilePath: !ENV ? '.env' : `.env.${ENV}`, }), CacheModule.register({ isGlobal: true, store: redisStore, // Redis集群配置 clusterConfig: { nodes: [ { host: process.env.REDIS_HOST_NODE1, port: Number(process.env.REDIS_PORT_NODE1) }, { host: process.env.REDIS_HOST_NODE2, port: Number(process.env.REDIS_PORT_NODE2) }, // 添加所有集群节点信息 ], options: { redisOptions: { password: process.env.REDIS_PASSWORD, enableAutoPipelining: true, }, }, }, }), KnexModule.forRoot(knex_config), ], controllers: [AppController], providers: [ // 你的服务提供者列表 ], }) export class AppModule {}
说明
clusterConfig.nodes:填写Redis集群所有节点的host和port,确保客户端能发现完整集群拓扑。redisOptions:保留原有的认证、管道优化等参数,适配集群环境。- 建议在
.env文件中统一配置集群节点地址,避免硬编码。
app.service.ts(无需修改)
服务层的缓存读写逻辑本身无问题,Module配置更新后即可正常工作。
内容的提问来源于stack exchange,提问作者code_optimizer
相关产品推荐
相关产品推荐

