Tous les produits
Search
Centre de documentation

Tair (Redis® OSS-Compatible):Retry mechanisms for Redis clients

Dernière mise à jour :Aug 08, 2026

Les instances Tair (Redis OSS-compatible) peuvent connaître des pannes transitoires dues à une instabilité du réseau, à des interruptions de service ou à une charge serveur élevée. Configurez des mécanismes de nouvelle tentative automatiques dans votre bibliothèque cliente pour gérer ces pannes.

Causes des pannes temporaires

Cause Effet
Basculement maître-réplica Tair surveille l'état des nœuds et déclenche un basculement en cas de défaillance du nœud maître. Le client peut subir de brèves interruptions de connexion en quelques secondes, ainsi qu'un état en lecture seule pendant 30 secondes. L'état en lecture seule évite la perte de données et les doubles écritures. Pour plus d'informations, consultez la rubrique High availability.
Requêtes lentes Les opérations dont la complexité temporelle est O(N) bloquent les autres requêtes, ce qui entraîne des échecs temporaires pour les opérations clientes simultanées.
Problèmes réseau L'instabilité du réseau et la retransmission des données entre le client et le serveur provoquent des échecs de requête intermittents.

Bonnes pratiques pour les nouvelles tentatives

Effectuez uniquement des nouvelles tentatives pour les opérations idempotentes

Un dépassement de délai peut survenir à n'importe quelle étape de l'exécution d'une commande :

  • La commande n'a pas atteint le serveur.

  • La commande a atteint le serveur, mais son exécution a expiré.

  • La commande a été exécutée sur le serveur, mais la réception de la réponse a expiré.

Étant donné qu'une opération relancée peut s'exécuter plusieurs fois, effectuez des nouvelles tentatives uniquement pour les opérations idempotentes.

Idempotent -- SET a b : l'exécution multiple de cette commande produit toujours le même résultat.

Non idempotent -- LPUSH mylist a : l'exécution multiple de cette commande ajoute des éléments a en double à mylist.

Définissez un nombre de nouvelles tentatives et un intervalle appropriés

Définissez le nombre de nouvelles tentatives et l'intervalle en fonction de votre charge de travail :

  • Trop peu de nouvelles tentatives ou un intervalle trop long : l'application risque de ne pas parvenir à achever les opérations lors de pannes transitoires brèves.

  • Trop de nouvelles tentatives ou un intervalle trop court : l'application consomme des ressources excessives et peut submerger le serveur.

Stratégie Description
Nouvelle tentative immédiate Relance sans délai. Convient uniquement aux pannes censées se résoudre en quelques millisecondes.
Nouvelle tentative à intervalle fixe Attente d'une durée fixe entre chaque tentative. Peut provoquer des pics de requêtes lorsque de nombreux clients relancent simultanément.
Backoff exponentiel Doublement du temps d'attente après chaque tentative. Répartit les nouvelles tentatives dans le temps et réduit la charge du serveur.
Backoff aléatoire Ajout d'une gigue aléatoire à l'intervalle de backoff. Empêche plusieurs clients de relancer au même instant après un événement de panne partagé.

Évitez l'imbrication des nouvelles tentatives

L'imbrication des nouvelles tentatives, où une opération de relance déclenche une autre boucle de nouvelle tentative, peut entraîner des répétitions ou un nombre illimité de tentatives. Implémentez la logique de nouvelle tentative à un seul niveau de votre pile applicative.

Journalisez les échecs de nouvelle tentative

Générez des journaux de nouvelle tentative au niveau WARN. Enregistrez uniquement lorsque la dernière tentative échoue, et non à chaque essai, afin d'éviter le bruit dans les journaux.

Jedis

Utilisez Jedis version 4.0.0 ou ultérieure. Les exemples suivants utilisent Jedis 5.0.0.

Ajoutez la dépendance à votre fichier pom.xml :

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>5.0.0</version>
</dependency>

Instance standard ou cluster en mode proxy (JedisPool)

Pour les instances standard ou les clusters en mode proxy, utilisez PooledConnectionProvider avec UnifiedJedis.

L'exemple suivant relance la commande SET jusqu'à 5 fois en 10 secondes à l'aide d'un backoff exponentiel. Si toutes les tentatives échouent, une exception est levée.

PooledConnectionProvider provider = new PooledConnectionProvider(HostAndPort.from("127.0.0.1:6379"));
int maxAttempts = 5; // Maximum number of retries
Duration maxTotalRetriesDuration = Duration.ofSeconds(10); // Maximum total retry duration
UnifiedJedis jedis = new UnifiedJedis(provider, maxAttempts, maxTotalRetriesDuration);
try {
    System.out.println("set key: " + jedis.set("key", "value"));
} catch (Exception e) {
    // The operation failed after maxAttempts retries or after maxTotalRetriesDuration elapsed.
    e.printStackTrace();
}
Paramètre Valeur dans l'exemple Description
maxAttempts 5 Nombre maximal de tentatives.
maxTotalRetriesDuration 10 secondes Durée totale maximale cumulée pour toutes les tentatives. Les nouvelles tentatives s'arrêtent lorsque cette durée est dépassée, même si maxAttempts n'a pas été atteint.

Cluster en mode de connexion directe (JedisCluster)

Pour les clusters en mode de connexion directe, utilisez JedisCluster. Le paramètre maxAttempts définit le nombre maximal de tentatives et sa valeur par défaut est 5. Une exception est levée si toutes les tentatives échouent.

HostAndPort hostAndPort = HostAndPort.from("127.0.0.1:30001");
int connectionTimeout = 5000;
int soTimeout = 2000;
int maxAttempts = 5;
ConnectionPoolConfig config = new ConnectionPoolConfig();
JedisCluster jedisCluster = new JedisCluster(hostAndPort, connectionTimeout, soTimeout, maxAttempts, config);
try {
    System.out.println("set key: " + jedisCluster.set("key", "value"));
} catch (Exception e) {
    // The operation failed after maxAttempts retries.
    e.printStackTrace();
}
Paramètre Valeur dans l'exemple Par défaut Description
connectionTimeout 5000 -- Délai de connexion en millisecondes.
soTimeout 2000 -- Délai d'expiration du socket en millisecondes.
maxAttempts 5 5 Nombre maximal de tentatives en cas d'échec.

Redisson

Redisson propose deux paramètres pour contrôler le comportement de nouvelle tentative :

Paramètre Par défaut Description
retryAttempts 3 Nombre de tentatives.
retryInterval 1 500 ms Intervalle entre les nouvelles tentatives, en millisecondes.
Config config = new Config();
config.useSingleServer()
    .setTimeout(1000)
    .setRetryAttempts(3)
    .setRetryInterval(1500) // ms
    .setAddress("redis://127.0.0.1:6379");
RedissonClient connect = Redisson.create(config);

StackExchange.Redis

StackExchange.Redis prend en charge uniquement les nouvelles tentatives de connexion, et non les nouvelles tentatives au niveau des commandes. Utilisez le paramètre connectRetry pour définir le nombre de tentatives de reconnexion.

var conn = ConnectionMultiplexer.Connect("redis0:6380,redis1:6380,connectRetry=3");
Paramètre Valeur dans l'exemple Description
connectRetry 3 Nombre de tentatives pour la connexion initiale.

Pour la logique de nouvelle tentative au niveau des commandes, utilisez une bibliothèque de résilience telle que Polly afin d'encapsuler les commandes individuelles avec des politiques de nouvelle tentative.

Lettuce

Lettuce ne fournit pas de paramètres pour relancer des commandes individuelles après un dépassement de délai. Il offre plutôt deux modes de fiabilité d'exécution :

Mode Comportement
Au plus une fois (At-most-once) Chaque commande s'exécute au plus une fois. Si le client se déconnecte puis se reconnecte, les commandes en attente peuvent être perdues.
Au moins une fois (At-least-once, par défaut) Chaque commande s'exécute au moins une fois. Le client relance les commandes pour garantir leur exécution réussie. Si un basculement maître-réplica se produit pendant que le client effectue des nouvelles tentatives, les commandes de relance peuvent s'accumuler. Une fois le basculement terminé, l'utilisation du processeur de l'instance peut augmenter fortement.

Le paramètre autoReconnect détermine le mode d'exécution :

clientOptions.isAutoReconnect() ? Reliability.AT_LEAST_ONCE : Reliability.AT_MOST_ONCE;

Pour plus d'informations, consultez les rubriques Client-Options et Command execution reliability.

Références