Tous les produits
Search
Centre de documentation

Tair (Redis® OSS-Compatible):Optimisation du pool de ressources JedisPool

Dernière mise à jour :Aug 08, 2026

JedisPool est un pool de connexions pour le client Jedis. Une configuration appropriée des paramètres du pool améliore les performances de Redis et l'utilisation des ressources. Cette rubrique présente l'utilisation de JedisPool, la description des paramètres ainsi que des recommandations d'optimisation.

Utilisation

Cet exemple utilise Jedis 2.9.0. Dépendance Maven :

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
    <scope>compile</scope>
</dependency>

Jedis s'appuie sur Apache Commons-pool2 pour la gestion du pool. La classe de configuration principale est GenericObjectPoolConfig :

GenericObjectPoolConfig jedisPoolConfig = new GenericObjectPoolConfig();
jedisPoolConfig.setMaxTotal(...);
jedisPoolConfig.setMaxIdle(...);
jedisPoolConfig.setMinIdle(...);
jedisPoolConfig.setMaxWaitMillis(...);
...

Initialisez un JedisPool :

// redisHost is the IP address of the instance. redisPort is the port of the instance. redisPassword is the password of the instance. timeout is both the connection timeout and the read/write timeout.
JedisPool jedisPool = new JedisPool(jedisPoolConfig, redisHost, redisPort, timeout, redisPassword);
// Execute commands as follows.
Jedis jedis = null;
try {
    jedis = jedisPool.getResource();
    // Specific commands.
    jedis.executeCommand()
} catch (Exception e) {
    logger.error(e.getMessage(), e);
} finally {
    // In JedisPool mode, the Jedis object is returned to the resource pool.
    if (jedis != null) 
        jedis.close();
}

Paramètres

JedisPool gère les connexions Jedis dans un pool limité et thread-safe. Une configuration correcte de GenericObjectPoolConfig améliore les performances de Redis et réduit la consommation de ressources. Les tableaux suivants décrivent les paramètres clés et les valeurs recommandées.

Tableau 1. Paramètres liés à la configuration et à l'utilisation des ressources

Parameter

Description

Default value

Recommendation

maxTotal

Nombre maximal de connexions dans le pool.

8

Paramètres recommandés pour les paramètres clés.

maxIdle

Nombre maximal de connexions inactives dans le pool.

8

Paramètres recommandés pour les paramètres clés.

minIdle

Nombre minimal de connexions inactives maintenues dans le pool.

0

Paramètres recommandés pour les paramètres clés.

blockWhenExhausted

Indique si l'appelant est bloqué lorsque le pool est épuisé. Le paramètre maxWaitMillis prend effet uniquement si cette option est activée.

true

Conservez la valeur par défaut.

maxWaitMillis

Délai d'attente maximal (ms) lorsque le pool est épuisé.

-1 (aucun délai d'expiration)

N'utilisez pas la valeur par défaut.

testOnBorrow

Indique si les connexions sont validées (ping) lors de l'emprunt depuis le pool. Les connexions invalides sont supprimées.

false

Pour un trafic élevé, définissez cette valeur sur false afin de réduire la surcharge liée aux pings.

testOnReturn

Indique si les connexions sont validées (ping) lors du retour au pool. Les connexions invalides sont supprimées.

false

Pour un trafic élevé, définissez cette valeur sur false afin de réduire la surcharge liée aux pings.

jmxEnabled

Indique si la surveillance JMX est activée.

true

Activez cette option. Assurez-vous qu'elle est également activée pour votre application.

Les quatre paramètres suivants contrôlent la détection des connexions inactives.

Tableau 2. Paramètres liés à la détection des ressources inactives

Name

Description

Default value

Recommendation

testWhileIdle

Indique si les connexions inactives sont validées (ping) lors des exécutions d'éviction. Les connexions invalides sont détruites.

false

true

timeBetweenEvictionRunsMillis

Intervalle (ms) entre les exécutions d'éviction des connexions inactives.

-1 (aucune détection)

Définissez ce paramètre pour activer la détection. Vous pouvez choisir la période ou utiliser les valeurs par défaut de JedisPoolConfig indiquées ci-dessous.

minEvictableIdleTimeMillis

Durée minimale d'inactivité (ms) avant qu'une connexion ne soit éligible à l'éviction.

1 800 000 (30 minutes)

La valeur par défaut (30 minutes) est généralement suffisante. Vous pouvez également utiliser les valeurs par défaut de JedisPoolConfig indiquées ci-dessous.

numTestsPerEvictionRun

Nombre de connexions testées par exécution d'éviction.

3

Ajustez ce paramètre en fonction de la taille de votre pool. Définissez-le sur -1 pour vérifier toutes les connexions à chaque exécution d'éviction.

JedisPoolConfig étend GenericObjectPoolConfig avec les valeurs par défaut suivantes pour la détection des connexions inactives :

public class JedisPoolConfig extends GenericObjectPoolConfig {
  public JedisPoolConfig() {
    setTestWhileIdle(true);
    setMinEvictableIdleTimeMillis(60000);
    setTimeBetweenEvictionRunsMillis(30000);
    setNumTestsPerEvictionRun(-1);
    }
}
Remarque

Toutes les valeurs par défaut sont définies dans la classe org.apache.commons.pool2.impl.BaseObjectPoolConfig.

Paramètres recommandés pour les paramètres clés

maxTotal (nombre maximal de connexions)

Prenez en compte les facteurs suivants lors de la définition de maxTotal :

  • La concurrence Redis attendue.

  • Le temps d'exécution des commandes côté client.

  • Les ressources Redis disponibles. Le nombre de nœuds (instances ECS d'application) multiplié par maxTotal ne doit pas dépasser le nombre maximal de connexions autorisé pour l'instance. Consultez la page de détails de l'instance pour connaître cette limite.

  • La surcharge des ressources due aux connexions inactives et aux mises à l'échelle fréquentes du pool.

Exemple : si le temps moyen d'une commande (emprunt + exécution + réseau) est de 1 ms, une connexion peut traiter environ 1 000 QPS. Pour une cible de 50 000 QPS sur une seule instance (QPS total / nombre de shards), la valeur théorique de maxTotal est de 50 000 / 1 000 = 50.

Ajoutez une marge de sécurité au-dessus de la valeur théorique. Toutefois, une surdimension de maxTotal gaspille les ressources client et serveur et n'apporte aucun bénéfice lorsque des commandes volumineuses provoquent des blocages.

maxIdle et minIdle

maxIdle représente le pic réel de connexions nécessaires par votre charge de travail, tandis que maxTotal fournit une marge de sécurité. Évitez de définir maxIdle trop bas, car cela oblige le pool à créer fréquemment de nouvelles connexions new Jedis. Le paramètre minIdle contrôle la détection des ressources inactives.

Les meilleures performances sont obtenues lorsque maxTotal est égal à maxIdle, ce qui évite la surcharge liée à la mise à l'échelle du pool. Définissez-les comme identiques si votre charge de travail présente des pics de trafic. Si la concurrence est faible ou si maxIdle est trop élevé, les connexions inactives constituent un gaspillage de ressources.

Estimez la taille du pool par nœud en fonction du QPS total et du nombre d'instances clientes.

Utilisez la surveillance pour obtenir des valeurs raisonnables

En production, utilisez JMX ou d'autres outils de surveillance pour déterminer les valeurs optimales en fonction des modèles d'utilisation réels.

FAQ

Ressources insuffisantes

Les cas suivants empêchent l'obtention d'une ressource depuis le pool.

  • Délai d'expiration :

    redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
    …
    Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)
  • Le paramètre blockWhenExhausted est défini sur false, de sorte que l'appel n'attend pas la libération d'une ressource :

    redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
    …
    Caused by: java.util.NoSuchElementException: Pool exhausted
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:464)

Cette exception n'est pas toujours causée par une taille de pool insuffisante. Elle peut également résulter de problèmes réseau, de paramètres de pool mal configurés, de la surveillance JMX, d'appels jedis.close() manquants, de requêtes lentes ou de problèmes DNS. Paramètres recommandés pour les paramètres clés.

Préchauffage de JedisPool

JedisPool ne crée pas les connexions de manière proactive lors de l'initialisation. La première requête déclenche une connexion new Jedis, ce qui ajoute de la latence. Avec un délai d'expiration court, cela peut provoquer des délais d'expiration au démarrage. Pour éviter cela, préchargez les connexions en fonction de minIdle après la création du pool :

List<Jedis> minIdleJedisList = new ArrayList<Jedis>(jedisPoolConfig.getMinIdle());

for (int i = 0; i < jedisPoolConfig.getMinIdle(); i++) {
    Jedis jedis = null;
    try {
        jedis = pool.getResource();
        minIdleJedisList.add(jedis);
        jedis.ping();
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
    } finally {
    }
}

for (int i = 0; i < jedisPoolConfig.getMinIdle(); i++) {
    Jedis jedis = null;
    try {
        jedis = minIdleJedisList.get(i);
        jedis.close();
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
    } finally {
    
    }
}

Pour d'autres erreurs, consultez la rubrique Erreurs courantes.