Jedis is a widely used Java client for Redis, providing a straightforward synchronous API. It supports standalone, sentinel, and cluster modes.

Setup

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

Basic Usage

  try (Jedis jedis = new Jedis("localhost", 6379)) {
    jedis.auth("password");  // if required

    // String operations
    jedis.set("user:1:name", "Alice");
    String name = jedis.get("user:1:name");

    // With TTL
    jedis.setex("session:abc123", 3600, "userId=1");

    // Hash
    jedis.hset("user:1", "email", "[email protected]");
    jedis.hset("user:1", "role", "admin");
    Map<String, String> user = jedis.hgetAll("user:1");

    // List (queue)
    jedis.lpush("task:queue", "task1", "task2");
    String task = jedis.brpop(5, "task:queue").get(1);  // blocking pop

    // Set
    jedis.sadd("online:users", "1", "2", "3");
    boolean isOnline = jedis.sismember("online:users", "1");

    // Sorted Set (leaderboard)
    jedis.zadd("leaderboard", 9500, "player1");
    jedis.zadd("leaderboard", 8700, "player2");
    List<String> topPlayers = jedis.zrevrange("leaderboard", 0, 9);
}
  

Connection Pool

Always use a pool in production:

  JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(20);
poolConfig.setMaxIdle(10);
poolConfig.setMinIdle(5);
poolConfig.setTestOnBorrow(true);

JedisPool pool = new JedisPool(poolConfig, "localhost", 6379, 2000, "password");

try (Jedis jedis = pool.getResource()) {
    jedis.set("key", "value");
}
  

Spring configuration:

  @Configuration
public class JedisConfig {
    @Bean
    public JedisPool jedisPool() {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(20);
        config.setMaxIdle(10);
        return new JedisPool(config, "localhost", 6379);
    }
}
  

Pipeline (Batch Operations)

Reduce round trips by batching commands:

  try (Jedis jedis = pool.getResource()) {
    Pipeline pipeline = jedis.pipelined();
    for (int i = 0; i < 1000; i++) {
        pipeline.set("key:" + i, "value:" + i);
    }
    pipeline.sync();  // send all at once
}
  

Transactions

  try (Jedis jedis = pool.getResource()) {
    Transaction tx = jedis.multi();
    tx.decrBy("inventory:product1", 1);
    tx.incrBy("sold:product1", 1);
    tx.exec();
}
  

Redis Cluster

  Set<HostAndPort> nodes = Set.of(
    new HostAndPort("node1", 6379),
    new HostAndPort("node2", 6379),
    new HostAndPort("node3", 6379)
);
JedisCluster cluster = new JedisCluster(nodes);
cluster.set("key", "value");
  

Jedis vs Lettuce

Feature Jedis Lettuce
Thread safety Pool-based Thread-safe (single connection)
Model Synchronous Sync + Async + Reactive
Spring Boot default No Yes
Cluster support Yes Yes
Connection overhead Higher (pool) Lower

Best Practices

  • Always use JedisPool — never create a new Jedis per request
  • Use pipelines for bulk operations to reduce network round trips
  • Set appropriate TTL on all keys to prevent memory exhaustion
  • Use Redis Cluster for production HA requirements
  • Prefer Lettuce for new Spring Boot projects (default since Boot 2.x)