在本地和通过Redis官方Docker镜像连接Redis时效果良好。但是,当我切换到ENV变量的Heroku Redis值时。无法连接。
我也尝试过完整的url选项,但当我需要将options对象作为第二个参数添加到new Redis()
时,这似乎对任何Redis连接都不起作用,如果我不只为本地和官方Redis Docker映像传递任何选项,url选项就会起作用。
在新的redis((中只添加没有选项的heroku redis URI,看起来很有效,但10秒后我得到了Redis Connection Failure
。
Heroku Redis是否需要一些额外的准备步骤?
import Redis, { RedisOptions } from 'ioredis';
import logger from '../logger';
const REDIS_HOST = process.env.REDIS_HOST || '127.0.0.1';
const REDIS_PORT = Number(process.env.REDIS_PORT) || 6379;
const REDIS_PASSWORD = process.env.REDIS_PASSWORD;
const REDIS_DB = Number(process.env.REDIS_DB) || 0;
const redisConfig: RedisOptions = {
host: REDIS_HOST,
port: Number(REDIS_PORT),
password: REDIS_PASSWORD,
db: Number(REDIS_DB),
retryStrategy: function (times) {
if (times % 4 == 0) {
logger.error('Redis reconnect exhausted after 4 retries');
return null;
}
return 200;
},
};
const redis = new Redis(redisConfig);
redis.on('error', function () {
logger.error('Redis Connection Failure');
});
export default redis;
我不确定您是从哪里得到使用名为REDIS_HOST
、REDIS_PORT
、REDIS_PASSWORD
和REDIS_DB
的环境变量的想法的。Heroku Data for Redis提供了一个单一的环境变量来捕捉所有这些:
创建用于Redis的Heroku数据后,将创建新版本并重新启动应用程序。
REDIS_URL
配置变量在应用程序配置中可用。它包含可用于访问新提供的Heroku Data for Redis实例的URL。
下面是他们如何从Node.js:连接的示例
const redis = require("redis"); const client = redis.createClient({ url: process.env.REDIS_URL, socket: { tls: true, rejectUnauthorized: false } });
因此,相应地更改您的配置对象:
const REDIS_URL = process.env.REDIS_URL;
const redisConfig: RedisOptions = {
url: REDIS_URL, // <--
socket: { // <--
tls: true, // <--
rejectUnauthorized: false // <--
}, // <--
retryStrategy: function (times) {
if (times % 4 == 0) {
logger.error('Redis reconnect exhausted after 4 retries');
return null;
}
return 200;
},
};
您已经在本地使用环境变量来设置Redis密码。将其替换为包含所有默认值的适当REDIS_URL
,例如:
REDIS_URL=redis://user:password@host:port/database