我正在制作一个在后端使用Spring Boot,MySQL和Redis并在前端使用Angular的应用程序。我想将其部署到Heroku,以便可以在前端使用它,但似乎无法为Redis配置远程URL。我在Heroku上拥有Redis To Go附加组件,并已准备好远程URL。我只是不知道如何配置环境变量来访问它,而不是本地主机和默认端口6379。
我在我的application.properties中添加了以下几行,但仍然无法正常工作:
spring.redis.url= #URL
spring.redis.host= #HOSTNAME
spring.redis.password= #PASSWORD
spring.redis.port = #PORT
我一直收到以下错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer' defined in class path resource [org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.class]: Invocation of init method failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis on localhost:6379; nested exception is com.lambdaworks.redis.RedisConnectionException: Unable to connect to localhost/127.0.0.1:6379
有什么方法可以配置它以访问远程URL而不是localhost?
我使用的是生菜而不是Jedis,我的HttpSessionConfig文件是:
@EnableRedisHttpSession
public class HttpSessionConfig {
@Bean
public LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory();
}
}
答案 0 :(得分:2)
我发现用于连接到其Redis插件(https://devcenter.heroku.com/articles/heroku-redis#connecting-in-java)的Heroku文档包含一个使用Jedis的示例,因此需要进行一些改动。 Heroku添加到正在运行的应用程序环境中的REDIS_URL
的内容类似于
redis://h:credentials@host:port
我使用RedisURI.create
进行了解析,然后设置了RedisStandaloneConfiguration
的主机,端口和密码参数
val uri = RedisURI.create(configuration.redisUrl)
val config = RedisStandaloneConfiguration(uri.host, uri.port)
config.setPassword(uri.password)
return LettuceConnectionFactory(config)
上面的代码是Kotlin而不是Java,但也许会有帮助吗?您可以在https://github.com/DangerousDarlow/springboot-redis
中找到完整的代码答案 1 :(得分:1)
您需要选择自动配置还是定义自定义连接模板。
第一种方法是删除HttpSessionConfig
,然后将应用application.properties
文件中的redis属性。并且由于您对类路径具有spring-redis-data-session依赖性,因此将隐式创建莴苣连接。
第二个解决方案是在LettuceConnectionFactory
内将连接属性定义为主机,端口和密码。
但是建议使用自动配置。
答案 2 :(得分:1)
我对您面临的完全相同的问题感到沮丧,并且Spring Boot文档或示例无法解决我们面临的问题。之所以不使用配置条目,是因为您正在使用无参数构造函数创建LettuceConnectionFactory的新实例。深入研究源代码/字节码,您可以看到构造函数完全忽略了spring.redis.host和spring.redis.port值,并将其硬编码为localhost:6379。
您应该做的是:
也作为旁注;要使其与AWS Elasticache(通过VPN本地)一起使用,我必须添加到该配置类:
@Bean
public static ConfigureRedisAction configureRedisAction() {
return ConfigureRedisAction.NO_OP;
}
答案 3 :(得分:1)
在application.properties和RedisStandaloneConfiguration中设置配置。
@Configuration
@PropertySource("application.properties")
@EnableRedisHttpSession
public class SpringRedisConfig {
@Autowired
private Environment env;
@Bean
public LettuceConnectionFactory connectionFactory() {
RedisStandaloneConfiguration redisConf = new RedisStandaloneConfiguration();
redisConf.setHostName(env.getProperty("spring.redis.host"));
redisConf.setPort(Integer.parseInt(env.getProperty("spring.redis.port")));
redisConf.setPassword(RedisPassword.of(env.getProperty("spring.redis.password")));
return new LettuceConnectionFactory(redisConf);
}
}
答案 4 :(得分:1)
我遇到了类似的问题,这就是我的解决方法:
如果您以这种方式定义bean:
@Bean
public LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory();
}
您不允许Spring从application.properties
中获取Redis值。
要使其正常运行,请执行以下操作:
@Bean
public LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory();
}
@Bean
public RedisTemplate<String, Object> deliveryRedisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
return template;
}
application.properties
中定义以下值:spring.redis.database=<replace-me>
spring.redis.host=<replace-me>
spring.redis.port=<replace-me>
spring.redis.timeout=<replace-me>