RetryableCommandExecution.java

package redis.clients.jedis.examples;

import java.time.Duration;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Connection;
import redis.clients.jedis.ConnectionPoolConfig;
import redis.clients.jedis.DefaultJedisClientConfig;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisClientConfig;
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.providers.PooledConnectionProvider;

/**
 * It is possible to retry command executions in case of connection failures in UnifiedJedis class.
 *
 * The retry-ability comes through RetryableCommandExecutor class. It is also possible to directly provide
 * RetryableCommandExecutor as a parameter.
 *
 * Note: RetryableCommandExecutor should not be considered for
 * <a href="https://redis.io/docs/reference/cluster-spec/">Open Source Redis Cluster mode</a> because it requires to
 * handle more than connection failures. These are done in ClusterCommandExecutor.
 */
public class RetryableCommandExecution {

  public static void main(String[] args) {

    // Connection and pool parameters
    HostAndPort hostAndPort = new HostAndPort("127.0.0.1", 6379);
    JedisClientConfig clientConfig = DefaultJedisClientConfig.builder().user("myuser").password("mypassword").build();
    GenericObjectPoolConfig<Connection> poolConfig = new ConnectionPoolConfig();

    PooledConnectionProvider provider = new PooledConnectionProvider(hostAndPort, clientConfig, poolConfig);

    // Retry parameters
    int maxAttempts = 5;
    Duration maxTotalRetriesDuration = Duration.ofSeconds(2);

    UnifiedJedis jedis = new UnifiedJedis(provider, maxAttempts, maxTotalRetriesDuration);

    jedis.set("foo", "bar");
    jedis.get("foo");

    jedis.close();
  }
}