SpringBoot Redis远程主机

时间:2018-08-19 06:28:19

标签: java spring-boot redis lettuce

我正在制作一个在后端使用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();
    }

}

5 个答案:

答案 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。

您应该做的是:

  • 使用LettuceConnectionFactory(主机名,端口)构造函数。
  • 不定义连接工厂。删除connectionFactory()的整个@Bean条目,Spring会自动将所有内容连接起来并使用您的配置条目。

也作为旁注;要使其与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值。

要使其正常运行,请执行以下操作:

  1. 删除此bean定义:
@Bean
public LettuceConnectionFactory connectionFactory() {
    return new LettuceConnectionFactory();
}
  1. 通过以下方式定义RedisTemplate bean:
@Bean
public RedisTemplate<String, Object> deliveryRedisTemplate(RedisConnectionFactory connectionFactory) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(connectionFactory);
    return template;
}
  1. application.properties中定义以下值:
spring.redis.database=<replace-me>
spring.redis.host=<replace-me>
spring.redis.port=<replace-me>
spring.redis.timeout=<replace-me>