web-dev-qa-db-ja.com

ジェディス、ジェディス接続を取得できません:プールからリソースを取得できません

私はいくつかのスレッドで答えを見ましたが、私にとってはうまくいきませんでした。私の問題はときどき発生するため、誰かにアイデアがあるかどうかこの質問をしました。

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;
 }

 }

誰もこの問題に直面したか、これについて何か考えがありましたか、なぜこれが起こるのでしょうか?

9
Bikas Katwal

Redis.templateから単純なjedisに移動しました。プール用に以下の設定を追加し(redisテンプレートにも追加可能)、例外は表示されません:

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

redisテンプレートの場合:

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

上記と同じ構成をredisテンプレートに追加することもできます。

1
Bikas Katwal

RxJavaでも同じ問題に直面していました。アプリケーションは正常に実行されていましたが、しばらくすると、プールから接続を取得できなくなりました。数日間のデバッグの後、問題の原因を最終的に特定しました。

redisTemplate.setEnableTransactionSupport(true)

どういうわけか、spring-data-redisは接続を解放しませんでした。 MULTI/EXECのトランザクションサポートが必要でしたが、最終的にこの問題を取り除くために実装を変更しました。

それでも、これが私たちの側のバグなのか間違った使い方なのかはわかりません。

3
woezelmann