Jedis,无法获取jedis连接:无法从池中获取资源

问题描述 投票:0回答:5

我在几个线程中看到了答案,但对我来说没有解决,因为我的问题偶尔发生,如果有人有任何想法,请询问这个问题。

我使用的是jedis版本2.8.0,Spring Data redis版本1.7.5。以及用于我们的缓存应用程序的 redis 服务器版本 2.8.4。

我有多个缓存保存在 Redis 中,并且获取请求是从 Redis 完成的。我正在使用 spring data redis API 来保存和获取数据。

所有保存和获取工作正常,但偶尔会出现以下异常:

Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool | org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the poolorg.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:198)
org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:345)
org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:129)
org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:92)
org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:79)
org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:191)
org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:166)
org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:88)
org.springframework.data.redis.core.DefaultHashOperations.get(DefaultHashOperations.java:49)

我的redis配置类:

@Configuration
public class RedisConfiguration {

@Value("${redisCentralCachingURL}")
private String redisHost;

@Value("${redisCentralCachingPort}")
private int redisPort;

@Bean
public StringRedisSerializer stringRedisSerializer() {
  StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
  return stringRedisSerializer;
}

@Bean
JedisConnectionFactory jedisConnectionFactory() {
  JedisConnectionFactory factory = new JedisConnectionFactory();
  factory.setHostName(redisHost);
  factory.setPort(redisPort);
  factory.setUsePool(true);
  return factory;
}

@Bean
public RedisTemplate<String, Object> redisTemplate() {
  RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
  redisTemplate.setConnectionFactory(jedisConnectionFactory());
  redisTemplate.setExposeConnection(true);
  // No serializer required all serialization done during impl
  redisTemplate.setKeySerializer(stringRedisSerializer());
  //`redisTemplate.setHashKeySerializer(stringRedisSerializer());
  redisTemplate.setHashValueSerializer(new GenericSnappyRedisSerializer());
  redisTemplate.afterPropertiesSet();
  return redisTemplate;
}

@Bean
public RedisCacheManager cacheManager() {
  RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate());
  redisCacheManager.setTransactionAware(true);
  redisCacheManager.setLoadRemoteCachesOnStartup(true);
  redisCacheManager.setUsePrefix(true);
  return redisCacheManager;
 }

 }

有人遇到过这个问题或对此有任何想法吗?为什么会发生这种情况?

spring redis jedis spring-data-redis
5个回答
7
投票

我们在 RxJava 中遇到了同样的问题,应用程序运行良好,但一段时间后,无法再从池中获取连接。经过几天的调试,我们终于弄清楚了导致问题的原因:

redisTemplate.setEnableTransactionSupport(true)

不知何故导致 spring-data-redis 不释放连接。我们需要对 MULTI / EXEC 的事务支持,但最终改变了实现来解决这个问题。

我们仍然不知道这是否是一个错误或我们这边的错误用法。


6
投票

我从 redis.template 迁移到普通的 jedis。 为池添加了以下配置(也可以在 Redis 模板中添加),现在没有看到任何异常:

jedisPoolConfig.setMaxIdle(30);
jedisPoolConfig.setMinIdle(10);

对于redis模板:

jedisConnectionFactory.getPoolConfig().setMaxIdle(30);
jedisConnectionFactory.getPoolConfig().setMinIdle(10);

同样的配置也可以添加到redis模板中。


0
投票

问题出在Redis配置上

对我来说,我在本地使用此属性,当我评论此属性时,问题得到了解决

#spring.redis.database=12

正确的属性是

spring.redis.sentinel.master=mymaster
spring.redis.password=
spring.redis.sentinel.nodes=localhost:5000


0
投票

我通过在 application.yml 文件中更改它来修复我的问题:

 redis:
   password: ${REDIS_SECRET_KEY: null}

对此:

password: ${REDIS_SECRET_KEY:}

0
投票

当您在应用程序中设置与 Redis 的 SSL 连接,但您的 Redis 实例不支持它(未正确配置)时,也可能会导致此问题。

可以通过以下方式启用 SSL 连接,因此您可以检查您的配置:

  • Spring 的属性
    spring.redis.ssl
    在应用程序属性文件中设置为
    true
  • .useSsl()
    JedisClientConfiguration
    创建中被调用。例如。设置
    JedisConnectionFactory
    时:
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
  RedisStandaloneConfiguration configuration =
      new RedisStandaloneConfiguration(<host>, <port>);
  configuration.setPassword(<password>);

  JedisClientConfiguration jedisClientConfiguration = JedisClientConfiguration.builder()
      .useSsl()
      .build();
  return new JedisConnectionFactory(configuration, jedisClientConfiguration);
}
© www.soinside.com 2019 - 2024. All rights reserved.