Redis集群不适用于SpringBoot + JPA应用程序

时间:2019-01-13 16:58:16

标签: java spring-boot caching redis spring-data-jpa

我正在做poc(Redis + springboot + jpa),当我设置Redis属性setEnableTransactionSupport(true)时,在clustermode中不支持Transaction的异常,当我在获取redisTemplate时设置setEnableTransactionSupport(false)时,则资源的异常游泳池来了。

@注意:当我将Redis和spring boot设置在另一台机器上时,此问题会出现。 我有6个节点,3个是主节点,3个是从节点。

但是当我在一台机器上安装整个系统(spring + Redis)时,它工作正常。

以下是我的依赖项:

[<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>]

[<groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
        <type>jar</type>]

我尝试了以下链接中的建议: Jedis, Cannot get jedis connection: cannot get resource from pool 以下是我对Redis Connection工厂的配置:

## Redis Properties(application.properties)
spring.redis.cluster.nodes=127.0.0.1:7000,127.0.0.1:7001,127.0.0.1:7002

RedisClusterConfigProp.java

@Component
@ConfigurationProperties(value = "spring.redis.cluster")
public class RedisClusterConfigProp {
List<String> nodes;
/**
 * @return the nodes
 */
public List<String> getNodes() {
    return nodes;
}

/**
 * @param nodes
 * the nodes to set
 */
public void setNodes(List<String> nodes) {
    this.nodes = nodes;
}

}

RedisClusterConfigration.java

@Configuration
public class RedisClusterConfigration {

@Autowired
public RedisClusterConfigProp clusterConfigProp;

@Bean
public RedisConnectionFactory redisConnectionFactory() {
    JedisConnectionFactory jedisConnFac = new JedisConnectionFactory(
            new RedisClusterConfiguration(clusterConfigProp.getNodes()), new JedisPoolConfig());
    jedisConnFac.getPoolConfig().setMaxIdle(40);
    jedisConnFac.getPoolConfig().setMinIdle(20);
    return jedisConnFac;
}

@Bean
public RedisTemplate redisTemplate() {
    RedisTemplate template = new RedisTemplate();
    template.setConnectionFactory(redisConnectionFactory());
    template.setEnableTransactionSupport(false);
    return template;
}

1 个答案:

答案 0 :(得分:0)

如果到节点的连接成功,但是从池中创建连接(用于从中进行读/写操作)失败(“无法从池中获取资源”等),这可能是因为当前主服务器位于其他节点上(即可能是在安装过程中配置的。)

如果在这种情况下使用redis前哨(而不是redis集群),则ip:port列表(配置文件中)将用于连接哨兵,但是当前主服务器的ip:port(不在配置文件中)将有所不同。这些ip:port配置是在安装过程中提供的,也可以稍后进行配置。