1

Spring Data Redis を使用していますが、JedisPoolConfig. RedisTemplate次のように構成しました。

@Bean
JedisPoolConfig jedisPoolConfig() {

    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    return jedisPoolConfig;
}

@Bean
public RedisConnectionFactory redisConnectionFactory() {

    JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig());
    jedisConnectionFactory.setHostName(redisSettings.getServer().getHost());
    jedisConnectionFactory.setPort(redisSettings.getServer().getPort());
    return jedisConnectionFactory;
}

@Bean
public RedisTemplate<String, Integer> redisTemplate(RedisConnectionFactory redisConnectionFactory) {

    RedisTemplate<String, Integer> redisTemplate = new RedisTemplate<String, Integer>();
    redisTemplate.setConnectionFactory(redisConnectionFactory);
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setEnableTransactionSupport(true);
    return redisTemplate;
}

としてマークされたサービスがあります。これは、Redis のキーの数をインクリメントする@Transactionala を呼び出します。@Repository

@Service
@Transactional
public class MyService {

    @Autowired
    MyRepository myRepository;

    public void recordStats() {

        myRepository.recordStats();
    }

}


@Repository
public class MyRepository {

    @Resource(name="redisTemplate")
    ValueOperations<String, Integer> valueOperations;

    public void recordStats() {

        valueOperations.increment("KEY01", 1);
        valueOperations.increment("KEY02", 1);
        valueOperations.increment("KEY03", 1);
        valueOperations.increment("KEY04", 1);
        valueOperations.increment("KEY05", 1);
        valueOperations.increment("KEY06", 1);
        valueOperations.increment("KEY07", 1);
        valueOperations.increment("KEY08", 1);
        valueOperations.increment("KEY09", 1);
        valueOperations.increment("KEY10", 1);
        valueOperations.increment("KEY11", 1);
    }
}

デバッグでコードを呼び出しmyService.recordStats()てステップ実行すると、KEY11 をインクリメントしようとするとハングし、最終的には で失敗しredis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the poolます。JedisPoolConfigMaxTotal を次のように増やすように修正すると、次のようになります。

@Bean
JedisPoolConfig jedisPoolConfig() {

    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    jedisPoolConfig.setMaxTotal(128);
    return jedisPoolConfig;
}

その後、問題は解決し、1 回のトランザクションで 11 個のキーすべてをインクリメントできます。すべてのvalueOperations.increment呼び出しがプールから別の接続を取得しているようです。これは正しいですか、それともどこかに構成上の問題がありますか?

4

0 に答える 0