getPool() {
+ return ((PooledConnectionProvider) provider).getPool();
+ }
+
+ @Override
+ public Pipeline pipelined() {
+ return (Pipeline) super.pipelined();
+ }
+}
+
diff --git a/src/main/java/redis/clients/jedis/RedisClusterClient.java b/src/main/java/redis/clients/jedis/RedisClusterClient.java
new file mode 100644
index 0000000000..10457fa7ec
--- /dev/null
+++ b/src/main/java/redis/clients/jedis/RedisClusterClient.java
@@ -0,0 +1,148 @@
+package redis.clients.jedis;
+
+import java.time.Duration;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+import redis.clients.jedis.builders.ClusterClientBuilder;
+import redis.clients.jedis.executors.ClusterCommandExecutor;
+import redis.clients.jedis.executors.CommandExecutor;
+import redis.clients.jedis.providers.ClusterConnectionProvider;
+import redis.clients.jedis.csc.Cache;
+import redis.clients.jedis.providers.ConnectionProvider;
+import redis.clients.jedis.util.JedisClusterCRC16;
+
+public class RedisClusterClient extends UnifiedJedis {
+
+ public static final String INIT_NO_ERROR_PROPERTY = "jedis.cluster.initNoError";
+
+ /**
+ * Default timeout in milliseconds.
+ */
+ public static final int DEFAULT_TIMEOUT = 2000;
+
+ /**
+ * Default amount of attempts for executing a command
+ */
+ public static final int DEFAULT_MAX_ATTEMPTS = 5;
+
+ /**
+ * Creates a RedisClusterClient instance. The provided node is used to make the first contact with the cluster.
+ *
+ * Here, the default timeout of {@value redis.clients.jedis.RedisClusterClient#DEFAULT_TIMEOUT} ms is being used with
+ * {@value redis.clients.jedis.RedisClusterClient#DEFAULT_MAX_ATTEMPTS} maximum attempts.
+ * @param node Node to first connect to.
+ */
+ public RedisClusterClient(HostAndPort node) {
+ super(new ClusterConnectionProvider(Collections.singleton(node), DefaultJedisClientConfig.builder().timeoutMillis(DEFAULT_TIMEOUT).build()),
+ DEFAULT_MAX_ATTEMPTS, Duration.ofMillis((long) DEFAULT_TIMEOUT * DEFAULT_MAX_ATTEMPTS));
+ }
+
+ /**
+ * Creates a RedisClusterClient with multiple entry points.
+ *
+ * Here, the default timeout of {@value redis.clients.jedis.RedisClusterClient#DEFAULT_TIMEOUT} ms is being used with
+ * {@value redis.clients.jedis.RedisClusterClient#DEFAULT_MAX_ATTEMPTS} maximum attempts.
+ * @param nodes Nodes to connect to.
+ */
+ public RedisClusterClient(Set nodes) {
+ super(new ClusterConnectionProvider(nodes, DefaultJedisClientConfig.builder().timeoutMillis(DEFAULT_TIMEOUT).build()),
+ DEFAULT_MAX_ATTEMPTS, Duration.ofMillis((long) DEFAULT_TIMEOUT * DEFAULT_MAX_ATTEMPTS));
+ }
+
+ public RedisClusterClient(Set nodes, String user, String password) {
+ super(new ClusterConnectionProvider(nodes, DefaultJedisClientConfig.builder().user(user).password(password).build()),
+ DEFAULT_MAX_ATTEMPTS, Duration.ofMillis((long) Protocol.DEFAULT_TIMEOUT * DEFAULT_MAX_ATTEMPTS));
+ }
+
+ private RedisClusterClient(CommandExecutor commandExecutor, ConnectionProvider connectionProvider, CommandObjects commandObjects, RedisProtocol redisProtocol, Cache cache) {
+ super(commandExecutor, connectionProvider, commandObjects, redisProtocol, cache);
+ }
+
+ /**
+ * Fluent builder for {@link RedisClusterClient} (Redis Cluster).
+ *
+ * Obtain an instance via {@link #builder()}.
+ *
+ */
+ static public class Builder extends ClusterClientBuilder {
+
+ @Override
+ protected RedisClusterClient createClient() {
+ return new RedisClusterClient(commandExecutor, connectionProvider, commandObjects, clientConfig.getRedisProtocol(),
+ cache);
+ }
+ }
+
+ /**
+ * Create a new builder for configuring RedisClusterClient instances.
+ * @return a new {@link RedisClusterClient.Builder} instance
+ */
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ /**
+ * Returns all nodes that were configured to connect to in key-value pairs ({@link Map}).
+ * Key is the HOST:PORT and the value is the connection pool.
+ * @return the map of all connections.
+ */
+ public Map getClusterNodes() {
+ return ((ClusterConnectionProvider) provider).getNodes();
+ }
+
+ /**
+ * Returns the connection for one of the 16,384 slots.
+ * @param slot the slot to retrieve the connection for.
+ * @return connection of the provided slot. {@code close()} of this connection must be called after use.
+ */
+ public Connection getConnectionFromSlot(int slot) {
+ return ((ClusterConnectionProvider) provider).getConnectionFromSlot(slot);
+ }
+
+ // commands
+ public long spublish(String channel, String message) {
+ return executeCommand(commandObjects.spublish(channel, message));
+ }
+
+ public long spublish(byte[] channel, byte[] message) {
+ return executeCommand(commandObjects.spublish(channel, message));
+ }
+
+ public void ssubscribe(final JedisShardedPubSub jedisPubSub, final String... channels) {
+ try (Connection connection = getConnectionFromSlot(JedisClusterCRC16.getSlot(channels[0]))) {
+ jedisPubSub.proceed(connection, channels);
+ }
+ }
+
+ public void ssubscribe(BinaryJedisShardedPubSub jedisPubSub, final byte[]... channels) {
+ try (Connection connection = getConnectionFromSlot(JedisClusterCRC16.getSlot(channels[0]))) {
+ jedisPubSub.proceed(connection, channels);
+ }
+ }
+ // commands
+
+ @Override
+ public ClusterPipeline pipelined() {
+ return new ClusterPipeline((ClusterConnectionProvider) provider, (ClusterCommandObjects) commandObjects);
+ }
+
+ /**
+ * @param doMulti param
+ * @return nothing
+ * @throws UnsupportedOperationException
+ */
+ @Override
+ public AbstractTransaction transaction(boolean doMulti) {
+ throw new UnsupportedOperationException();
+ }
+
+ public final T executeCommandToReplica(CommandObject commandObject) {
+ if (!(executor instanceof ClusterCommandExecutor)) {
+ throw new UnsupportedOperationException("Support only execute to replica in ClusterCommandExecutor");
+ }
+ return ((ClusterCommandExecutor) executor).executeCommandToReplica(commandObject);
+ }
+}
+
diff --git a/src/main/java/redis/clients/jedis/RedisSentinelClient.java b/src/main/java/redis/clients/jedis/RedisSentinelClient.java
new file mode 100644
index 0000000000..742e0498ce
--- /dev/null
+++ b/src/main/java/redis/clients/jedis/RedisSentinelClient.java
@@ -0,0 +1,53 @@
+package redis.clients.jedis;
+
+import java.util.Set;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import redis.clients.jedis.annots.Experimental;
+import redis.clients.jedis.builders.SentinelClientBuilder;
+import redis.clients.jedis.csc.Cache;
+import redis.clients.jedis.csc.CacheConfig;
+import redis.clients.jedis.csc.CacheFactory;
+import redis.clients.jedis.executors.CommandExecutor;
+import redis.clients.jedis.providers.ConnectionProvider;
+import redis.clients.jedis.providers.SentineledConnectionProvider;
+
+public class RedisSentinelClient extends UnifiedJedis {
+
+ private RedisSentinelClient(CommandExecutor commandExecutor, ConnectionProvider connectionProvider, CommandObjects commandObjects, RedisProtocol redisProtocol, Cache cache) {
+ super(commandExecutor, connectionProvider, commandObjects, redisProtocol, cache);
+ }
+
+ /**
+ * Fluent builder for {@link RedisSentinelClient} (Redis Sentinel).
+ *
+ * Obtain an instance via {@link #builder()}.
+ *
+ */
+ static public class Builder extends SentinelClientBuilder {
+
+ @Override
+ protected RedisSentinelClient createClient() {
+ return new RedisSentinelClient(commandExecutor, connectionProvider, commandObjects, clientConfig.getRedisProtocol(),
+ cache);
+ }
+ }
+
+ /**
+ * Create a new builder for configuring RedisSentinelClient instances.
+ *
+ * @return a new {@link RedisSentinelClient.Builder} instance
+ */
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public HostAndPort getCurrentMaster() {
+ return ((SentineledConnectionProvider) provider).getCurrentMaster();
+ }
+
+ @Override
+ public Pipeline pipelined() {
+ return (Pipeline) super.pipelined();
+ }
+}
+
From 7576a05b1f913fe03852b7934d23a8567a977ad1 Mon Sep 17 00:00:00 2001
From: Igor Malinovskiy
Date: Thu, 6 Nov 2025 18:20:38 +0100
Subject: [PATCH 03/16] Use INIT_NO_ERROR_PROPERTY constant from new class
---
src/main/java/redis/clients/jedis/JedisClusterInfoCache.java | 2 +-
.../clients/jedis/providers/ClusterConnectionProvider.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/main/java/redis/clients/jedis/JedisClusterInfoCache.java b/src/main/java/redis/clients/jedis/JedisClusterInfoCache.java
index ab8b6622c3..367f65acf7 100644
--- a/src/main/java/redis/clients/jedis/JedisClusterInfoCache.java
+++ b/src/main/java/redis/clients/jedis/JedisClusterInfoCache.java
@@ -31,7 +31,7 @@
import redis.clients.jedis.exceptions.JedisException;
import redis.clients.jedis.util.SafeEncoder;
-import static redis.clients.jedis.JedisCluster.INIT_NO_ERROR_PROPERTY;
+import static redis.clients.jedis.RedisClusterClient.INIT_NO_ERROR_PROPERTY;
@Internal
public class JedisClusterInfoCache {
diff --git a/src/main/java/redis/clients/jedis/providers/ClusterConnectionProvider.java b/src/main/java/redis/clients/jedis/providers/ClusterConnectionProvider.java
index 2f2e62dac8..f7b253cda8 100644
--- a/src/main/java/redis/clients/jedis/providers/ClusterConnectionProvider.java
+++ b/src/main/java/redis/clients/jedis/providers/ClusterConnectionProvider.java
@@ -22,7 +22,7 @@
import redis.clients.jedis.exceptions.JedisClusterOperationException;
import redis.clients.jedis.exceptions.JedisException;
-import static redis.clients.jedis.JedisCluster.INIT_NO_ERROR_PROPERTY;
+import static redis.clients.jedis.RedisClusterClient.INIT_NO_ERROR_PROPERTY;
public class ClusterConnectionProvider implements ConnectionProvider {
From f57284f0669d3e4370e289f229f0aae2d8ea41da Mon Sep 17 00:00:00 2001
From: Igor Malinovskiy
Date: Thu, 6 Nov 2025 18:20:51 +0100
Subject: [PATCH 04/16] Deprecate old classes
---
src/main/java/redis/clients/jedis/JedisCluster.java | 8 ++++++++
src/main/java/redis/clients/jedis/JedisPooled.java | 8 ++++++++
src/main/java/redis/clients/jedis/JedisSentineled.java | 8 ++++++++
3 files changed, 24 insertions(+)
diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java
index a733e5d027..8bafcbdfd7 100644
--- a/src/main/java/redis/clients/jedis/JedisCluster.java
+++ b/src/main/java/redis/clients/jedis/JedisCluster.java
@@ -18,6 +18,14 @@
import redis.clients.jedis.providers.ConnectionProvider;
import redis.clients.jedis.util.JedisClusterCRC16;
+/**
+ * JedisCluster is a client for Redis Cluster deployments.
+ *
+ * @deprecated Use {@link RedisClusterClient} instead. RedisClusterClient provides the same functionality
+ * with a cleaner API and simplified constructor options. For basic usage, simple
+ * constructors are available. For advanced configuration, use {@link RedisClusterClient#builder()}.
+ */
+@Deprecated
public class JedisCluster extends UnifiedJedis {
public static final String INIT_NO_ERROR_PROPERTY = "jedis.cluster.initNoError";
diff --git a/src/main/java/redis/clients/jedis/JedisPooled.java b/src/main/java/redis/clients/jedis/JedisPooled.java
index ece0341977..6e6711e088 100644
--- a/src/main/java/redis/clients/jedis/JedisPooled.java
+++ b/src/main/java/redis/clients/jedis/JedisPooled.java
@@ -18,6 +18,14 @@
import redis.clients.jedis.util.JedisURIHelper;
import redis.clients.jedis.util.Pool;
+/**
+ * JedisPooled is a pooled connection client for standalone Redis servers.
+ *
+ * @deprecated Use {@link RedisClient} instead. RedisClient provides the same functionality
+ * with a cleaner API and simplified constructor options. For basic usage, simple
+ * constructors are available. For advanced configuration, use {@link RedisClient#builder()}.
+ */
+@Deprecated
public class JedisPooled extends UnifiedJedis {
public JedisPooled() {
diff --git a/src/main/java/redis/clients/jedis/JedisSentineled.java b/src/main/java/redis/clients/jedis/JedisSentineled.java
index efc4ff69c6..d00742e97a 100644
--- a/src/main/java/redis/clients/jedis/JedisSentineled.java
+++ b/src/main/java/redis/clients/jedis/JedisSentineled.java
@@ -11,6 +11,14 @@
import redis.clients.jedis.providers.ConnectionProvider;
import redis.clients.jedis.providers.SentineledConnectionProvider;
+/**
+ * JedisSentineled is a client for Redis Sentinel deployments.
+ *
+ * @deprecated Use {@link RedisSentinelClient} instead. RedisSentinelClient provides the same functionality
+ * with a cleaner API. Use {@link RedisSentinelClient#builder()} to configure the client
+ * with sentinel settings, master configuration, and connection pooling options.
+ */
+@Deprecated
public class JedisSentineled extends UnifiedJedis {
public JedisSentineled(String masterName, final JedisClientConfig masterClientConfig,
From 9a11ff08b5e7e303b3fc20669fb581f713834445 Mon Sep 17 00:00:00 2001
From: Igor Malinovskiy
Date: Thu, 6 Nov 2025 18:21:08 +0100
Subject: [PATCH 05/16] Deprecate public constructors in UnifiedJedis
---
.../redis/clients/jedis/UnifiedJedis.java | 52 ++++++++++++++++++-
1 file changed, 51 insertions(+), 1 deletion(-)
diff --git a/src/main/java/redis/clients/jedis/UnifiedJedis.java b/src/main/java/redis/clients/jedis/UnifiedJedis.java
index f811fff347..469ac6fa85 100644
--- a/src/main/java/redis/clients/jedis/UnifiedJedis.java
+++ b/src/main/java/redis/clients/jedis/UnifiedJedis.java
@@ -59,18 +59,34 @@ public class UnifiedJedis implements JedisCommands, JedisBinaryCommands,
private JedisBroadcastAndRoundRobinConfig broadcastAndRoundRobinConfig = null;
private final Cache cache;
+ /**
+ * @deprecated Use {@link RedisClient#RedisClient()} instead.
+ */
+ @Deprecated
public UnifiedJedis() {
this(new HostAndPort(Protocol.DEFAULT_HOST, Protocol.DEFAULT_PORT));
}
+ /**
+ * @deprecated Use {@link RedisClient#RedisClient(HostAndPort)} instead.
+ */
+ @Deprecated
public UnifiedJedis(HostAndPort hostAndPort) {
this(new PooledConnectionProvider(hostAndPort), (RedisProtocol) null);
}
+ /**
+ * @deprecated Use {@link RedisClient#RedisClient(String)} instead.
+ */
+ @Deprecated
public UnifiedJedis(final String url) {
this(URI.create(url));
}
+ /**
+ * @deprecated Use {@link RedisClient#RedisClient(URI)} instead.
+ */
+ @Deprecated
public UnifiedJedis(final URI uri) {
this(JedisURIHelper.getHostAndPort(uri), DefaultJedisClientConfig.builder()
.user(JedisURIHelper.getUser(uri)).password(JedisURIHelper.getPassword(uri))
@@ -89,7 +105,9 @@ public UnifiedJedis(final URI uri) {
*
* @param uri The URI to connect to
* @param config The JedisClientConfig object to use
+ * @deprecated Use {@link RedisClient#builder()} to configure the client with custom settings.
*/
+ @Deprecated
public UnifiedJedis(final URI uri, JedisClientConfig config) {
this(JedisURIHelper.getHostAndPort(uri), DefaultJedisClientConfig.builder()
.connectionTimeoutMillis(config.getConnectionTimeoutMillis())
@@ -102,20 +120,33 @@ public UnifiedJedis(final URI uri, JedisClientConfig config) {
.sslParameters(config.getSslParameters()).hostnameVerifier(config.getHostnameVerifier()).build());
}
+ /**
+ * @deprecated Use {@link RedisClient#builder()} to configure the client with custom settings.
+ */
+ @Deprecated
public UnifiedJedis(HostAndPort hostAndPort, JedisClientConfig clientConfig) {
this(new PooledConnectionProvider(hostAndPort, clientConfig), clientConfig.getRedisProtocol());
}
+ /**
+ * @deprecated Use {@link RedisClient#builder()} to configure the client with client-side caching.
+ */
@Experimental
+ @Deprecated
public UnifiedJedis(HostAndPort hostAndPort, JedisClientConfig clientConfig, CacheConfig cacheConfig) {
this(hostAndPort, clientConfig, CacheFactory.getCache(cacheConfig));
}
+ /**
+ * @deprecated Use {@link RedisClient#builder()} to configure the client with client-side caching.
+ */
@Experimental
+ @Deprecated
public UnifiedJedis(HostAndPort hostAndPort, JedisClientConfig clientConfig, Cache cache) {
this(new PooledConnectionProvider(hostAndPort, clientConfig, cache), clientConfig.getRedisProtocol(), cache);
}
+ @Deprecated
public UnifiedJedis(ConnectionProvider provider) {
this(new DefaultCommandExecutor(provider), provider);
}
@@ -134,7 +165,9 @@ protected UnifiedJedis(ConnectionProvider provider, RedisProtocol protocol, Cach
*
* WARNING: Using this constructor means a {@link NullPointerException} will be occurred if
* {@link UnifiedJedis#provider} is accessed.
+ * @deprecated Use {@link RedisClient#builder()} to configure the client with custom settings.
*/
+ @Deprecated
public UnifiedJedis(JedisSocketFactory socketFactory) {
this(new Connection(socketFactory));
}
@@ -144,7 +177,9 @@ public UnifiedJedis(JedisSocketFactory socketFactory) {
*
* WARNING: Using this constructor means a {@link NullPointerException} will be occurred if
* {@link UnifiedJedis#provider} is accessed.
+ * @deprecated Use {@link RedisClient#builder()} to configure the client with custom settings.
*/
+ @Deprecated
public UnifiedJedis(JedisSocketFactory socketFactory, JedisClientConfig clientConfig) {
this(new Connection(socketFactory, clientConfig));
}
@@ -154,7 +189,9 @@ public UnifiedJedis(JedisSocketFactory socketFactory, JedisClientConfig clientCo
*
* WARNING: Using this constructor means a {@link NullPointerException} will be occurred if
* {@link UnifiedJedis#provider} is accessed.
+ * @deprecated
*/
+ @Deprecated
public UnifiedJedis(Connection connection) {
this.provider = null;
this.executor = new SimpleCommandExecutor(connection);
@@ -170,6 +207,9 @@ public UnifiedJedis(Connection connection) {
}
}
+ /**
+ * @deprecated Use {@link RedisClusterClient#builder()} to configure the cluster client.
+ */
@Deprecated
public UnifiedJedis(ClusterConnectionProvider provider, int maxAttempts, Duration maxTotalRetriesDuration) {
this(new ClusterCommandExecutor(provider, maxAttempts, maxTotalRetriesDuration, StaticCommandFlagsRegistry.registry()), provider,
@@ -190,6 +230,10 @@ protected UnifiedJedis(ClusterConnectionProvider provider, int maxAttempts, Dura
new ClusterCommandObjects(), protocol, cache);
}
+ /**
+ * @deprecated Use {@link RedisClient#builder()} to configure the client with retry settings.
+ */
+ @Deprecated
public UnifiedJedis(ConnectionProvider provider, int maxAttempts, Duration maxTotalRetriesDuration) {
this(new RetryableCommandExecutor(provider, maxAttempts, maxTotalRetriesDuration), provider);
}
@@ -199,7 +243,9 @@ public UnifiedJedis(ConnectionProvider provider, int maxAttempts, Duration maxTo
*
* WARNING: Using this constructor means a {@link NullPointerException} will be occurred if
* {@link UnifiedJedis#provider} is accessed.
+ * @deprecated Use {@link RedisClient#builder()} to configure the client with custom settings.
*/
+ @Deprecated
public UnifiedJedis(CommandExecutor executor) {
this(executor, (ConnectionProvider) null);
}
@@ -208,8 +254,12 @@ private UnifiedJedis(CommandExecutor executor, ConnectionProvider provider) {
this(executor, provider, new CommandObjects());
}
- // Uses a fetched connection to process protocol. Should be avoided if possible.
+ /**
+ * Uses a fetched connection to process protocol. Should be avoided if possible.
+ * @deprecated
+ */
@VisibleForTesting
+ @Deprecated
public UnifiedJedis(CommandExecutor executor, ConnectionProvider provider, CommandObjects commandObjects) {
this(executor, provider, commandObjects, null, null);
if (this.provider != null) {
From 27347640b049df8736641812c87cf66269bdfc3c Mon Sep 17 00:00:00 2001
From: Igor Malinovskiy
Date: Thu, 6 Nov 2025 18:21:48 +0100
Subject: [PATCH 06/16] Add migration tests for JedisCluster constructors used
by SDR, Conductor and other OSS projects
---
...ClusterClientMigrationIntegrationTest.java | 312 ++++++++++++++++++
1 file changed, 312 insertions(+)
create mode 100644 src/test/java/redis/clients/jedis/builders/RedisClusterClientMigrationIntegrationTest.java
diff --git a/src/test/java/redis/clients/jedis/builders/RedisClusterClientMigrationIntegrationTest.java b/src/test/java/redis/clients/jedis/builders/RedisClusterClientMigrationIntegrationTest.java
new file mode 100644
index 0000000000..676566040a
--- /dev/null
+++ b/src/test/java/redis/clients/jedis/builders/RedisClusterClientMigrationIntegrationTest.java
@@ -0,0 +1,312 @@
+package redis.clients.jedis.builders;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
+import redis.clients.jedis.Connection;
+import redis.clients.jedis.ConnectionPoolConfig;
+import redis.clients.jedis.DefaultJedisClientConfig;
+import redis.clients.jedis.HostAndPort;
+import redis.clients.jedis.HostAndPorts;
+import redis.clients.jedis.JedisClientConfig;
+import redis.clients.jedis.JedisCluster;
+import redis.clients.jedis.RedisClusterClient;
+
+/**
+ * Integration test that verifies migration compatibility from the legacy JedisCluster constructor
+ * to the new RedisClusterClient.Builder pattern.
+ *
+ * This test demonstrates that the following legacy JedisCluster constructor:
+ *
+ *
+ * public JedisCluster(Set<HostAndPort> clusterNodes, JedisClientConfig clientConfig,
+ * int maxAttempts, GenericObjectPoolConfig<Connection> poolConfig)
+ *
+ *
+ * can be replaced with the RedisClusterClient.Builder pattern while maintaining the same
+ * functionality.
+ */
+@Tag("integration")
+public class RedisClusterClientMigrationIntegrationTest {
+
+ private static final Set CLUSTER_NODES = new HashSet<>(
+ HostAndPorts.getStableClusterServers());
+ private static final String PASSWORD = "cluster";
+ private static final int MAX_ATTEMPTS = 3;
+
+ private JedisCluster legacyCluster;
+ private RedisClusterClient newCluster;
+
+ @BeforeEach
+ public void setUp() {
+ // Clean up any existing data before each test
+ cleanClusterData();
+ }
+
+ @AfterEach
+ public void tearDown() {
+ // Close connections
+ if (legacyCluster != null) {
+ legacyCluster.close();
+ legacyCluster = null;
+ }
+ if (newCluster != null) {
+ newCluster.close();
+ newCluster = null;
+ }
+
+ // Clean up data after tests
+ cleanClusterData();
+ }
+
+ /**
+ * Test that verifies both approaches can handle cluster operations correctly. Tests constructor:
+ * JedisCluster(Set<HostAndPort>, JedisClientConfig, int,
+ * GenericObjectPoolConfig<Connection>)
+ */
+ @Test
+ public void testSpringDataRedisConstructor() {
+ // Prepare common configuration
+ JedisClientConfig clientConfig = DefaultJedisClientConfig.builder().password(PASSWORD)
+ .socketTimeoutMillis(2000).connectionTimeoutMillis(2000).build();
+
+ GenericObjectPoolConfig poolConfig = new ConnectionPoolConfig();
+
+ // Create both cluster clients
+ legacyCluster = new JedisCluster(CLUSTER_NODES, clientConfig, MAX_ATTEMPTS, poolConfig);
+ newCluster = RedisClusterClient.builder().nodes(CLUSTER_NODES).clientConfig(clientConfig)
+ .maxAttempts(MAX_ATTEMPTS).poolConfig(poolConfig).build();
+
+ verifyBothClients(legacyCluster, newCluster);
+ }
+
+ /**
+ * Test migration from constructor with username, password, clientName, and SSL. Tests
+ * constructor: JedisCluster(Set<HostAndPort>, int, int, int, String, String, String,
+ * GenericObjectPoolConfig<Connection>, boolean)
+ */
+ @Test
+ public void testConstructorWithUsernamePasswordClientNameAndSsl() {
+ int connectionTimeout = 2000;
+ int socketTimeout = 2000;
+ String username = "default";
+ String clientName = "test-client";
+ boolean ssl = false; // SSL requires special cluster setup
+
+ GenericObjectPoolConfig poolConfig = new ConnectionPoolConfig();
+
+ // Legacy constructor with username
+ legacyCluster = new JedisCluster(CLUSTER_NODES, connectionTimeout, socketTimeout, MAX_ATTEMPTS,
+ username, PASSWORD, clientName, poolConfig, ssl);
+
+ // New Builder pattern
+ JedisClientConfig clientConfig = DefaultJedisClientConfig.builder()
+ .connectionTimeoutMillis(connectionTimeout).socketTimeoutMillis(socketTimeout)
+ .user(username).password(PASSWORD).clientName(clientName).ssl(ssl).build();
+
+ newCluster = RedisClusterClient.builder().nodes(CLUSTER_NODES).clientConfig(clientConfig)
+ .maxAttempts(MAX_ATTEMPTS).poolConfig(poolConfig).build();
+
+ verifyBothClients(legacyCluster, newCluster);
+ }
+
+ /**
+ * Test migration from constructor with password, clientName, and SSL (no username). Tests
+ * constructor: JedisCluster(Set<HostAndPort>, int, int, int, String, String,
+ * GenericObjectPoolConfig<Connection>, boolean)
+ */
+ @Test
+ public void testConstructorWithPasswordClientNameAndSsl() {
+ int connectionTimeout = 2000;
+ int socketTimeout = 2000;
+ String clientName = "test-client";
+ boolean ssl = false; // SSL requires special cluster setup
+
+ GenericObjectPoolConfig poolConfig = new ConnectionPoolConfig();
+
+ // Legacy constructor without username
+ legacyCluster = new JedisCluster(CLUSTER_NODES, connectionTimeout, socketTimeout, MAX_ATTEMPTS,
+ PASSWORD, clientName, poolConfig, ssl);
+
+ // New Builder pattern
+ JedisClientConfig clientConfig = DefaultJedisClientConfig.builder()
+ .connectionTimeoutMillis(connectionTimeout).socketTimeoutMillis(socketTimeout)
+ .password(PASSWORD).clientName(clientName).ssl(ssl).build();
+
+ newCluster = RedisClusterClient.builder().nodes(CLUSTER_NODES).clientConfig(clientConfig)
+ .maxAttempts(MAX_ATTEMPTS).poolConfig(poolConfig).build();
+
+ verifyBothClients(legacyCluster, newCluster);
+ }
+
+ /**
+ * Test migration from simple constructor with just nodes and poolConfig. Tests constructor:
+ * JedisCluster(Set<HostAndPort>, GenericObjectPoolConfig<Connection>)
+ */
+ @Test
+ public void testConstructorWithNodesAndPoolConfig() {
+ GenericObjectPoolConfig poolConfig = new ConnectionPoolConfig();
+ poolConfig.setMaxTotal(8);
+ poolConfig.setMaxIdle(8);
+
+ // Legacy constructor
+ legacyCluster = new JedisCluster(CLUSTER_NODES, poolConfig);
+
+ // New Builder pattern - need to add password via clientConfig
+ JedisClientConfig clientConfig = DefaultJedisClientConfig.builder().password(PASSWORD).build();
+
+ newCluster = RedisClusterClient.builder().nodes(CLUSTER_NODES).clientConfig(clientConfig)
+ .poolConfig(poolConfig).build();
+
+ verifyBothClients(legacyCluster, newCluster);
+ }
+
+ /**
+ * Test migration from constructor with connection timeout, socket timeout, maxAttempts, password,
+ * and poolConfig. Tests constructor: JedisCluster(Set<HostAndPort>, int, int, int, String,
+ * GenericObjectPoolConfig<Connection>)
+ */
+ @Test
+ public void testConstructorWithTimeoutsPasswordAndPoolConfig() {
+ int connectionTimeout = 2000;
+ int socketTimeout = 2000;
+
+ GenericObjectPoolConfig poolConfig = new ConnectionPoolConfig();
+
+ // Legacy constructor
+ legacyCluster = new JedisCluster(CLUSTER_NODES, connectionTimeout, socketTimeout, MAX_ATTEMPTS,
+ PASSWORD, poolConfig);
+
+ // New Builder pattern
+ JedisClientConfig clientConfig = DefaultJedisClientConfig.builder()
+ .connectionTimeoutMillis(connectionTimeout).socketTimeoutMillis(socketTimeout)
+ .password(PASSWORD).build();
+
+ newCluster = RedisClusterClient.builder().nodes(CLUSTER_NODES).clientConfig(clientConfig)
+ .maxAttempts(MAX_ATTEMPTS).poolConfig(poolConfig).build();
+
+ verifyBothClients(legacyCluster, newCluster);
+ }
+
+ /**
+ * Test migration from constructor with connection timeout, socket timeout, maxAttempts, and
+ * poolConfig (no password). Tests constructor: JedisCluster(Set<HostAndPort>, int, int,
+ * int, GenericObjectPoolConfig<Connection>)
+ */
+ @Test
+ public void testConstructorWithTimeoutsAndPoolConfigNoPassword() {
+ int connectionTimeout = 2000;
+ int socketTimeout = 2000;
+
+ GenericObjectPoolConfig poolConfig = new ConnectionPoolConfig();
+
+ // Legacy constructor without password
+ legacyCluster = new JedisCluster(CLUSTER_NODES, connectionTimeout, socketTimeout, MAX_ATTEMPTS,
+ poolConfig);
+
+ // New Builder pattern - need to add password for our test cluster
+ JedisClientConfig clientConfig = DefaultJedisClientConfig.builder()
+ .connectionTimeoutMillis(connectionTimeout).socketTimeoutMillis(socketTimeout)
+ .password(PASSWORD).build();
+
+ newCluster = RedisClusterClient.builder().nodes(CLUSTER_NODES).clientConfig(clientConfig)
+ .maxAttempts(MAX_ATTEMPTS).poolConfig(poolConfig).build();
+
+ verifyBothClients(legacyCluster, newCluster);
+ }
+
+ /**
+ * Test migration from constructor with timeout, maxAttempts, and poolConfig. Tests constructor:
+ * JedisCluster(Set<HostAndPort>, int, int, GenericObjectPoolConfig<Connection>)
+ */
+ @Test
+ public void testConstructorWithTimeoutMaxAttemptsAndPoolConfig() {
+ int timeout = 2000;
+
+ GenericObjectPoolConfig poolConfig = new ConnectionPoolConfig();
+
+ // Legacy constructor - uses same timeout for connection and socket
+ legacyCluster = new JedisCluster(CLUSTER_NODES, timeout, MAX_ATTEMPTS, poolConfig);
+
+ // New Builder pattern
+ JedisClientConfig clientConfig = DefaultJedisClientConfig.builder().timeoutMillis(timeout)
+ .password(PASSWORD).build();
+
+ newCluster = RedisClusterClient.builder().nodes(CLUSTER_NODES).clientConfig(clientConfig)
+ .maxAttempts(MAX_ATTEMPTS).poolConfig(poolConfig).build();
+
+ verifyBothClients(legacyCluster, newCluster);
+ }
+
+ /**
+ * Test migration from single HostAndPort constructor with poolConfig. Tests constructor:
+ * JedisCluster(HostAndPort, GenericObjectPoolConfig<Connection>)
+ */
+ @Test
+ public void testConstructorWithSingleNodeAndPoolConfig() {
+ HostAndPort singleNode = HostAndPorts.getStableClusterServers().get(0);
+ GenericObjectPoolConfig poolConfig = new ConnectionPoolConfig();
+
+ // Legacy constructor with single node
+ legacyCluster = new JedisCluster(singleNode, poolConfig);
+
+ // New Builder pattern - need to add password and wrap single node in a Set
+ JedisClientConfig clientConfig = DefaultJedisClientConfig.builder().password(PASSWORD).build();
+
+ Set singleNodeSet = new HashSet<>();
+ singleNodeSet.add(singleNode);
+
+ newCluster = RedisClusterClient.builder().nodes(singleNodeSet).clientConfig(clientConfig)
+ .poolConfig(poolConfig).build();
+
+ verifyBothClients(legacyCluster, newCluster);
+ }
+
+ protected void verifyBothClients(JedisCluster legacyCluster, RedisClusterClient newCluster) {
+ // Verify both discovered the cluster nodes
+ assertNotNull(legacyCluster.getClusterNodes(), "Legacy cluster should discover cluster nodes");
+ assertNotNull(newCluster.getClusterNodes(), "New cluster should discover cluster nodes");
+
+ // Both should have discovered the same number of nodes
+ assertEquals(legacyCluster.getClusterNodes().size(), newCluster.getClusterNodes().size(),
+ "Both approaches should discover the same number of cluster nodes");
+
+ // Test basic string operations
+ String key1 = "test-string-key";
+ legacyCluster.set(key1, "value1");
+ assertEquals("value1", newCluster.get(key1));
+
+ // Test increment operations
+ String key2 = "test-counter-key";
+ legacyCluster.set(key2, "0");
+ newCluster.incr(key2);
+ assertEquals("1", legacyCluster.get(key2));
+
+ // Clean up
+ newCluster.del(key1, key2);
+ }
+
+ /**
+ * Helper method to clean up cluster data before and after tests.
+ */
+ private void cleanClusterData() {
+ // Connect to each stable cluster node and flush data
+ for (HostAndPort node : HostAndPorts.getStableClusterServers()) {
+ try (redis.clients.jedis.Jedis jedis = new redis.clients.jedis.Jedis(node)) {
+ jedis.auth(PASSWORD);
+ jedis.flushDB();
+ } catch (Exception e) {
+ // Ignore errors during cleanup
+ }
+ }
+ }
+}
From afd7b68c1f34a01b162cc44fc432b4a83932a0a6 Mon Sep 17 00:00:00 2001
From: Igor Malinovskiy
Date: Thu, 6 Nov 2025 18:23:29 +0100
Subject: [PATCH 07/16] Fix formatting and imports
---
.../java/redis/clients/jedis/RedisClient.java | 48 +++++++++---
.../clients/jedis/RedisClusterClient.java | 74 +++++++++++++++----
.../clients/jedis/RedisSentinelClient.java | 46 +++++++++---
.../redis/clients/jedis/UnifiedJedis.java | 1 -
4 files changed, 129 insertions(+), 40 deletions(-)
diff --git a/src/main/java/redis/clients/jedis/RedisClient.java b/src/main/java/redis/clients/jedis/RedisClient.java
index 9b174f8d1c..22a2ef0699 100644
--- a/src/main/java/redis/clients/jedis/RedisClient.java
+++ b/src/main/java/redis/clients/jedis/RedisClient.java
@@ -10,6 +10,31 @@
import redis.clients.jedis.util.JedisURIHelper;
import redis.clients.jedis.util.Pool;
+/**
+ * {@code RedisClient} is the recommended client for connecting to standalone Redis deployments.
+ *
+ * This class provides a modern, unified interface for interacting with Redis, supporting connection
+ * pooling, authentication, and configuration via a fluent builder API.
+ *
+ *
+ * {@code RedisClient} supersedes the deprecated {@link JedisPooled} and {@link UnifiedJedis}
+ * classes, offering improved usability and extensibility. For new applications, use
+ * {@code RedisClient} instead of the older classes.
+ *
+ *
+ * Example usage:
+ *
+ *
+ *
+ * {
+ * @code
+ * RedisClient client = RedisClient.builder().host("localhost").port(6379).build();
+ * }
+ *
+ *
+ * For advanced configuration, see the {@link RedisClient.Builder} class.
+ *
+ */
public class RedisClient extends UnifiedJedis {
public RedisClient() {
@@ -17,12 +42,12 @@ public RedisClient() {
}
/**
- * WARNING: This constructor only accepts a uri string as {@code url}. {@link JedisURIHelper#isValid(java.net.URI)}
- * can be used before this.
+ * WARNING: This constructor only accepts a uri string as {@code url}.
+ * {@link JedisURIHelper#isValid(java.net.URI)} can be used before this.
*
- * To use a host string, {@link #RedisClient(java.lang.String, int)} can be used with {@link Protocol#DEFAULT_PORT}.
- *
- * @param url
+ * To use a host string, {@link #RedisClient(java.lang.String, int)} can be used with
+ * {@link Protocol#DEFAULT_PORT}.
+ * @param url redis url
*/
public RedisClient(final String url) {
super(url);
@@ -37,14 +62,16 @@ public RedisClient(final HostAndPort hostAndPort) {
}
public RedisClient(final String host, final int port, final String user, final String password) {
- super(new HostAndPort(host, port), DefaultJedisClientConfig.builder().user(user).password(password).build());
+ super(new HostAndPort(host, port),
+ DefaultJedisClientConfig.builder().user(user).password(password).build());
}
public RedisClient(final URI uri) {
super(uri);
}
- private RedisClient(CommandExecutor commandExecutor, ConnectionProvider connectionProvider, CommandObjects commandObjects, RedisProtocol redisProtocol, Cache cache) {
+ private RedisClient(CommandExecutor commandExecutor, ConnectionProvider connectionProvider,
+ CommandObjects commandObjects, RedisProtocol redisProtocol, Cache cache) {
super(commandExecutor, connectionProvider, commandObjects, redisProtocol, cache);
}
@@ -54,12 +81,12 @@ private RedisClient(CommandExecutor commandExecutor, ConnectionProvider connecti
* Obtain an instance via {@link #builder()}.
*
*/
- static public class Builder extends StandaloneClientBuilder {
+ public static class Builder extends StandaloneClientBuilder {
@Override
protected RedisClient createClient() {
- return new RedisClient(commandExecutor, connectionProvider, commandObjects, clientConfig.getRedisProtocol(),
- cache);
+ return new RedisClient(commandExecutor, connectionProvider, commandObjects,
+ clientConfig.getRedisProtocol(), cache);
}
}
@@ -80,4 +107,3 @@ public Pipeline pipelined() {
return (Pipeline) super.pipelined();
}
}
-
diff --git a/src/main/java/redis/clients/jedis/RedisClusterClient.java b/src/main/java/redis/clients/jedis/RedisClusterClient.java
index 10457fa7ec..f291de7464 100644
--- a/src/main/java/redis/clients/jedis/RedisClusterClient.java
+++ b/src/main/java/redis/clients/jedis/RedisClusterClient.java
@@ -13,6 +13,35 @@
import redis.clients.jedis.providers.ConnectionProvider;
import redis.clients.jedis.util.JedisClusterCRC16;
+/**
+ * RedisClusterClient provides a high-level, unified interface for interacting with a Redis Cluster.
+ *
+ * This class is intended as a modern replacement for the deprecated {@code JedisCluster} class. It
+ * supports all cluster operations and is designed to work seamlessly with the {@link UnifiedJedis}
+ * API, allowing for consistent usage patterns across standalone, sentinel, and cluster deployments.
+ *
+ * Usage:
+ *
+ *
+ * {
+ * @code
+ * Set clusterNodes = new HashSet<>();
+ * clusterNodes.add(new HostAndPort("127.0.0.1", 7000));
+ * RedisClusterClient client = new RedisClusterClient(clusterNodes);
+ * client.set("key", "value");
+ * String value = client.get("key");
+ * }
+ *
+ *
+ * Migration: Users of {@code JedisCluster} are encouraged to migrate to this class for
+ * improved API consistency, better resource management, and enhanced support for future Redis
+ * features.
+ *
+ * Thread-safety: This client is thread-safe and can be shared across multiple threads.
+ *
+ * Configuration: Various constructors allow for flexible configuration, including
+ * authentication and custom timeouts.
+ */
public class RedisClusterClient extends UnifiedJedis {
public static final String INIT_NO_ERROR_PROPERTY = "jedis.cluster.initNoError";
@@ -28,35 +57,46 @@ public class RedisClusterClient extends UnifiedJedis {
public static final int DEFAULT_MAX_ATTEMPTS = 5;
/**
- * Creates a RedisClusterClient instance. The provided node is used to make the first contact with the cluster.
+ * Creates a RedisClusterClient instance. The provided node is used to make the first contact with
+ * the cluster.
*
- * Here, the default timeout of {@value redis.clients.jedis.RedisClusterClient#DEFAULT_TIMEOUT} ms is being used with
- * {@value redis.clients.jedis.RedisClusterClient#DEFAULT_MAX_ATTEMPTS} maximum attempts.
+ * Here, the default timeout of {@value redis.clients.jedis.RedisClusterClient#DEFAULT_TIMEOUT} ms
+ * is being used with {@value redis.clients.jedis.RedisClusterClient#DEFAULT_MAX_ATTEMPTS} maximum
+ * attempts.
* @param node Node to first connect to.
*/
public RedisClusterClient(HostAndPort node) {
- super(new ClusterConnectionProvider(Collections.singleton(node), DefaultJedisClientConfig.builder().timeoutMillis(DEFAULT_TIMEOUT).build()),
+ super(
+ new ClusterConnectionProvider(Collections.singleton(node),
+ DefaultJedisClientConfig.builder().timeoutMillis(DEFAULT_TIMEOUT).build()),
DEFAULT_MAX_ATTEMPTS, Duration.ofMillis((long) DEFAULT_TIMEOUT * DEFAULT_MAX_ATTEMPTS));
}
/**
* Creates a RedisClusterClient with multiple entry points.
*
- * Here, the default timeout of {@value redis.clients.jedis.RedisClusterClient#DEFAULT_TIMEOUT} ms is being used with
- * {@value redis.clients.jedis.RedisClusterClient#DEFAULT_MAX_ATTEMPTS} maximum attempts.
+ * Here, the default timeout of {@value redis.clients.jedis.RedisClusterClient#DEFAULT_TIMEOUT} ms
+ * is being used with {@value redis.clients.jedis.RedisClusterClient#DEFAULT_MAX_ATTEMPTS} maximum
+ * attempts.
* @param nodes Nodes to connect to.
*/
public RedisClusterClient(Set nodes) {
- super(new ClusterConnectionProvider(nodes, DefaultJedisClientConfig.builder().timeoutMillis(DEFAULT_TIMEOUT).build()),
+ super(
+ new ClusterConnectionProvider(nodes,
+ DefaultJedisClientConfig.builder().timeoutMillis(DEFAULT_TIMEOUT).build()),
DEFAULT_MAX_ATTEMPTS, Duration.ofMillis((long) DEFAULT_TIMEOUT * DEFAULT_MAX_ATTEMPTS));
}
public RedisClusterClient(Set nodes, String user, String password) {
- super(new ClusterConnectionProvider(nodes, DefaultJedisClientConfig.builder().user(user).password(password).build()),
- DEFAULT_MAX_ATTEMPTS, Duration.ofMillis((long) Protocol.DEFAULT_TIMEOUT * DEFAULT_MAX_ATTEMPTS));
+ super(
+ new ClusterConnectionProvider(nodes,
+ DefaultJedisClientConfig.builder().user(user).password(password).build()),
+ DEFAULT_MAX_ATTEMPTS,
+ Duration.ofMillis((long) Protocol.DEFAULT_TIMEOUT * DEFAULT_MAX_ATTEMPTS));
}
- private RedisClusterClient(CommandExecutor commandExecutor, ConnectionProvider connectionProvider, CommandObjects commandObjects, RedisProtocol redisProtocol, Cache cache) {
+ private RedisClusterClient(CommandExecutor commandExecutor, ConnectionProvider connectionProvider,
+ CommandObjects commandObjects, RedisProtocol redisProtocol, Cache cache) {
super(commandExecutor, connectionProvider, commandObjects, redisProtocol, cache);
}
@@ -70,8 +110,8 @@ static public class Builder extends ClusterClientBuilder {
@Override
protected RedisClusterClient createClient() {
- return new RedisClusterClient(commandExecutor, connectionProvider, commandObjects, clientConfig.getRedisProtocol(),
- cache);
+ return new RedisClusterClient(commandExecutor, connectionProvider, commandObjects,
+ clientConfig.getRedisProtocol(), cache);
}
}
@@ -95,7 +135,8 @@ public Map getClusterNodes() {
/**
* Returns the connection for one of the 16,384 slots.
* @param slot the slot to retrieve the connection for.
- * @return connection of the provided slot. {@code close()} of this connection must be called after use.
+ * @return connection of the provided slot. {@code close()} of this connection must be called
+ * after use.
*/
public Connection getConnectionFromSlot(int slot) {
return ((ClusterConnectionProvider) provider).getConnectionFromSlot(slot);
@@ -125,7 +166,8 @@ public void ssubscribe(BinaryJedisShardedPubSub jedisPubSub, final byte[]... cha
@Override
public ClusterPipeline pipelined() {
- return new ClusterPipeline((ClusterConnectionProvider) provider, (ClusterCommandObjects) commandObjects);
+ return new ClusterPipeline((ClusterConnectionProvider) provider,
+ (ClusterCommandObjects) commandObjects);
}
/**
@@ -140,9 +182,9 @@ public AbstractTransaction transaction(boolean doMulti) {
public final T executeCommandToReplica(CommandObject commandObject) {
if (!(executor instanceof ClusterCommandExecutor)) {
- throw new UnsupportedOperationException("Support only execute to replica in ClusterCommandExecutor");
+ throw new UnsupportedOperationException(
+ "Support only execute to replica in ClusterCommandExecutor");
}
return ((ClusterCommandExecutor) executor).executeCommandToReplica(commandObject);
}
}
-
diff --git a/src/main/java/redis/clients/jedis/RedisSentinelClient.java b/src/main/java/redis/clients/jedis/RedisSentinelClient.java
index 742e0498ce..a67d3eff3b 100644
--- a/src/main/java/redis/clients/jedis/RedisSentinelClient.java
+++ b/src/main/java/redis/clients/jedis/RedisSentinelClient.java
@@ -1,19 +1,43 @@
package redis.clients.jedis;
-import java.util.Set;
-import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
-import redis.clients.jedis.annots.Experimental;
import redis.clients.jedis.builders.SentinelClientBuilder;
import redis.clients.jedis.csc.Cache;
-import redis.clients.jedis.csc.CacheConfig;
-import redis.clients.jedis.csc.CacheFactory;
+
import redis.clients.jedis.executors.CommandExecutor;
import redis.clients.jedis.providers.ConnectionProvider;
import redis.clients.jedis.providers.SentineledConnectionProvider;
+/**
+ * A high-level client for interacting with Redis Sentinel-managed Redis deployments.
+ *
+ * {@code RedisSentinelClient} provides robust support for automatic master failover, connection
+ * management, and command execution in environments where Redis Sentinel is used to monitor and
+ * manage Redis servers.
+ *
+ *
+ * Usage:
+ *
+ *
+ *
+ * RedisSentinelClient client = RedisSentinelClient.builder().sentinel("localhost", 26379)
+ * .masterName("mymaster").build();
+ *
+ *
+ * Relationship to {@code JedisSentineled}:
+ *
+ * - {@code RedisSentinelClient} is the recommended replacement for the deprecated
+ * {@code JedisSentineled} class.
+ * - It offers improved API consistency, better failover handling, and a fluent builder for
+ * configuration.
+ * - Use {@code RedisSentinelClient} for new codebases and when migrating from
+ * {@code JedisSentineled}.
+ *
+ *
+ */
public class RedisSentinelClient extends UnifiedJedis {
-
- private RedisSentinelClient(CommandExecutor commandExecutor, ConnectionProvider connectionProvider, CommandObjects commandObjects, RedisProtocol redisProtocol, Cache cache) {
+ private RedisSentinelClient(CommandExecutor commandExecutor,
+ ConnectionProvider connectionProvider, CommandObjects commandObjects,
+ RedisProtocol redisProtocol, Cache cache) {
super(commandExecutor, connectionProvider, commandObjects, redisProtocol, cache);
}
@@ -23,18 +47,17 @@ private RedisSentinelClient(CommandExecutor commandExecutor, ConnectionProvider
* Obtain an instance via {@link #builder()}.
*
*/
- static public class Builder extends SentinelClientBuilder {
+ public static class Builder extends SentinelClientBuilder {
@Override
protected RedisSentinelClient createClient() {
- return new RedisSentinelClient(commandExecutor, connectionProvider, commandObjects, clientConfig.getRedisProtocol(),
- cache);
+ return new RedisSentinelClient(commandExecutor, connectionProvider, commandObjects,
+ clientConfig.getRedisProtocol(), cache);
}
}
/**
* Create a new builder for configuring RedisSentinelClient instances.
- *
* @return a new {@link RedisSentinelClient.Builder} instance
*/
public static Builder builder() {
@@ -50,4 +73,3 @@ public Pipeline pipelined() {
return (Pipeline) super.pipelined();
}
}
-
diff --git a/src/main/java/redis/clients/jedis/UnifiedJedis.java b/src/main/java/redis/clients/jedis/UnifiedJedis.java
index 469ac6fa85..0abb100ae7 100644
--- a/src/main/java/redis/clients/jedis/UnifiedJedis.java
+++ b/src/main/java/redis/clients/jedis/UnifiedJedis.java
@@ -26,7 +26,6 @@
import redis.clients.jedis.json.JsonSetParams;
import redis.clients.jedis.json.Path;
import redis.clients.jedis.json.Path2;
-import redis.clients.jedis.mcf.MultiDbCommandExecutor;
import redis.clients.jedis.params.VAddParams;
import redis.clients.jedis.params.VSimParams;
import redis.clients.jedis.resps.RawVector;
From 6188817bc356264a6ab1b2ce402ca3dd63e6aed3 Mon Sep 17 00:00:00 2001
From: Igor Malinovskiy
Date: Wed, 19 Nov 2025 18:52:09 +0100
Subject: [PATCH 08/16] Replace usages of JedisPooled with RedisClient
---
.../redis/clients/jedis/mcf/PingStrategy.java | 5 +-
.../examples/SearchQuickstartExample.java | 2 +-
...isPooledTest.java => RedisClientTest.java} | 36 +++---
...st.java => SSLOptionsRedisClientTest.java} | 34 ++++--
.../RedisEntraIDIntegrationTests.java | 42 +++++--
...ntraIDManagedIdentityIntegrationTests.java | 12 +-
...enBasedAuthenticationIntegrationTests.java | 31 +++--
...nchmark.java => RedisClientBenchmark.java} | 9 +-
...mark.java => RedisClientCSCBenchmark.java} | 10 +-
.../jedis/builders/ClientBuilderTest.java | 20 ++--
.../BinaryStreamsPipelineCommandsTest.java | 24 ++--
.../pipeline/GeoPipelineCommandsTest.java | 68 +++++------
.../pipeline/ListPipelineCommandsTest.java | 12 +-
.../pipeline/PipelineCommandsTestBase.java | 18 +--
.../pipeline/StreamsPipelineCommandsTest.java | 74 ++++++------
.../PooledAllKindOfValuesCommandsTest.java | 10 +-
.../PooledBinaryValuesCommandsTest.java | 4 +-
.../unified/pooled/PooledBitCommandsTest.java | 10 +-
.../PooledExtendedVectorSetCommandsTest.java | 8 +-
.../unified/pooled/PooledGeoCommandsTest.java | 5 +-
.../pooled/PooledHashesCommandsTest.java | 10 +-
.../pooled/PooledHyperLogLogCommandsTest.java | 4 +-
.../pooled/PooledListCommandsTest.java | 10 +-
.../pooled/PooledMiscellaneousTest.java | 10 +-
.../unified/pooled/PooledSetCommandsTest.java | 10 +-
.../pooled/PooledSortedSetCommandsTest.java | 10 +-
.../PooledStreamsBinaryCommandsTest.java | 6 +-
.../pooled/PooledStreamsCommandsTest.java | 6 +-
.../PooledStringValuesCommandsTest.java | 10 +-
.../pooled/PooledVectorSetCommandsTest.java | 8 +-
...ava => RedisClientCommandsTestHelper.java} | 6 +-
.../csc/AllowAndDenyListCacheableTest.java | 44 +++++--
.../csc/ClientSideCacheFunctionalityTest.java | 113 ++++++++++++++----
.../JedisSentineledClientSideCacheTest.java | 52 --------
...est.java => RedisClientSideCacheTest.java} | 2 +-
...java => RedisClientSideCacheTestBase.java} | 21 ++--
.../csc/RedisSentinelClientSideCacheTest.java | 56 +++++++++
....java => SSLRedisClientSideCacheTest.java} | 4 +-
.../GeoShapeFieldsUsageInRediSearch.java | 5 +-
.../RedisCredentialsProviderUsage.java | 7 +-
.../prefix/JedisPooledPrefixedKeysTest.java | 11 +-
41 files changed, 510 insertions(+), 329 deletions(-)
rename src/test/java/redis/clients/jedis/{JedisPooledTest.java => RedisClientTest.java} (89%)
rename src/test/java/redis/clients/jedis/{SSLOptionsJedisPooledTest.java => SSLOptionsRedisClientTest.java} (68%)
rename src/test/java/redis/clients/jedis/benchmark/{PooledBenchmark.java => RedisClientBenchmark.java} (83%)
rename src/test/java/redis/clients/jedis/benchmark/{CSCPooleadBenchmark.java => RedisClientCSCBenchmark.java} (91%)
rename src/test/java/redis/clients/jedis/commands/unified/pooled/{PooledCommandsTestHelper.java => RedisClientCommandsTestHelper.java} (73%)
delete mode 100644 src/test/java/redis/clients/jedis/csc/JedisSentineledClientSideCacheTest.java
rename src/test/java/redis/clients/jedis/csc/{JedisPooledClientSideCacheTest.java => RedisClientSideCacheTest.java} (89%)
rename src/test/java/redis/clients/jedis/csc/{JedisPooledClientSideCacheTestBase.java => RedisClientSideCacheTestBase.java} (65%)
create mode 100644 src/test/java/redis/clients/jedis/csc/RedisSentinelClientSideCacheTest.java
rename src/test/java/redis/clients/jedis/csc/{SSLJedisPooledClientSideCacheTest.java => SSLRedisClientSideCacheTest.java} (87%)
diff --git a/src/main/java/redis/clients/jedis/mcf/PingStrategy.java b/src/main/java/redis/clients/jedis/mcf/PingStrategy.java
index 9f9a143596..bf92a0889f 100644
--- a/src/main/java/redis/clients/jedis/mcf/PingStrategy.java
+++ b/src/main/java/redis/clients/jedis/mcf/PingStrategy.java
@@ -6,7 +6,7 @@
import redis.clients.jedis.Endpoint;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisClientConfig;
-import redis.clients.jedis.JedisPooled;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.MultiDbConfig.StrategySupplier;
@@ -24,7 +24,8 @@ public PingStrategy(HostAndPort hostAndPort, JedisClientConfig jedisClientConfig
HealthCheckStrategy.Config config) {
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig<>();
poolConfig.setMaxTotal(MAX_HEALTH_CHECK_POOL_SIZE);
- this.jedis = new JedisPooled(hostAndPort, jedisClientConfig, poolConfig);
+ this.jedis = RedisClient.builder().hostAndPort(hostAndPort).clientConfig(jedisClientConfig)
+ .poolConfig(poolConfig).build();
this.config = config;
}
diff --git a/src/test/java/io/redis/examples/SearchQuickstartExample.java b/src/test/java/io/redis/examples/SearchQuickstartExample.java
index 8fbe5d7f32..006799a833 100644
--- a/src/test/java/io/redis/examples/SearchQuickstartExample.java
+++ b/src/test/java/io/redis/examples/SearchQuickstartExample.java
@@ -37,7 +37,7 @@ public class SearchQuickstartExample {
public void run() {
// STEP_START connect
// UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
- JedisPooled jedis = new JedisPooled("localhost", 6379);
+ RedisClient jedis = new RedisClient("localhost", 6379);
// STEP_END
// REMOVE_START
try {
diff --git a/src/test/java/redis/clients/jedis/JedisPooledTest.java b/src/test/java/redis/clients/jedis/RedisClientTest.java
similarity index 89%
rename from src/test/java/redis/clients/jedis/JedisPooledTest.java
rename to src/test/java/redis/clients/jedis/RedisClientTest.java
index a7dead0b01..fa75e06cce 100644
--- a/src/test/java/redis/clients/jedis/JedisPooledTest.java
+++ b/src/test/java/redis/clients/jedis/RedisClientTest.java
@@ -22,7 +22,7 @@
import redis.clients.jedis.exceptions.JedisException;
@Tag("integration")
-public class JedisPooledTest {
+public class RedisClientTest {
private static final EndpointConfig endpointStandalone7 = HostAndPorts.getRedisEndpoint(
"standalone7-with-lfu-policy");
@@ -31,7 +31,7 @@ public class JedisPooledTest {
@Test
public void checkCloseableConnections() {
- JedisPooled pool = JedisPooled.builder()
+ RedisClient pool = RedisClient.builder()
.hostAndPort(endpointStandalone7.getHost(), endpointStandalone7.getPort())
.clientConfig(DefaultJedisClientConfig.builder().timeoutMillis(2000).build()).build();
pool.set("foo", "bar");
@@ -42,7 +42,7 @@ public void checkCloseableConnections() {
@Test
public void checkResourceWithConfig() {
- try (JedisPooled pool = JedisPooled.builder().hostAndPort(endpointStandalone7.getHostAndPort())
+ try (RedisClient pool = RedisClient.builder().hostAndPort(endpointStandalone7.getHostAndPort())
.clientConfig(DefaultJedisClientConfig.builder().socketTimeoutMillis(5000).build())
.build()) {
@@ -59,7 +59,7 @@ public void checkPoolOverflow() {
config.setMaxTotal(1);
config.setBlockWhenExhausted(false);
try (
- JedisPooled pool = JedisPooled.builder().hostAndPort(endpointStandalone7.getHostAndPort())
+ RedisClient pool = RedisClient.builder().hostAndPort(endpointStandalone7.getHostAndPort())
.poolConfig(config).build();
Connection jedis = pool.getPool().getResource()) {
assertThrows(JedisException.class, () -> pool.getPool().getResource());
@@ -74,7 +74,7 @@ public void startWithUrlString() {
j.set("foo", "bar");
}
- try (JedisPooled pool = JedisPooled.builder()
+ try (RedisClient pool = RedisClient.builder()
.fromURI(endpointStandalone1.getURIBuilder()
.credentials("", endpointStandalone1.getPassword()).path("/2").build().toString())
.build()) {
@@ -90,7 +90,7 @@ public void startWithUrl() throws URISyntaxException {
j.set("foo", "bar");
}
- try (JedisPooled pool = JedisPooled.builder().fromURI(endpointStandalone1.getURIBuilder()
+ try (RedisClient pool = RedisClient.builder().fromURI(endpointStandalone1.getURIBuilder()
.credentials("", endpointStandalone1.getPassword()).path("/2").build()).build()) {
assertEquals("bar", pool.get("foo"));
}
@@ -99,19 +99,19 @@ public void startWithUrl() throws URISyntaxException {
@Test
public void shouldThrowExceptionForInvalidURI() {
assertThrows(Exception.class,
- () -> JedisPooled.builder().fromURI(new URI("localhost:6380")).build());
+ () -> RedisClient.builder().fromURI(new URI("localhost:6380")).build());
}
@Test
public void allowUrlWithNoDBAndNoPassword() throws URISyntaxException {
- JedisPooled.builder().fromURI(endpointStandalone1.getURI().toString()).build().close();
- JedisPooled.builder().fromURI(endpointStandalone1.getURI()).build().close();
+ RedisClient.builder().fromURI(endpointStandalone1.getURI().toString()).build().close();
+ RedisClient.builder().fromURI(endpointStandalone1.getURI()).build().close();
}
@Test
public void customClientName() {
try (
- JedisPooled pool = JedisPooled.builder().hostAndPort(endpointStandalone7.getHostAndPort())
+ RedisClient pool = RedisClient.builder().hostAndPort(endpointStandalone7.getHostAndPort())
.clientConfig(
DefaultJedisClientConfig.builder().clientName("my_shiny_client_name").build())
.build();
@@ -123,7 +123,7 @@ public void customClientName() {
@Test
public void invalidClientName() {
try (
- JedisPooled pool = JedisPooled.builder().hostAndPort(endpointStandalone7.getHostAndPort())
+ RedisClient pool = RedisClient.builder().hostAndPort(endpointStandalone7.getHostAndPort())
.clientConfig(
DefaultJedisClientConfig.builder().clientName("invalid client name").build())
.build();
@@ -137,7 +137,7 @@ public void invalidClientName() {
@Test
public void getNumActiveWhenPoolIsClosed() {
- JedisPooled pool = JedisPooled.builder().hostAndPort(endpointStandalone7.getHostAndPort())
+ RedisClient pool = RedisClient.builder().hostAndPort(endpointStandalone7.getHostAndPort())
.build();
try (Connection j = pool.getPool().getResource()) {
@@ -150,7 +150,7 @@ public void getNumActiveWhenPoolIsClosed() {
@Test
public void getNumActiveReturnsTheCorrectNumber() {
- try (JedisPooled pool = JedisPooled.builder()
+ try (RedisClient pool = RedisClient.builder()
.hostAndPort(endpointStandalone7.getHost(), endpointStandalone7.getPort())
.clientConfig(DefaultJedisClientConfig.builder().timeoutMillis(2000).build())
.poolConfig(new ConnectionPoolConfig()).build()) {
@@ -171,7 +171,7 @@ public void getNumActiveReturnsTheCorrectNumber() {
@Test
public void closeResourceTwice() {
- try (JedisPooled pool = JedisPooled.builder()
+ try (RedisClient pool = RedisClient.builder()
.hostAndPort(endpointStandalone7.getHost(), endpointStandalone7.getPort())
.clientConfig(DefaultJedisClientConfig.builder().timeoutMillis(2000).build())
.poolConfig(new ConnectionPoolConfig()).build()) {
@@ -184,7 +184,7 @@ public void closeResourceTwice() {
@Test
public void closeBrokenResourceTwice() {
- try (JedisPooled pool = JedisPooled.builder()
+ try (RedisClient pool = RedisClient.builder()
.hostAndPort(endpointStandalone7.getHost(), endpointStandalone7.getPort())
.clientConfig(DefaultJedisClientConfig.builder().timeoutMillis(2000).build())
.poolConfig(new ConnectionPoolConfig()).build()) {
@@ -204,10 +204,10 @@ public void closeBrokenResourceTwice() {
@Test
public void testResetValidCredentials() {
- DefaultRedisCredentialsProvider credentialsProvider =
+ DefaultRedisCredentialsProvider credentialsProvider =
new DefaultRedisCredentialsProvider(new DefaultRedisCredentials(null, "bad password"));
- try (JedisPooled pool = JedisPooled.builder().hostAndPort(endpointStandalone1.getHostAndPort())
+ try (RedisClient pool = RedisClient.builder().hostAndPort(endpointStandalone1.getHostAndPort())
.clientConfig(
DefaultJedisClientConfig.builder().credentialsProvider(credentialsProvider).build())
.build()) {
@@ -269,7 +269,7 @@ public void cleanUp() {
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig<>();
poolConfig.setMaxTotal(1);
poolConfig.setTestOnBorrow(true);
- try (JedisPooled pool = JedisPooled.builder().hostAndPort(endpointStandalone1.getHostAndPort())
+ try (RedisClient pool = RedisClient.builder().hostAndPort(endpointStandalone1.getHostAndPort())
.clientConfig(
DefaultJedisClientConfig.builder().credentialsProvider(credentialsProvider).build())
.poolConfig(poolConfig).build()) {
diff --git a/src/test/java/redis/clients/jedis/SSLOptionsJedisPooledTest.java b/src/test/java/redis/clients/jedis/SSLOptionsRedisClientTest.java
similarity index 68%
rename from src/test/java/redis/clients/jedis/SSLOptionsJedisPooledTest.java
rename to src/test/java/redis/clients/jedis/SSLOptionsRedisClientTest.java
index 6cb5ee0e58..29f543d224 100644
--- a/src/test/java/redis/clients/jedis/SSLOptionsJedisPooledTest.java
+++ b/src/test/java/redis/clients/jedis/SSLOptionsRedisClientTest.java
@@ -12,7 +12,7 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
@Tag("integration")
-public class SSLOptionsJedisPooledTest {
+public class SSLOptionsRedisClientTest {
protected static final EndpointConfig endpoint = HostAndPorts.getRedisEndpoint("standalone0-tls");
@@ -31,48 +31,56 @@ public static void prepare() {
@Test
public void connectWithClientConfig() {
- try (JedisPooled jedis = new JedisPooled(endpoint.getHostAndPort(),
- endpoint.getClientConfigBuilder()
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(endpoint.getHostAndPort())
+ .clientConfig(endpoint.getClientConfigBuilder()
.sslOptions(SslOptions.builder()
.truststore(trustStorePath.toFile())
.trustStoreType("jceks")
- .build()).build())) {
+ .build()).build())
+ .build()) {
assertEquals("PONG", jedis.ping());
}
}
@Test
public void connectWithSslInsecure() {
- try (JedisPooled jedis = new JedisPooled(endpoint.getHostAndPort(),
- endpoint.getClientConfigBuilder()
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(endpoint.getHostAndPort())
+ .clientConfig(endpoint.getClientConfigBuilder()
.sslOptions(SslOptions.builder()
.sslVerifyMode(SslVerifyMode.INSECURE)
- .build()).build())) {
+ .build()).build())
+ .build()) {
assertEquals("PONG", jedis.ping());
}
}
@Test
public void connectWithSslContextProtocol() {
- try (JedisPooled jedis = new JedisPooled(endpoint.getHostAndPort(),
- endpoint.getClientConfigBuilder()
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(endpoint.getHostAndPort())
+ .clientConfig(endpoint.getClientConfigBuilder()
.sslOptions(SslOptions.builder()
.sslProtocol("SSL")
.truststore(trustStorePath.toFile())
.trustStoreType("jceks")
- .build()).build())) {
+ .build()).build())
+ .build()) {
assertEquals("PONG", jedis.ping());
}
}
@Test
public void connectWithAcl() {
- try (JedisPooled jedis = new JedisPooled(aclEndpoint.getHostAndPort(),
- aclEndpoint.getClientConfigBuilder()
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(aclEndpoint.getHostAndPort())
+ .clientConfig(aclEndpoint.getClientConfigBuilder()
.sslOptions(SslOptions.builder()
.truststore(trustStorePath.toFile())
.trustStoreType("jceks")
- .build()).build())) {
+ .build()).build())
+ .build()) {
assertEquals("PONG", jedis.ping());
}
}
diff --git a/src/test/java/redis/clients/jedis/authentication/RedisEntraIDIntegrationTests.java b/src/test/java/redis/clients/jedis/authentication/RedisEntraIDIntegrationTests.java
index 1b622ca57e..d639571fbb 100644
--- a/src/test/java/redis/clients/jedis/authentication/RedisEntraIDIntegrationTests.java
+++ b/src/test/java/redis/clients/jedis/authentication/RedisEntraIDIntegrationTests.java
@@ -65,7 +65,7 @@
import redis.clients.jedis.EndpointConfig;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.HostAndPorts;
-import redis.clients.jedis.JedisPooled;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.exceptions.JedisAccessControlException;
import redis.clients.jedis.exceptions.JedisConnectionException;
import redis.clients.jedis.scenario.FaultInjectionClient;
@@ -119,7 +119,10 @@ public void testJedisConfig() {
DefaultJedisClientConfig jedisConfig = DefaultJedisClientConfig.builder()
.authXManager(new AuthXManager(tokenAuthConfig)).build();
- JedisPooled jedis = new JedisPooled(new HostAndPort("localhost", 6379), jedisConfig);
+ RedisClient jedis = RedisClient.builder()
+ .hostAndPort(new HostAndPort("localhost", 6379))
+ .clientConfig(jedisConfig)
+ .build();
assertNotNull(jedis);
assertEquals(1, counter.get());
@@ -137,7 +140,10 @@ public void withSecret_azureServicePrincipalIntegrationTest() {
DefaultJedisClientConfig jedisConfig = DefaultJedisClientConfig.builder()
.authXManager(new AuthXManager(tokenAuthConfig)).build();
- try (JedisPooled jedis = new JedisPooled(hnp, jedisConfig)) {
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(hnp)
+ .clientConfig(jedisConfig)
+ .build()) {
String key = UUID.randomUUID().toString();
jedis.set(key, "value");
assertEquals("value", jedis.get(key));
@@ -156,7 +162,10 @@ public void withCertificate_azureServicePrincipalIntegrationTest() {
DefaultJedisClientConfig jedisConfig = DefaultJedisClientConfig.builder()
.authXManager(new AuthXManager(tokenAuthConfig)).build();
- try (JedisPooled jedis = new JedisPooled(hnp, jedisConfig)) {
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(hnp)
+ .clientConfig(jedisConfig)
+ .build()) {
String key = UUID.randomUUID().toString();
jedis.set(key, "value");
assertEquals("value", jedis.get(key));
@@ -198,7 +207,10 @@ public void renewalDuringOperationsTest() throws InterruptedException, Execution
ExecutorService runner = Executors.newSingleThreadExecutor();
runner.submit(() -> {
- try (JedisPooled jedis = new JedisPooled(hnp, jedisClientConfig)) {
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(hnp)
+ .clientConfig(jedisClientConfig)
+ .build()) {
List> futures = new ArrayList<>();
for (int i = 0; i < 5; i++) {
Future> future = jedisExecutors.submit(() -> {
@@ -259,7 +271,10 @@ public void allConnectionsReauthTest() throws InterruptedException, ExecutionExc
List> futures = new ArrayList<>();
ExecutorService executor = Executors.newFixedThreadPool(5);
- try (JedisPooled jedis = new JedisPooled(hnp, jedisClientConfig)) {
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(hnp)
+ .clientConfig(jedisClientConfig)
+ .build()) {
for (int i = 0; i < 5; i++) {
Future> future = executor.submit(() -> {
for (; System.currentTimeMillis() - startTime < 2000;) {
@@ -308,7 +323,10 @@ public void connectionAuthWithExpiredTokenTest() {
DefaultJedisClientConfig jedisClientConfig = DefaultJedisClientConfig.builder()
.authXManager(authXManager).build();
- try (JedisPooled jedis = new JedisPooled(hnp, jedisClientConfig)) {
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(hnp)
+ .clientConfig(jedisClientConfig)
+ .build()) {
for (int i = 0; i < 50; i++) {
String key = UUID.randomUUID().toString();
jedis.set(key, "value");
@@ -346,7 +364,10 @@ public void networkPartitionEvictionTest() {
DefaultJedisClientConfig jedisClientConfig = DefaultJedisClientConfig.builder()
.authXManager(authXManager).build();
- try (JedisPooled jedis = new JedisPooled(hnp, jedisClientConfig)) {
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(hnp)
+ .clientConfig(jedisClientConfig)
+ .build()) {
for (int i = 0; i < 5; i++) {
String key = UUID.randomUUID().toString();
jedis.set(key, "value");
@@ -413,7 +434,10 @@ public void withDefaultCredentials_azureCredentialsIntegrationTest() {
DefaultJedisClientConfig jedisConfig = DefaultJedisClientConfig.builder()
.authXManager(new AuthXManager(tokenAuthConfig)).build();
- try (JedisPooled jedis = new JedisPooled(hnp, jedisConfig)) {
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(hnp)
+ .clientConfig(jedisConfig)
+ .build()) {
String key = UUID.randomUUID().toString();
jedis.set(key, "value");
assertEquals("value", jedis.get(key));
diff --git a/src/test/java/redis/clients/jedis/authentication/RedisEntraIDManagedIdentityIntegrationTests.java b/src/test/java/redis/clients/jedis/authentication/RedisEntraIDManagedIdentityIntegrationTests.java
index 63b6b6cd8e..5ac42a1f82 100644
--- a/src/test/java/redis/clients/jedis/authentication/RedisEntraIDManagedIdentityIntegrationTests.java
+++ b/src/test/java/redis/clients/jedis/authentication/RedisEntraIDManagedIdentityIntegrationTests.java
@@ -17,7 +17,7 @@
import redis.clients.jedis.EndpointConfig;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.HostAndPorts;
-import redis.clients.jedis.JedisPooled;
+import redis.clients.jedis.RedisClient;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
@@ -55,7 +55,10 @@ public void withUserAssignedId_azureManagedIdentityIntegrationTest() {
DefaultJedisClientConfig jedisConfig = DefaultJedisClientConfig.builder()
.authXManager(new AuthXManager(tokenAuthConfig)).build();
- try (JedisPooled jedis = new JedisPooled(hnp, jedisConfig)) {
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(hnp)
+ .clientConfig(jedisConfig)
+ .build()) {
String key = UUID.randomUUID().toString();
jedis.set(key, "value");
assertEquals("value", jedis.get(key));
@@ -73,7 +76,10 @@ public void withSystemAssignedId_azureManagedIdentityIntegrationTest() {
DefaultJedisClientConfig jedisConfig = DefaultJedisClientConfig.builder()
.authXManager(new AuthXManager(tokenAuthConfig)).build();
- try (JedisPooled jedis = new JedisPooled(hnp, jedisConfig)) {
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(hnp)
+ .clientConfig(jedisConfig)
+ .build()) {
String key = UUID.randomUUID().toString();
jedis.set(key, "value");
assertEquals("value", jedis.get(key));
diff --git a/src/test/java/redis/clients/jedis/authentication/TokenBasedAuthenticationIntegrationTests.java b/src/test/java/redis/clients/jedis/authentication/TokenBasedAuthenticationIntegrationTests.java
index 628defda63..06f050d4a0 100644
--- a/src/test/java/redis/clients/jedis/authentication/TokenBasedAuthenticationIntegrationTests.java
+++ b/src/test/java/redis/clients/jedis/authentication/TokenBasedAuthenticationIntegrationTests.java
@@ -39,8 +39,8 @@
import redis.clients.jedis.EndpointConfig;
import redis.clients.jedis.HostAndPorts;
import redis.clients.jedis.JedisClientConfig;
-import redis.clients.jedis.JedisPooled;
import redis.clients.jedis.JedisPubSub;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.RedisProtocol;
import redis.clients.jedis.Protocol.Command;
import redis.clients.jedis.exceptions.JedisException;
@@ -62,7 +62,7 @@ public static void before() {
}
@Test
- public void testJedisPooledForInitialAuth() {
+ public void testClientForInitialAuth() {
String user = "default";
String password = endpointConfig.getPassword();
@@ -80,13 +80,16 @@ public void testJedisPooledForInitialAuth() {
JedisClientConfig clientConfig = DefaultJedisClientConfig.builder()
.authXManager(new AuthXManager(tokenAuthConfig)).build();
- try (JedisPooled jedis = new JedisPooled(endpointConfig.getHostAndPort(), clientConfig)) {
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(endpointConfig.getHostAndPort())
+ .clientConfig(clientConfig)
+ .build()) {
jedis.get("key1");
}
}
@Test
- public void testJedisPooledReauth() {
+ public void testClientReauth() {
String user = "default";
String password = endpointConfig.getPassword();
@@ -115,7 +118,10 @@ public void testJedisPooledReauth() {
JedisClientConfig clientConfig = DefaultJedisClientConfig.builder().authXManager(authXManager)
.build();
- try (JedisPooled jedis = new JedisPooled(endpointConfig.getHostAndPort(), clientConfig)) {
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(endpointConfig.getHostAndPort())
+ .clientConfig(clientConfig)
+ .build()) {
AtomicBoolean stop = new AtomicBoolean(false);
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
@@ -159,7 +165,10 @@ public void onSubscribe(String channel, int subscribedChannels) {
}
};
- try (JedisPooled jedis = new JedisPooled(endpointConfig.getHostAndPort(), clientConfig)) {
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(endpointConfig.getHostAndPort())
+ .clientConfig(clientConfig)
+ .build()) {
jedis.subscribe(pubSub, "channel1");
}
}
@@ -196,7 +205,10 @@ public void testJedisPubSubReauth() {
JedisPubSub pubSub = new JedisPubSub() {
};
- try (JedisPooled jedis = new JedisPooled(endpointConfig.getHostAndPort(), clientConfig)) {
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(endpointConfig.getHostAndPort())
+ .clientConfig(clientConfig)
+ .build()) {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
jedis.subscribe(pubSub, "channel1");
@@ -241,7 +253,10 @@ public void testJedisPubSubWithResp2() {
JedisClientConfig clientConfig = DefaultJedisClientConfig.builder()
.authXManager(new AuthXManager(tokenAuthConfig)).build();
- try (JedisPooled jedis = new JedisPooled(endpointConfig.getHostAndPort(), clientConfig)) {
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(endpointConfig.getHostAndPort())
+ .clientConfig(clientConfig)
+ .build()) {
JedisPubSub pubSub = new JedisPubSub() {};
JedisException e = assertThrows(JedisException.class,
() -> jedis.subscribe(pubSub, "channel1"));
diff --git a/src/test/java/redis/clients/jedis/benchmark/PooledBenchmark.java b/src/test/java/redis/clients/jedis/benchmark/RedisClientBenchmark.java
similarity index 83%
rename from src/test/java/redis/clients/jedis/benchmark/PooledBenchmark.java
rename to src/test/java/redis/clients/jedis/benchmark/RedisClientBenchmark.java
index 9641d10d0c..8e8a81c9af 100644
--- a/src/test/java/redis/clients/jedis/benchmark/PooledBenchmark.java
+++ b/src/test/java/redis/clients/jedis/benchmark/RedisClientBenchmark.java
@@ -6,7 +6,7 @@
import redis.clients.jedis.*;
-public class PooledBenchmark {
+public class RedisClientBenchmark {
private static EndpointConfig endpoint = HostAndPorts.getRedisEndpoint("standalone0");
private static final int TOTAL_OPERATIONS = 100000;
@@ -24,7 +24,12 @@ public static void main(String[] args) throws Exception {
}
private static void withPool() throws Exception {
- final JedisPooled j = new JedisPooled(endpoint.getHost(), endpoint.getPort(), null, endpoint.getPassword());
+ final RedisClient j = RedisClient.builder()
+ .hostAndPort(endpoint.getHost(), endpoint.getPort())
+ .clientConfig(DefaultJedisClientConfig.builder()
+ .password(endpoint.getPassword())
+ .build())
+ .build();
List tds = new ArrayList<>();
final AtomicInteger ind = new AtomicInteger();
diff --git a/src/test/java/redis/clients/jedis/benchmark/CSCPooleadBenchmark.java b/src/test/java/redis/clients/jedis/benchmark/RedisClientCSCBenchmark.java
similarity index 91%
rename from src/test/java/redis/clients/jedis/benchmark/CSCPooleadBenchmark.java
rename to src/test/java/redis/clients/jedis/benchmark/RedisClientCSCBenchmark.java
index 8ee0580011..3f4d34294e 100644
--- a/src/test/java/redis/clients/jedis/benchmark/CSCPooleadBenchmark.java
+++ b/src/test/java/redis/clients/jedis/benchmark/RedisClientCSCBenchmark.java
@@ -8,7 +8,7 @@
import redis.clients.jedis.csc.Cache;
import redis.clients.jedis.csc.TestCache;
-public class CSCPooleadBenchmark {
+public class RedisClientCSCBenchmark {
private static EndpointConfig endpoint = HostAndPorts.getRedisEndpoint("standalone0");
private static final int TOTAL_OPERATIONS = 1000000;
@@ -50,7 +50,11 @@ private static void withPool(Cache cache) throws Exception {
.password(endpoint.getPassword()).build();
List tds = new ArrayList<>();
final AtomicInteger ind = new AtomicInteger();
- try (JedisPooled jedis = new JedisPooled(endpoint.getHostAndPort(), config, cache)) {
+ try (RedisClient jedis = RedisClient.builder()
+ .hostAndPort(endpoint.getHostAndPort())
+ .clientConfig(config)
+ .cache(cache)
+ .build()) {
for (int i = 0; i < NUMBER_OF_THREADS; i++) {
Thread hj = new Thread(new Runnable() {
@Override
@@ -74,6 +78,6 @@ public void run() {
for (Thread t : tds) {
t.join();
}
- }
+ }
}
}
diff --git a/src/test/java/redis/clients/jedis/builders/ClientBuilderTest.java b/src/test/java/redis/clients/jedis/builders/ClientBuilderTest.java
index eda2f223fb..c5ac78a449 100644
--- a/src/test/java/redis/clients/jedis/builders/ClientBuilderTest.java
+++ b/src/test/java/redis/clients/jedis/builders/ClientBuilderTest.java
@@ -18,9 +18,7 @@
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
-import redis.clients.jedis.CommandObject;
-import redis.clients.jedis.JedisPooled;
-import redis.clients.jedis.JedisSentineled;
+import redis.clients.jedis.*;
import redis.clients.jedis.args.Rawable;
import redis.clients.jedis.csc.Cache;
import redis.clients.jedis.executors.CommandExecutor;
@@ -49,7 +47,7 @@ private static List argsToStrings(CommandObject> co) {
@Test
void appliesKeyPreprocessorToCommandObjects() {
- try (JedisPooled client = JedisPooled.builder().commandExecutor(exec)
+ try (RedisClient client = RedisClient.builder().commandExecutor(exec)
.connectionProvider(provider).keyPreProcessor(k -> "prefix:" + k).build()) {
client.set("key", "v");
@@ -63,7 +61,7 @@ void appliesJsonObjectMapper() {
JsonObjectMapper mapper = mock(JsonObjectMapper.class);
when(mapper.toJson(any())).thenReturn("JSON:{a=1}");
- try (JedisPooled client = JedisPooled.builder().commandExecutor(exec)
+ try (RedisClient client = RedisClient.builder().commandExecutor(exec)
.connectionProvider(provider).jsonObjectMapper(mapper).build()) {
client.jsonSetWithEscape("k", Path2.ROOT_PATH, Collections.singletonMap("a", 1));
@@ -74,7 +72,7 @@ void appliesJsonObjectMapper() {
@Test
void appliesSearchDialect() {
- try (JedisPooled client = JedisPooled.builder().commandExecutor(exec)
+ try (RedisClient client = RedisClient.builder().commandExecutor(exec)
.connectionProvider(provider).searchDialect(3).build()) {
client.ftSearch("idx", "q", new FTSearchParams());
@@ -88,7 +86,7 @@ void appliesSearchDialect() {
void cacheRequiresRESP3() {
Cache cache = mock(Cache.class);
- IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> JedisPooled
+ IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> RedisClient
.builder().commandExecutor(exec).connectionProvider(provider).cache(cache).build(),
"Cache requires RESP3");
@@ -99,7 +97,7 @@ void cacheRequiresRESP3() {
@Test
void standaloneValidateHostPortRequired() {
IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
- () -> JedisPooled.builder().hostAndPort(null).build());
+ () -> RedisClient.builder().hostAndPort(null).build());
assertThat(ex.getMessage(), containsString("Either URI or host/port must be specified"));
}
@@ -107,15 +105,15 @@ void standaloneValidateHostPortRequired() {
@Test
void sentinelValidateMasterAndSentinels() {
IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
- () -> JedisSentineled.builder().build());
+ () -> RedisSentinelClient.builder().build());
assertThat(ex.getMessage(), containsString("Master name is required for Sentinel mode"));
ex = assertThrows(IllegalArgumentException.class,
- () -> JedisSentineled.builder().masterName("mymaster").build());
+ () -> RedisSentinelClient.builder().masterName("mymaster").build());
assertThat(ex.getMessage(),
containsString("At least one sentinel must be specified for Sentinel mode"));
- ex = assertThrows(IllegalArgumentException.class, () -> JedisSentineled.builder()
+ ex = assertThrows(IllegalArgumentException.class, () -> RedisSentinelClient.builder()
.masterName("mymaster").sentinels(Collections.emptySet()).build());
assertThat(ex.getMessage(),
containsString("At least one sentinel must be specified for Sentinel mode"));
diff --git a/src/test/java/redis/clients/jedis/commands/unified/pipeline/BinaryStreamsPipelineCommandsTest.java b/src/test/java/redis/clients/jedis/commands/unified/pipeline/BinaryStreamsPipelineCommandsTest.java
index c22559e7a2..ce456e01fe 100644
--- a/src/test/java/redis/clients/jedis/commands/unified/pipeline/BinaryStreamsPipelineCommandsTest.java
+++ b/src/test/java/redis/clients/jedis/commands/unified/pipeline/BinaryStreamsPipelineCommandsTest.java
@@ -87,10 +87,10 @@ public static Map offsets(Object... streamOffsets) {
@BeforeEach
public void setUpTestStream() {
- jedis.del(STREAM_KEY_1);
- jedis.del(STREAM_KEY_2);
+ client.del(STREAM_KEY_1);
+ client.del(STREAM_KEY_2);
try {
- jedis.xgroupCreate(STREAM_KEY_1, GROUP_NAME,
+ client.xgroupCreate(STREAM_KEY_1, GROUP_NAME,
StreamEntryID.XGROUP_LAST_ENTRY.toString().getBytes(), true);
} catch (JedisDataException e) {
if (!e.getMessage().contains("BUSYGROUP")) {
@@ -98,7 +98,7 @@ public void setUpTestStream() {
}
}
try {
- jedis.xgroupCreate(STREAM_KEY_2, GROUP_NAME,
+ client.xgroupCreate(STREAM_KEY_2, GROUP_NAME,
StreamEntryID.XGROUP_LAST_ENTRY.toString().getBytes(), true);
} catch (JedisDataException e) {
if (!e.getMessage().contains("BUSYGROUP")) {
@@ -111,7 +111,7 @@ public void setUpTestStream() {
public void xreadBinary() {
stream1Entries.forEach(
- entry -> jedis.xadd(STREAM_KEY_1, new XAddParams().id(entry.getID()), entry.getFields()));
+ entry -> client.xadd(STREAM_KEY_1, new XAddParams().id(entry.getID()), entry.getFields()));
Response>>> response = pipe.xreadBinary(
XReadParams.xReadParams(), offsets(STREAM_KEY_1, "0-0"));
@@ -128,7 +128,7 @@ public void xreadBinary() {
public void xreadBinaryAsMap() {
stream1Entries.forEach(
- entry -> jedis.xadd(STREAM_KEY_1, new XAddParams().id(entry.getID()), entry.getFields()));
+ entry -> client.xadd(STREAM_KEY_1, new XAddParams().id(entry.getID()), entry.getFields()));
Response
*/
+ // @formatter:on
public class RedisSentinelClient extends UnifiedJedis {
private RedisSentinelClient(CommandExecutor commandExecutor,
ConnectionProvider connectionProvider, CommandObjects commandObjects,
From e50deefd80b3239f8fe31cb511b9d7111549f685 Mon Sep 17 00:00:00 2001
From: Igor Malinovskiy
Date: Thu, 20 Nov 2025 10:32:24 +0100
Subject: [PATCH 13/16] Fix modifiers order
---
src/main/java/redis/clients/jedis/RedisClusterClient.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/redis/clients/jedis/RedisClusterClient.java b/src/main/java/redis/clients/jedis/RedisClusterClient.java
index 6b1e4b21cb..af01abdca0 100644
--- a/src/main/java/redis/clients/jedis/RedisClusterClient.java
+++ b/src/main/java/redis/clients/jedis/RedisClusterClient.java
@@ -105,7 +105,7 @@ private RedisClusterClient(CommandExecutor commandExecutor, ConnectionProvider c
* Obtain an instance via {@link #builder()}.
*
*/
- static public class Builder extends ClusterClientBuilder {
+ public static class Builder extends ClusterClientBuilder {
@Override
protected RedisClusterClient createClient() {
From 0ab4ba3d9cf519fe74ef9df7571371ef2a541c96 Mon Sep 17 00:00:00 2001
From: Igor Malinovskiy
Date: Thu, 20 Nov 2025 10:57:18 +0100
Subject: [PATCH 14/16] Fix cluster tests
---
...ClusterClientMigrationIntegrationTest.java | 50 +++++--------------
1 file changed, 12 insertions(+), 38 deletions(-)
diff --git a/src/test/java/redis/clients/jedis/builders/RedisClusterClientMigrationIntegrationTest.java b/src/test/java/redis/clients/jedis/builders/RedisClusterClientMigrationIntegrationTest.java
index 676566040a..a0f59888bf 100644
--- a/src/test/java/redis/clients/jedis/builders/RedisClusterClientMigrationIntegrationTest.java
+++ b/src/test/java/redis/clients/jedis/builders/RedisClusterClientMigrationIntegrationTest.java
@@ -157,13 +157,12 @@ public void testConstructorWithNodesAndPoolConfig() {
GenericObjectPoolConfig poolConfig = new ConnectionPoolConfig();
poolConfig.setMaxTotal(8);
poolConfig.setMaxIdle(8);
+ JedisClientConfig clientConfig = DefaultJedisClientConfig.builder().password(PASSWORD).build();
// Legacy constructor
- legacyCluster = new JedisCluster(CLUSTER_NODES, poolConfig);
+ legacyCluster = new JedisCluster(CLUSTER_NODES, clientConfig, poolConfig);
// New Builder pattern - need to add password via clientConfig
- JedisClientConfig clientConfig = DefaultJedisClientConfig.builder().password(PASSWORD).build();
-
newCluster = RedisClusterClient.builder().nodes(CLUSTER_NODES).clientConfig(clientConfig)
.poolConfig(poolConfig).build();
@@ -197,33 +196,6 @@ public void testConstructorWithTimeoutsPasswordAndPoolConfig() {
verifyBothClients(legacyCluster, newCluster);
}
- /**
- * Test migration from constructor with connection timeout, socket timeout, maxAttempts, and
- * poolConfig (no password). Tests constructor: JedisCluster(Set<HostAndPort>, int, int,
- * int, GenericObjectPoolConfig<Connection>)
- */
- @Test
- public void testConstructorWithTimeoutsAndPoolConfigNoPassword() {
- int connectionTimeout = 2000;
- int socketTimeout = 2000;
-
- GenericObjectPoolConfig poolConfig = new ConnectionPoolConfig();
-
- // Legacy constructor without password
- legacyCluster = new JedisCluster(CLUSTER_NODES, connectionTimeout, socketTimeout, MAX_ATTEMPTS,
- poolConfig);
-
- // New Builder pattern - need to add password for our test cluster
- JedisClientConfig clientConfig = DefaultJedisClientConfig.builder()
- .connectionTimeoutMillis(connectionTimeout).socketTimeoutMillis(socketTimeout)
- .password(PASSWORD).build();
-
- newCluster = RedisClusterClient.builder().nodes(CLUSTER_NODES).clientConfig(clientConfig)
- .maxAttempts(MAX_ATTEMPTS).poolConfig(poolConfig).build();
-
- verifyBothClients(legacyCluster, newCluster);
- }
-
/**
* Test migration from constructor with timeout, maxAttempts, and poolConfig. Tests constructor:
* JedisCluster(Set<HostAndPort>, int, int, GenericObjectPoolConfig<Connection>)
@@ -233,14 +205,14 @@ public void testConstructorWithTimeoutMaxAttemptsAndPoolConfig() {
int timeout = 2000;
GenericObjectPoolConfig poolConfig = new ConnectionPoolConfig();
+ JedisClientConfig clientConfig = DefaultJedisClientConfig.builder().timeoutMillis(timeout)
+ .password(PASSWORD).build();
// Legacy constructor - uses same timeout for connection and socket
- legacyCluster = new JedisCluster(CLUSTER_NODES, timeout, MAX_ATTEMPTS, poolConfig);
+ legacyCluster = new JedisCluster(CLUSTER_NODES, timeout, timeout, MAX_ATTEMPTS, PASSWORD,
+ poolConfig);
// New Builder pattern
- JedisClientConfig clientConfig = DefaultJedisClientConfig.builder().timeoutMillis(timeout)
- .password(PASSWORD).build();
-
newCluster = RedisClusterClient.builder().nodes(CLUSTER_NODES).clientConfig(clientConfig)
.maxAttempts(MAX_ATTEMPTS).poolConfig(poolConfig).build();
@@ -253,15 +225,16 @@ public void testConstructorWithTimeoutMaxAttemptsAndPoolConfig() {
*/
@Test
public void testConstructorWithSingleNodeAndPoolConfig() {
+ int timeout = 2000;
HostAndPort singleNode = HostAndPorts.getStableClusterServers().get(0);
GenericObjectPoolConfig poolConfig = new ConnectionPoolConfig();
+ JedisClientConfig clientConfig = DefaultJedisClientConfig.builder().password(PASSWORD).build();
// Legacy constructor with single node
- legacyCluster = new JedisCluster(singleNode, poolConfig);
+ legacyCluster = new JedisCluster(singleNode, timeout, timeout, MAX_ATTEMPTS, PASSWORD,
+ poolConfig);
// New Builder pattern - need to add password and wrap single node in a Set
- JedisClientConfig clientConfig = DefaultJedisClientConfig.builder().password(PASSWORD).build();
-
Set singleNodeSet = new HashSet<>();
singleNodeSet.add(singleNode);
@@ -292,7 +265,8 @@ protected void verifyBothClients(JedisCluster legacyCluster, RedisClusterClient
assertEquals("1", legacyCluster.get(key2));
// Clean up
- newCluster.del(key1, key2);
+ newCluster.del(key1);
+ newCluster.del(key2);
}
/**
From a10544e630190ad4e4fb5acf4bf87b6932dde0b3 Mon Sep 17 00:00:00 2001
From: Igor Malinovskiy
Date: Thu, 20 Nov 2025 11:17:23 +0100
Subject: [PATCH 15/16] Update docs
---
README.md | 10 +++++-----
docs/advanced-usage.md | 18 ++++++++++++------
docs/redisearch.md | 8 ++++----
docs/redisjson.md | 8 ++++----
4 files changed, 25 insertions(+), 19 deletions(-)
diff --git a/README.md b/README.md
index e5e0280650..9c912a8b02 100644
--- a/README.md
+++ b/README.md
@@ -66,10 +66,10 @@ Next, you'll need to connect to Redis. Consider installing a redis server with d
docker run -p 6379:6379 -it redis:latest
```
-For many applications, it's best to use a connection pool. You can instantiate a JedisPooled like so:
+You can instantiate a RedisClient like so:
```java
-JedisPooled jedis = new JedisPooled("localhost", 6379);
+RedisClient jedis = RedisClient.builder().hostAndPort("localhost", 6379).build();
```
Now you can send commands:
@@ -81,16 +81,16 @@ jedis.sadd("planets", "Venus");
## Connecting to a Redis cluster
Jedis lets you connect to Redis Clusters, supporting the [Redis Cluster Specification](https://redis.io/topics/cluster-spec).
-To do this, you'll need to connect using `JedisCluster`. See the example below:
+To do this, you'll need to connect using `RedisClusterClient`. See the example below:
```java
Set jedisClusterNodes = new HashSet();
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7379));
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7380));
-JedisCluster jedis = new JedisCluster(jedisClusterNodes);
+RedisClusterClient jedis = RedisClusterClient.builder().nodes(jedisClusterNodes).build();
```
-Now you can use the `JedisCluster` instance and send commands like you would with a standard pooled connection:
+Now you can use the `RedisClusterClient` instance and send commands like you would with a standard pooled connection:
```java
jedis.sadd("planets", "Mars");
diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md
index 0f7c2bbbe1..cceb373784 100644
--- a/docs/advanced-usage.md
+++ b/docs/advanced-usage.md
@@ -255,16 +255,16 @@ public class DockerNATMapper implements HostAndPortMapper {
}
```
-Then, instantiate this class and pass it to the JedisCluster constructor:
+Then, instantiate this class and pass it to the RedisClusterClient builder:
```java
Map nodeMapping = new HashMap<>();
-nodeMapping.put(new HostAndPort("172.18.0.2", 6379), new HostAndPort("my-redis.example.com", 7001));
+nodeMapping.put(new HostAndPort("172.18.0.2", 6379), new HostAndPort("my-redis.example.com", 7001));
nodeMapping.put(new HostAndPort("172.18.0.3", 6379), new HostAndPort("my-redis.example.com", 7002));
nodeMapping.put(new HostAndPort("172.18.0.4", 6379), new HostAndPort("my-redis.example.com", 7002));
Set initialNodes = new HashSet<>();
-// seed node
+// seed node
initialNodes.add(new HostAndPort("my-redis.example.com", 7001));
HostAndPortMapper mapper = new DockerNATMapper(nodeMapping);
@@ -275,10 +275,13 @@ JedisClientConfig jedisClientConfig = DefaultJedisClientConfig.builder()
.hostAndPortMapper(mapper)
.build();
-JedisCluster jedisCluster = new JedisCluster(initialNodes, jedisClientConfig);
+RedisClusterClient jedisCluster = RedisClusterClient.builder()
+ .nodes(initialNodes)
+ .clientConfig(jedisClientConfig)
+ .build();
```
-Now, when JedisCluster discovers a node at "172.18.0.2:6379", the mapper will translate it to "localhost:7001" before attempting to connect.
+Now, when RedisClusterClient discovers a node at "172.18.0.2:6379", the mapper will translate it to "localhost:7001" before attempting to connect.
### Implementing with a Lambda Expression
Since HostAndPortMapper is a functional interface (it has only one abstract method), you can also provide the implementation more concisely using a lambda expression. This is often preferred for simpler, inline mapping logic.
@@ -300,7 +303,10 @@ JedisClientConfig jedisClientConfig = DefaultJedisClientConfig.builder()
.hostAndPortMapper(mapper)
.build();
-JedisCluster jedisCluster = new JedisCluster(initialNodes, jedisClientConfig);
+RedisClusterClient jedisCluster = RedisClusterClient.builder()
+ .nodes(initialNodes)
+ .clientConfig(jedisClientConfig)
+ .build();
```
## Miscellaneous
diff --git a/docs/redisearch.md b/docs/redisearch.md
index c446de0b41..428ad310bd 100644
--- a/docs/redisearch.md
+++ b/docs/redisearch.md
@@ -4,20 +4,20 @@ To use RediSearch features with Jedis, you'll need to use an implementation of R
## Creating the RediSearch client
-Initializing the client with JedisPooled:
+Initializing the client with RedisClient:
```java
-JedisPooled client = new JedisPooled("localhost", 6379);
+RedisClient client = RedisClient.builder().hostAndPort("localhost", 6379).build();
```
-Initializing the client with JedisCluster:
+Initializing the client with RedisClusterClient:
```java
Set nodes = new HashSet<>();
nodes.add(new HostAndPort("127.0.0.1", 7379));
nodes.add(new HostAndPort("127.0.0.1", 7380));
-JedisCluster client = new JedisCluster(nodes);
+RedisClusterClient client = RedisClusterClient.builder().nodes(nodes).build();
```
## Indexing and querying
diff --git a/docs/redisjson.md b/docs/redisjson.md
index de9d01c415..751c435d83 100644
--- a/docs/redisjson.md
+++ b/docs/redisjson.md
@@ -9,20 +9,20 @@ Let's see how this works.
## Creating with RedisJSON client
-First, let's create a `JedisPooled` client instance:
+First, let's create a `RedisClient` client instance:
```java
-JedisPooled client = new JedisPooled("localhost", 6479);
+RedisClient client = RedisClient.builder().hostAndPort("localhost", 6479).build();
```
-Or, a `JedisCluster` client instance:
+Or, a `RedisClusterClient` client instance:
```java
Set nodes = new HashSet<>();
nodes.add(new HostAndPort("127.0.0.1", 7379));
nodes.add(new HostAndPort("127.0.0.1", 7380));
-JedisCluster client = new JedisCluster(nodes);
+RedisClusterClient client = RedisClusterClient.builder().nodes(nodes).build();
```
Now we can start working with JSON. For these examples, we'll be using [GSON](https://github.com/google/gson)
From 066e34c12b31c68248e7d304fc5653f144187dab Mon Sep 17 00:00:00 2001
From: Igor Malinovskiy
Date: Thu, 20 Nov 2025 11:29:49 +0100
Subject: [PATCH 16/16] Use RedisClient in doctests
---
src/test/java/io/redis/examples/BitMapsExample.java | 4 ++--
src/test/java/io/redis/examples/BitfieldExample.java | 4 ++--
src/test/java/io/redis/examples/BloomFilterExample.java | 4 ++--
src/test/java/io/redis/examples/CMSExample.java | 4 ++--
src/test/java/io/redis/examples/CmdsCnxmgmtExample.java | 4 ++--
src/test/java/io/redis/examples/CmdsGenericExample.java | 4 ++--
src/test/java/io/redis/examples/CmdsHashExample.java | 4 ++--
src/test/java/io/redis/examples/CmdsListExample.java | 4 ++--
src/test/java/io/redis/examples/CmdsServerMgmtExample.java | 6 +++---
src/test/java/io/redis/examples/CmdsSetExample.java | 4 ++--
src/test/java/io/redis/examples/CmdsSortedSetExample.java | 4 ++--
src/test/java/io/redis/examples/CmdsStringExample.java | 4 ++--
src/test/java/io/redis/examples/CuckooFilterExample.java | 4 ++--
src/test/java/io/redis/examples/GeoExample.java | 4 ++--
src/test/java/io/redis/examples/GeoIndexExample.java | 4 ++--
src/test/java/io/redis/examples/HashExample.java | 4 ++--
src/test/java/io/redis/examples/HomeJsonExample.java | 4 ++--
src/test/java/io/redis/examples/HomeProbDtsExample.java | 4 ++--
src/test/java/io/redis/examples/HyperLogLogExample.java | 4 ++--
src/test/java/io/redis/examples/JsonExample.java | 4 ++--
src/test/java/io/redis/examples/ListExample.java | 4 ++--
src/test/java/io/redis/examples/PipeTransExample.java | 4 ++--
src/test/java/io/redis/examples/QueryAggExample.java | 4 ++--
src/test/java/io/redis/examples/QueryEmExample.java | 4 ++--
src/test/java/io/redis/examples/QueryFtExample.java | 4 ++--
src/test/java/io/redis/examples/QueryGeoExample.java | 4 ++--
src/test/java/io/redis/examples/QueryRangeExample.java | 4 ++--
.../java/io/redis/examples/SearchQuickstartExample.java | 1 -
src/test/java/io/redis/examples/SetGetExample.java | 4 ++--
src/test/java/io/redis/examples/SetsExample.java | 4 ++--
src/test/java/io/redis/examples/SortedSetsExample.java | 4 ++--
src/test/java/io/redis/examples/StreamsExample.java | 4 ++--
src/test/java/io/redis/examples/StringExample.java | 4 ++--
src/test/java/io/redis/examples/TDigestExample.java | 4 ++--
.../java/io/redis/examples/TimeSeriesTutorialExample.java | 4 ++--
src/test/java/io/redis/examples/TopKExample.java | 4 ++--
src/test/java/io/redis/examples/VectorSetExample.java | 4 ++--
37 files changed, 73 insertions(+), 74 deletions(-)
diff --git a/src/test/java/io/redis/examples/BitMapsExample.java b/src/test/java/io/redis/examples/BitMapsExample.java
index c356d0de72..6124896a8f 100644
--- a/src/test/java/io/redis/examples/BitMapsExample.java
+++ b/src/test/java/io/redis/examples/BitMapsExample.java
@@ -3,7 +3,7 @@
package io.redis.examples;
import org.junit.jupiter.api.Test;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -13,7 +13,7 @@ public class BitMapsExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
// HIDE_END
// REMOVE_START
diff --git a/src/test/java/io/redis/examples/BitfieldExample.java b/src/test/java/io/redis/examples/BitfieldExample.java
index 9b3f3b2370..b729f13ffe 100644
--- a/src/test/java/io/redis/examples/BitfieldExample.java
+++ b/src/test/java/io/redis/examples/BitfieldExample.java
@@ -7,7 +7,7 @@
// REMOVE_END
// HIDE_START
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import static org.junit.jupiter.api.Assertions.assertEquals;
// HIDE_END
@@ -17,7 +17,7 @@ public class BitfieldExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
// HIDE_END
//REMOVE_START
diff --git a/src/test/java/io/redis/examples/BloomFilterExample.java b/src/test/java/io/redis/examples/BloomFilterExample.java
index 77757fa3bc..5012421a63 100644
--- a/src/test/java/io/redis/examples/BloomFilterExample.java
+++ b/src/test/java/io/redis/examples/BloomFilterExample.java
@@ -3,7 +3,7 @@
// HIDE_START
package io.redis.examples;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import org.junit.jupiter.api.Test;
import java.util.List;
@@ -13,7 +13,7 @@ public class BloomFilterExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
// HIDE_END
// REMOVE_START
diff --git a/src/test/java/io/redis/examples/CMSExample.java b/src/test/java/io/redis/examples/CMSExample.java
index ee66412c04..237ec7dd95 100644
--- a/src/test/java/io/redis/examples/CMSExample.java
+++ b/src/test/java/io/redis/examples/CMSExample.java
@@ -4,7 +4,7 @@
//HIDE_END
//REMOVE_START
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
@@ -17,7 +17,7 @@ public class CMSExample {
@Test
public void run() {
//HIDE_START
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
//HIDE_END
//REMOVE_START
diff --git a/src/test/java/io/redis/examples/CmdsCnxmgmtExample.java b/src/test/java/io/redis/examples/CmdsCnxmgmtExample.java
index 17d6876777..07cb379e67 100644
--- a/src/test/java/io/redis/examples/CmdsCnxmgmtExample.java
+++ b/src/test/java/io/redis/examples/CmdsCnxmgmtExample.java
@@ -20,7 +20,7 @@ public void run() {
// REMOVE_START
jedis.configSet("requirepass", "temp_pass");
// REMOVE_END
- // Note: you must use the `Jedis` class rather than `UnifiedJedis`
+ // Note: you must use the `Jedis` class rather than `RedisClient`
// to access the `auth` commands.
String authResult1 = jedis.auth("default", "temp_pass");
System.out.println(authResult1); // >>> OK
@@ -34,7 +34,7 @@ public void run() {
// REMOVE_START
jedis.aclSetUser("test-user", "on", ">strong_password", "+acl");
// REMOVE_END
- // Note: you must use the `Jedis` class rather than `UnifiedJedis`
+ // Note: you must use the `Jedis` class rather than `RedisClient`
// to access the `auth` commands.
String authResult2 = jedis.auth("test-user", "strong_password");
System.out.println(authResult2); // >>> OK
diff --git a/src/test/java/io/redis/examples/CmdsGenericExample.java b/src/test/java/io/redis/examples/CmdsGenericExample.java
index f12d5be5e8..9ccad136aa 100644
--- a/src/test/java/io/redis/examples/CmdsGenericExample.java
+++ b/src/test/java/io/redis/examples/CmdsGenericExample.java
@@ -6,7 +6,7 @@
// REMOVE_END
// HIDE_START
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.args.ExpiryOption;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -17,7 +17,7 @@ public class CmdsGenericExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
//REMOVE_START
// Clear any keys here before using them in tests.
diff --git a/src/test/java/io/redis/examples/CmdsHashExample.java b/src/test/java/io/redis/examples/CmdsHashExample.java
index 064fdf099e..387dbe12c8 100644
--- a/src/test/java/io/redis/examples/CmdsHashExample.java
+++ b/src/test/java/io/redis/examples/CmdsHashExample.java
@@ -11,7 +11,7 @@
import java.util.Collections;
// HIDE_START
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
// HIDE_END
import static java.util.stream.Collectors.toList;
@@ -23,7 +23,7 @@ public class CmdsHashExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
//REMOVE_START
// Clear any keys here before using them in tests.
diff --git a/src/test/java/io/redis/examples/CmdsListExample.java b/src/test/java/io/redis/examples/CmdsListExample.java
index a3628196d5..8fe244f3f6 100644
--- a/src/test/java/io/redis/examples/CmdsListExample.java
+++ b/src/test/java/io/redis/examples/CmdsListExample.java
@@ -7,7 +7,7 @@
import java.util.List;
// HIDE_START
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -15,7 +15,7 @@ public class CmdsListExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
//REMOVE_START
jedis.del("mylist");
//REMOVE_END
diff --git a/src/test/java/io/redis/examples/CmdsServerMgmtExample.java b/src/test/java/io/redis/examples/CmdsServerMgmtExample.java
index 2da0e3756a..07c1782325 100644
--- a/src/test/java/io/redis/examples/CmdsServerMgmtExample.java
+++ b/src/test/java/io/redis/examples/CmdsServerMgmtExample.java
@@ -8,14 +8,14 @@
import redis.clients.jedis.Jedis;
// HIDE_START
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class CmdsServerMgmtExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
// HIDE_END
// STEP_START flushall
@@ -37,7 +37,7 @@ public void run() {
// STEP_START info
// Note: you must use the `Jedis` class to access the `info`
- // command rather than `UnifiedJedis`.
+ // command rather than `RedisClient`.
Jedis jedis2 = new Jedis("redis://localhost:6379");
String infoResult = jedis2.info();
diff --git a/src/test/java/io/redis/examples/CmdsSetExample.java b/src/test/java/io/redis/examples/CmdsSetExample.java
index 7e47ccfa76..7c60bfd897 100644
--- a/src/test/java/io/redis/examples/CmdsSetExample.java
+++ b/src/test/java/io/redis/examples/CmdsSetExample.java
@@ -11,13 +11,13 @@
import java.util.Set;
// HIDE_START
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
public class CmdsSetExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
//REMOVE_START
jedis.del("myset");
//REMOVE_END
diff --git a/src/test/java/io/redis/examples/CmdsSortedSetExample.java b/src/test/java/io/redis/examples/CmdsSortedSetExample.java
index 8412803226..71d636dec5 100644
--- a/src/test/java/io/redis/examples/CmdsSortedSetExample.java
+++ b/src/test/java/io/redis/examples/CmdsSortedSetExample.java
@@ -8,7 +8,7 @@
import java.util.HashMap;
import java.util.Map;
import java.util.List;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.params.ZRangeParams;
import redis.clients.jedis.resps.Tuple;
@@ -19,7 +19,7 @@ public class CmdsSortedSetExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
//REMOVE_START
// Clear any keys here before using them in tests.
diff --git a/src/test/java/io/redis/examples/CmdsStringExample.java b/src/test/java/io/redis/examples/CmdsStringExample.java
index 4b252f0778..e38dc88d99 100644
--- a/src/test/java/io/redis/examples/CmdsStringExample.java
+++ b/src/test/java/io/redis/examples/CmdsStringExample.java
@@ -6,7 +6,7 @@
// REMOVE_END
// HIDE_START
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import static org.junit.jupiter.api.Assertions.assertEquals;
// HIDE_END
@@ -16,7 +16,7 @@ public class CmdsStringExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
//REMOVE_START
// Clear any keys here before using them in tests.
diff --git a/src/test/java/io/redis/examples/CuckooFilterExample.java b/src/test/java/io/redis/examples/CuckooFilterExample.java
index 26b1be6b7a..0de9b36493 100644
--- a/src/test/java/io/redis/examples/CuckooFilterExample.java
+++ b/src/test/java/io/redis/examples/CuckooFilterExample.java
@@ -4,7 +4,7 @@
package io.redis.examples;
import org.junit.jupiter.api.Test;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -13,7 +13,7 @@ public class CuckooFilterExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
// HIDE_END
// REMOVE_START
diff --git a/src/test/java/io/redis/examples/GeoExample.java b/src/test/java/io/redis/examples/GeoExample.java
index d171b92b95..72c0e0f749 100644
--- a/src/test/java/io/redis/examples/GeoExample.java
+++ b/src/test/java/io/redis/examples/GeoExample.java
@@ -5,7 +5,7 @@
import org.junit.jupiter.api.Test;
// REMOVE_END
import redis.clients.jedis.GeoCoordinate;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.args.GeoUnit;
import redis.clients.jedis.resps.GeoRadiusResponse;
@@ -18,7 +18,7 @@ public class GeoExample {
@Test
public void run() {
- try (UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379")) {
+ try (RedisClient jedis = new RedisClient("redis://localhost:6379")) {
// REMOVE_START
jedis.del("bikes:rentable");
// REMOVE_END
diff --git a/src/test/java/io/redis/examples/GeoIndexExample.java b/src/test/java/io/redis/examples/GeoIndexExample.java
index 6254eaab7b..8dafe921af 100644
--- a/src/test/java/io/redis/examples/GeoIndexExample.java
+++ b/src/test/java/io/redis/examples/GeoIndexExample.java
@@ -8,7 +8,7 @@
// HIDE_START
import org.json.JSONObject;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.json.Path2;
import redis.clients.jedis.search.Document;
import redis.clients.jedis.search.FTCreateParams;
@@ -27,7 +27,7 @@ public class GeoIndexExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
//REMOVE_START
// Clear any keys here before using them in tests.
try {
diff --git a/src/test/java/io/redis/examples/HashExample.java b/src/test/java/io/redis/examples/HashExample.java
index 7ba473ef97..b53c468111 100644
--- a/src/test/java/io/redis/examples/HashExample.java
+++ b/src/test/java/io/redis/examples/HashExample.java
@@ -1,7 +1,7 @@
//EXAMPLE: hash_tutorial
package io.redis.examples;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import java.util.HashMap;
import java.util.List;
@@ -16,7 +16,7 @@ public class HashExample {
@Test
public void run() {
- try (UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379")) {
+ try (RedisClient jedis = new RedisClient("redis://localhost:6379")) {
// REMOVE_START
jedis.del("bike:1", "bike:1:stats");
// REMOVE_END
diff --git a/src/test/java/io/redis/examples/HomeJsonExample.java b/src/test/java/io/redis/examples/HomeJsonExample.java
index c9124b2fc2..3d25a1c9fb 100644
--- a/src/test/java/io/redis/examples/HomeJsonExample.java
+++ b/src/test/java/io/redis/examples/HomeJsonExample.java
@@ -7,7 +7,7 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
// REMOVE_END
// STEP_START import
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.jedis.json.Path2;
import redis.clients.jedis.search.*;
@@ -27,7 +27,7 @@ public class HomeJsonExample {
public void run() {
// HIDE_END
// STEP_START connect
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
// STEP_END
//REMOVE_START
diff --git a/src/test/java/io/redis/examples/HomeProbDtsExample.java b/src/test/java/io/redis/examples/HomeProbDtsExample.java
index 4bafa7d561..7b45ca32e0 100644
--- a/src/test/java/io/redis/examples/HomeProbDtsExample.java
+++ b/src/test/java/io/redis/examples/HomeProbDtsExample.java
@@ -2,7 +2,7 @@
package io.redis.examples;
// REMOVE_START
import org.junit.jupiter.api.Test;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -15,7 +15,7 @@ public class HomeProbDtsExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
// REMOVE_START
jedis.del(
diff --git a/src/test/java/io/redis/examples/HyperLogLogExample.java b/src/test/java/io/redis/examples/HyperLogLogExample.java
index bc3232f6f8..54b907d696 100644
--- a/src/test/java/io/redis/examples/HyperLogLogExample.java
+++ b/src/test/java/io/redis/examples/HyperLogLogExample.java
@@ -2,7 +2,7 @@
package io.redis.examples;
import org.junit.jupiter.api.Test;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -11,7 +11,7 @@ public class HyperLogLogExample {
@Test
public void run() {
// HIDE_START
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
// HIDE_END
// REMOVE_START
diff --git a/src/test/java/io/redis/examples/JsonExample.java b/src/test/java/io/redis/examples/JsonExample.java
index 2e4a8c5bdf..ed7ba71037 100644
--- a/src/test/java/io/redis/examples/JsonExample.java
+++ b/src/test/java/io/redis/examples/JsonExample.java
@@ -8,7 +8,7 @@
// REMOVE_END
// HIDE_START
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.json.Path2;
import org.json.JSONArray;
@@ -21,7 +21,7 @@
public class JsonExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
// HIDE_END
//REMOVE_START
diff --git a/src/test/java/io/redis/examples/ListExample.java b/src/test/java/io/redis/examples/ListExample.java
index ac82e6d611..d9be4880e6 100644
--- a/src/test/java/io/redis/examples/ListExample.java
+++ b/src/test/java/io/redis/examples/ListExample.java
@@ -3,7 +3,7 @@
package io.redis.examples;
import org.junit.jupiter.api.Test;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.args.ListDirection;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@@ -12,7 +12,7 @@ public class ListExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
// HIDE_END
// REMOVE_START
diff --git a/src/test/java/io/redis/examples/PipeTransExample.java b/src/test/java/io/redis/examples/PipeTransExample.java
index 71c2d83842..882483595b 100644
--- a/src/test/java/io/redis/examples/PipeTransExample.java
+++ b/src/test/java/io/redis/examples/PipeTransExample.java
@@ -6,7 +6,7 @@
// REMOVE_END
import java.util.List;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.AbstractPipeline;
import redis.clients.jedis.AbstractTransaction;
import redis.clients.jedis.Response;
@@ -17,7 +17,7 @@ public class PipeTransExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
// REMOVE_START
for (int i = 0; i < 5; i++) {
diff --git a/src/test/java/io/redis/examples/QueryAggExample.java b/src/test/java/io/redis/examples/QueryAggExample.java
index d6073699a9..90c66a1bd3 100644
--- a/src/test/java/io/redis/examples/QueryAggExample.java
+++ b/src/test/java/io/redis/examples/QueryAggExample.java
@@ -9,7 +9,7 @@
import java.util.List;
import java.util.ArrayList;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.json.Path2;
import redis.clients.jedis.search.FTCreateParams;
import redis.clients.jedis.search.IndexDataType;
@@ -27,7 +27,7 @@ public class QueryAggExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
//REMOVE_START
// Clear any keys here before using them in tests.
diff --git a/src/test/java/io/redis/examples/QueryEmExample.java b/src/test/java/io/redis/examples/QueryEmExample.java
index 5c866439c6..58b42bf998 100644
--- a/src/test/java/io/redis/examples/QueryEmExample.java
+++ b/src/test/java/io/redis/examples/QueryEmExample.java
@@ -8,7 +8,7 @@
// HIDE_START
import java.util.List;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.json.Path2;
import redis.clients.jedis.search.*;
import redis.clients.jedis.search.schemafields.*;
@@ -21,7 +21,7 @@ public class QueryEmExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
//REMOVE_START
// Clear any keys here before using them in tests.
diff --git a/src/test/java/io/redis/examples/QueryFtExample.java b/src/test/java/io/redis/examples/QueryFtExample.java
index e15c2a4b0b..3bb1755391 100644
--- a/src/test/java/io/redis/examples/QueryFtExample.java
+++ b/src/test/java/io/redis/examples/QueryFtExample.java
@@ -6,7 +6,7 @@
// REMOVE_END
// HIDE_START
import java.util.List;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.search.*;
import redis.clients.jedis.search.schemafields.*;
import redis.clients.jedis.exceptions.JedisDataException;
@@ -20,7 +20,7 @@
public class QueryFtExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
//REMOVE_START
// Clear any keys here before using them in tests.
diff --git a/src/test/java/io/redis/examples/QueryGeoExample.java b/src/test/java/io/redis/examples/QueryGeoExample.java
index 2fd6334224..4cde2805b0 100644
--- a/src/test/java/io/redis/examples/QueryGeoExample.java
+++ b/src/test/java/io/redis/examples/QueryGeoExample.java
@@ -9,7 +9,7 @@
import java.util.List;
import java.util.stream.Stream;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.search.*;
import redis.clients.jedis.search.schemafields.*;
import redis.clients.jedis.search.schemafields.GeoShapeField.CoordinateSystem;
@@ -25,7 +25,7 @@ public class QueryGeoExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
//REMOVE_START
// Clear any keys here before using them in tests.
diff --git a/src/test/java/io/redis/examples/QueryRangeExample.java b/src/test/java/io/redis/examples/QueryRangeExample.java
index 4ff9f960bb..849550c017 100644
--- a/src/test/java/io/redis/examples/QueryRangeExample.java
+++ b/src/test/java/io/redis/examples/QueryRangeExample.java
@@ -11,7 +11,7 @@
import java.util.stream.Stream;
// REMOVE_END
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.search.*;
import redis.clients.jedis.search.schemafields.*;
import redis.clients.jedis.exceptions.JedisDataException;
@@ -27,7 +27,7 @@ public class QueryRangeExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
//REMOVE_START
// Clear any keys here before using them in tests.
diff --git a/src/test/java/io/redis/examples/SearchQuickstartExample.java b/src/test/java/io/redis/examples/SearchQuickstartExample.java
index 006799a833..5171cdecc3 100644
--- a/src/test/java/io/redis/examples/SearchQuickstartExample.java
+++ b/src/test/java/io/redis/examples/SearchQuickstartExample.java
@@ -36,7 +36,6 @@ public class SearchQuickstartExample {
@Test
public void run() {
// STEP_START connect
- // UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
RedisClient jedis = new RedisClient("localhost", 6379);
// STEP_END
// REMOVE_START
diff --git a/src/test/java/io/redis/examples/SetGetExample.java b/src/test/java/io/redis/examples/SetGetExample.java
index f75fda040e..dd3e0e6a32 100644
--- a/src/test/java/io/redis/examples/SetGetExample.java
+++ b/src/test/java/io/redis/examples/SetGetExample.java
@@ -2,7 +2,7 @@
// HIDE_START
package io.redis.examples;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
// REMOVE_START
import org.junit.jupiter.api.Test;
@@ -14,7 +14,7 @@ public class SetGetExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
// HIDE_END
String status = jedis.set("bike:1", "Process 134");
diff --git a/src/test/java/io/redis/examples/SetsExample.java b/src/test/java/io/redis/examples/SetsExample.java
index e3f45ad0d2..8f6acf0b1b 100644
--- a/src/test/java/io/redis/examples/SetsExample.java
+++ b/src/test/java/io/redis/examples/SetsExample.java
@@ -2,7 +2,7 @@
//HIDE_START
package io.redis.examples;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import org.junit.jupiter.api.Test;
import java.util.List;
import java.util.Set;
@@ -15,7 +15,7 @@ public class SetsExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
// HIDE_END
// REMOVE_START
diff --git a/src/test/java/io/redis/examples/SortedSetsExample.java b/src/test/java/io/redis/examples/SortedSetsExample.java
index ee7a9af4ac..446b784eef 100644
--- a/src/test/java/io/redis/examples/SortedSetsExample.java
+++ b/src/test/java/io/redis/examples/SortedSetsExample.java
@@ -2,7 +2,7 @@
//HIDE_START
package io.redis.examples;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.resps.Tuple;
//HIDE_END
@@ -19,7 +19,7 @@ public class SortedSetsExample {
@Test
public void run() {
//HIDE_START
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
//HIDE_END
//REMOVE_START
diff --git a/src/test/java/io/redis/examples/StreamsExample.java b/src/test/java/io/redis/examples/StreamsExample.java
index 7fa10b35e4..314e60ef8d 100644
--- a/src/test/java/io/redis/examples/StreamsExample.java
+++ b/src/test/java/io/redis/examples/StreamsExample.java
@@ -3,7 +3,7 @@
package io.redis.examples;
import redis.clients.jedis.StreamEntryID;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
//HIDE_END
//REMOVE_START
@@ -22,7 +22,7 @@ public class StreamsExample {
@Test
public void run() {
//HIDE_START
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
//HIDE_END
//REMOVE_START
diff --git a/src/test/java/io/redis/examples/StringExample.java b/src/test/java/io/redis/examples/StringExample.java
index d027a3329d..181174de7f 100644
--- a/src/test/java/io/redis/examples/StringExample.java
+++ b/src/test/java/io/redis/examples/StringExample.java
@@ -7,7 +7,7 @@
import org.junit.jupiter.api.Test;
//REMOVE_END
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.params.SetParams;
import java.util.ArrayList;
@@ -18,7 +18,7 @@ public class StringExample {
@Test
public void run() {
- try (UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379")) {
+ try (RedisClient jedis = new RedisClient("redis://localhost:6379")) {
// STEP_START set_get
String res1 = jedis.set("bike:1", "Deimos");
diff --git a/src/test/java/io/redis/examples/TDigestExample.java b/src/test/java/io/redis/examples/TDigestExample.java
index e6e6b6b2fd..b8000150de 100644
--- a/src/test/java/io/redis/examples/TDigestExample.java
+++ b/src/test/java/io/redis/examples/TDigestExample.java
@@ -6,7 +6,7 @@
//REMOVE_START
import java.util.List;
import org.junit.jupiter.api.Test;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import static org.junit.jupiter.api.Assertions.assertEquals;
//REMOVE_END
@@ -16,7 +16,7 @@ public class TDigestExample {
@Test
public void run(){
//HIDE_START
- UnifiedJedis jedis = new UnifiedJedis("redis://127.0.0.1:6379");
+ RedisClient jedis = new RedisClient("redis://127.0.0.1:6379");
//HIDE_END
//REMOVE_START
diff --git a/src/test/java/io/redis/examples/TimeSeriesTutorialExample.java b/src/test/java/io/redis/examples/TimeSeriesTutorialExample.java
index f40fa8000c..077b092c59 100644
--- a/src/test/java/io/redis/examples/TimeSeriesTutorialExample.java
+++ b/src/test/java/io/redis/examples/TimeSeriesTutorialExample.java
@@ -7,7 +7,7 @@
import org.junit.jupiter.api.Test;
// REMOVE_END
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.timeseries.*;
import redis.clients.jedis.timeseries.TSElement;
@@ -17,7 +17,7 @@ public class TimeSeriesTutorialExample {
@Test
public void run() {
- UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
+ RedisClient jedis = new RedisClient("redis://localhost:6379");
// REMOVE_START
// Clear any keys before using them in tests
jedis.del(
diff --git a/src/test/java/io/redis/examples/TopKExample.java b/src/test/java/io/redis/examples/TopKExample.java
index 34e03aa510..1ffa731f79 100644
--- a/src/test/java/io/redis/examples/TopKExample.java
+++ b/src/test/java/io/redis/examples/TopKExample.java
@@ -6,7 +6,7 @@
//REMOVE_START
import java.util.List;
import org.junit.jupiter.api.Test;
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
//REMOVE_END
public class TopKExample {
@@ -14,7 +14,7 @@ public class TopKExample {
@Test
public void run() {
//HIDE_START
- UnifiedJedis jedis = new UnifiedJedis("redis://127.0.0.1:6379");
+ RedisClient jedis = new RedisClient("redis://127.0.0.1:6379");
//HIDE_END
//REMOVE_START
diff --git a/src/test/java/io/redis/examples/VectorSetExample.java b/src/test/java/io/redis/examples/VectorSetExample.java
index 0b82c6dc78..b29ccbe133 100644
--- a/src/test/java/io/redis/examples/VectorSetExample.java
+++ b/src/test/java/io/redis/examples/VectorSetExample.java
@@ -5,7 +5,7 @@
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
// REMOVE_END
-import redis.clients.jedis.UnifiedJedis;
+import redis.clients.jedis.RedisClient;
import redis.clients.jedis.params.VAddParams;
import redis.clients.jedis.params.VSimParams;
@@ -15,7 +15,7 @@ public class VectorSetExample {
@Test
public void run() {
- try (UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379")) {
+ try (RedisClient jedis = new RedisClient("redis://localhost:6379")) {
// REMOVE_START
jedis.del("points", "quantSetQ8", "quantSetNoQ", "quantSetBin", "setNotReduced",
"setReduced");