Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
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");
Expand Down
18 changes: 12 additions & 6 deletions docs/advanced-usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -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<HostAndPort, HostAndPort> 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<HostAndPort> initialNodes = new HashSet<>();
// seed node
// seed node
initialNodes.add(new HostAndPort("my-redis.example.com", 7001));

HostAndPortMapper mapper = new DockerNATMapper(nodeMapping);
Expand All @@ -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.
Expand All @@ -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
Expand Down
8 changes: 4 additions & 4 deletions docs/redisearch.md
Original file line number Diff line number Diff line change
Expand Up @@ -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<HostAndPort> 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
Expand Down
8 changes: 4 additions & 4 deletions docs/redisjson.md
Original file line number Diff line number Diff line change
Expand Up @@ -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<HostAndPort> 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)
Expand Down
2 changes: 1 addition & 1 deletion hbase-formatter.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
Expand Down
56 changes: 56 additions & 0 deletions src/main/java/redis/clients/jedis/Jedis.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,62 @@
import redis.clients.jedis.util.KeyValue;
import redis.clients.jedis.util.Pool;

/**
* Jedis is a lightweight Redis client that uses a single, non-pooled connection to Redis.
* <p>
* <b>Important:</b> For most production use cases, {@link RedisClient} is the recommended and
* preferred option. {@code RedisClient} provides connection pooling, better resource management,
* and improved performance for typical applications.
* </p>
* <p>
* <b>When to use Jedis:</b>
* </p>
* <ul>
* <li><b>Short-lived scripts or utilities:</b> When you need a simple, lightweight client for
* one-off operations or command-line tools.</li>
* <li><b>Testing and development:</b> For unit tests or local development where connection pooling
* overhead is unnecessary.</li>
* <li><b>Fine-grained connection control:</b> Advanced scenarios requiring explicit control over
* individual connections, such as managing connection lifecycle manually or implementing custom
* connection strategies.</li>
* <li><b>Single-threaded applications:</b> Applications that execute Redis commands sequentially
* from a single thread and don't benefit from connection pooling.</li>
* </ul>
* <p>
* <b>When to use RedisClient instead:</b>
* </p>
* <ul>
* <li><b>Production applications:</b> Any multi-threaded or high-throughput application should use
* {@link RedisClient} for its connection pooling capabilities.</li>
* <li><b>Web applications:</b> Server applications handling concurrent requests benefit from
* connection pooling to avoid connection overhead.</li>
* <li><b>Long-running services:</b> Applications that maintain persistent connections to Redis
* should use {@link RedisClient} for better resource management.</li>
* <li><b>Default choice:</b> If you're unsure which to use, choose {@link RedisClient}.</li>
* </ul>
* <p>
* <b>Usage example:</b>
* </p>
*
* <pre>
* {
* &#64;code
* // Simple usage for a short-lived operation
* try (Jedis jedis = new Jedis("localhost", 6379)) {
* jedis.set("key", "value");
* String value = jedis.get("key");
* }
* }
* </pre>
* <p>
* <b>Note:</b> Each {@code Jedis} instance maintains a single connection. For concurrent access
* from multiple threads, either use {@link RedisClient} with connection pooling, or create
* separate {@code Jedis} instances per thread (not recommended for production).
* </p>
*
* @see RedisClient for the recommended pooled client for production use
* @see JedisPool for legacy pooled connections (deprecated, use RedisClient instead)
*/
public class Jedis implements ServerCommands, DatabaseCommands, JedisCommands, JedisBinaryCommands,
ControlCommands, ControlBinaryCommands, ClusterCommands, ModuleCommands, GenericControlCommands,
SentinelCommands, CommandCommands, Closeable {
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/redis/clients/jedis/JedisCluster.java
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
14 changes: 12 additions & 2 deletions src/main/java/redis/clients/jedis/JedisFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,19 @@
import redis.clients.jedis.util.JedisURIHelper;

/**
* PoolableObjectFactory custom impl.
* PooledObjectFactory implementation for creating and managing {@link Jedis} instances in connection pools.
* <p>
* This factory is used internally by {@link JedisPool} and {@link JedisSentinelPool} to create, validate,
* and destroy pooled Jedis connections.
* </p>
*
* @deprecated JedisFactory is used exclusively with the deprecated {@link JedisPool} and {@link JedisSentinelPool}
* classes. For modern Redis clients ({@link RedisClient}, {@link RedisSentinelClient}), the framework
* uses {@link ConnectionFactory} internally, which manages {@link Connection} objects instead of
* {@link Jedis} instances. There is no direct replacement for JedisFactory as connection management
* is handled automatically by the new client architecture.
*/
// Legacy
@Deprecated
public class JedisFactory implements PooledObjectFactory<Jedis> {

private static final Logger logger = LoggerFactory.getLogger(JedisFactory.class);
Expand Down
9 changes: 8 additions & 1 deletion src/main/java/redis/clients/jedis/JedisPool.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,14 @@
import redis.clients.jedis.util.JedisURIHelper;
import redis.clients.jedis.util.Pool;

// Legacy
/**
* JedisPool 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 JedisPool extends Pool<Jedis> {

private static final Logger log = LoggerFactory.getLogger(JedisPool.class);
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/redis/clients/jedis/JedisPoolConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,15 @@
import java.time.Duration;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;

/**
* Configuration class for {@link JedisPool} connection pooling.
*
* @deprecated JedisPoolConfig is used with the deprecated {@link JedisPool} and {@link JedisSentinelPool} classes.
* Use {@link ConnectionPoolConfig} instead, which is designed for the modern {@link RedisClient}
* and {@link RedisSentinelClient} classes. ConnectionPoolConfig provides the same pooling configuration
* options with better integration into the new client architecture.
*/
@Deprecated
public class JedisPoolConfig extends GenericObjectPoolConfig<Jedis> {

public JedisPoolConfig() {
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/redis/clients/jedis/JedisPooled.java
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/redis/clients/jedis/JedisSentinelPool.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@
import redis.clients.jedis.exceptions.JedisException;
import redis.clients.jedis.util.Pool;

/**
* JedisSentinelPool is a pooled connection client for Redis Sentinel deployments.
*
* @deprecated Use {@link RedisSentinelClient} instead. RedisSentinelClient provides the same functionality
* with a cleaner API and simplified constructor options. For basic usage, simple
* constructors are available. For advanced configuration, use {@link RedisSentinelClient#builder()}.
*/
@Deprecated
public class JedisSentinelPool extends Pool<Jedis> {

private static final Logger LOG = LoggerFactory.getLogger(JedisSentinelPool.class);
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/redis/clients/jedis/JedisSentineled.java
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Loading
Loading