我正在做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;
}
答案 0 :(得分:0)
如果到节点的连接成功,但是从池中创建连接(用于从中进行读/写操作)失败(“无法从池中获取资源”等),这可能是因为当前主服务器位于其他节点上(即可能是在安装过程中配置的。)
如果在这种情况下使用redis前哨(而不是redis集群),则ip:port列表(配置文件中)将用于连接哨兵,但是当前主服务器的ip:port(不在配置文件中)将有所不同。这些ip:port配置是在安装过程中提供的,也可以稍后进行配置。