On this page
Redis with Jedis
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 newJedisper 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)