如何在NestJS应用中连接ElastiCache Redis集群
NestJS 连接 AWS ElastiCache Redis 可行配置方案
你已经完成了Elastic Beanstalk、RDS、ElastiCache之间的安全组关联和网络打通,只需要调整NestJS侧CacheModule的连接参数即可,不需要额外引入复杂依赖。
前置准备
先从ElastiCache控制台获取正确的连接信息:
- 非集群模式Redis:复制集群详情页的主端点(Primary Endpoint),记录对应端口(默认6379)
- 集群模式(Cluster Mode Enabled)Redis:复制集群详情页的配置端点(Configuration Endpoint),记录对应端口
- 如果创建集群时开启了AUTH认证,提前准备好设置的访问令牌,未开启则不需要准备
具体配置代码
你本地连接Redis用的是cache-manager-redis-store依赖,原有依赖不需要更换,直接修改注册参数即可。
非集群模式配置
import { CacheModule } from '@nestjs/cache-manager'; import { redisStore } from 'cache-manager-redis-store'; @Module({ imports: [ CacheModule.register({ store: redisStore, host: '复制的ElastiCache主端点纯域名,不要加redis://前缀、不要带端口', port: 6379, // 替换为控制台显示的实际端口 password: '开启AUTH认证时填写,未开启直接删除该字段', ttl: 600, // 按业务需求配置默认缓存过期时间,单位秒 tls: false, // 开启ElastiCache传输加密时设为true,同VPC内网无加密访问设为false }), // 其他模块引入 ] }) export class AppModule {}
集群模式配置
如果你的Redis开启了集群模式,需要额外增加集群配置参数:
import { CacheModule } from '@nestjs/cache-manager'; import { redisStore } from 'cache-manager-redis-store'; @Module({ imports: [ CacheModule.register({ store: redisStore, host: '复制的ElastiCache配置端点纯域名', port: 6379, password: '开启AUTH认证时填写,未开启直接删除该字段', clusterConfig: { slotsRefreshTimeout: 2000, dnsLookup: (address, callback) => callback(null, address), enableReadyCheck: true, }, ttl: 600, tls: false, // 开启传输加密时设为true }), ] }) export class AppModule {}
高版本依赖兼容写法
如果你用的是cache-manager@5.x、cache-manager-redis-store@3.x以上版本,遇到类型校验报错时,可以用registerAsync写法绕过,功能完全一致:
CacheModule.registerAsync({ useFactory: () => ({ store: redisStore, host: 'ElastiCache对应端点域名', port: 6379, password: '有认证则填写', tls: false, }) })
常见踩坑排查
- 不要在
host字段拼接redis://协议头、端口号,host只填纯域名,端口单独在port字段配置 - 确认ElastiCache绑定的安全组入站规则:放行EB实例关联安全组的6379端口TCP访问,不需要开放0.0.0.0/0公网访问
- 开启ElastiCache传输加密时必须把
tls字段设为true,否则连接会被直接重置 - ElastiCache默认仅支持同VPC内网访问,本地开发环境没有VPC网络权限无法直连,部署到EB环境后再测试连接即可
- 不要手动解析ElastiCache端点的IP填写,AWS会自动做节点故障切换时的DNS更新,直接用官方提供的域名即可
内容的提问来源于stack exchange,提问作者muhammad adeel
相关产品推荐
相关产品推荐

