Jedis 与 Lettuce
约 481 字大约 2 分钟
布欧-Lewyon
2026-05-15
Jedis
Jedis 是 Redis 的 Java 客户端,线程不安全,需配合连接池使用。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.1.0</version>
</dependency>// 基础使用
Jedis jedis = new Jedis("localhost", 6379);
jedis.auth("password");
jedis.set("key", "value");
String value = jedis.get("key");
jedis.close();JedisPool(线程安全)
// 连接池配置
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(200);
poolConfig.setMaxIdle(50);
poolConfig.setMinIdle(10);
poolConfig.setTestOnBorrow(true);
JedisPool pool = new JedisPool(poolConfig, "localhost", 6379, 2000, "password");
// 使用
try (Jedis jedis = pool.getResource()) {
jedis.set("user:100", "Alice");
String name = jedis.get("user:100");
}
// 关闭
pool.close();Pipeline(管道)
try (Jedis jedis = pool.getResource()) {
Pipeline pipeline = jedis.pipelined();
pipeline.set("k1", "v1");
pipeline.set("k2", "v2");
pipeline.incr("counter");
List<Object> results = pipeline.sync(); // 批量执行并获取结果
}数据操作
try (Jedis jedis = pool.getResource()) {
// String
jedis.set("key", "value");
jedis.setex("cache", 60, "expires"); // 带过期
// List
jedis.lpush("queue", "task1");
String task = jedis.rpop("queue");
// Set
jedis.sadd("tags", "redis", "java");
Set<String> tags = jedis.smembers("tags");
// Sorted Set
jedis.zadd("ranking", 100, "Alice");
Set<String> top = jedis.zrevrange("ranking", 0, 9);
// Hash
jedis.hset("user:1", "name", "Alice");
String name = jedis.hget("user:1", "name");
}Lettuce
Lettuce 基于 Netty,线程安全,支持响应式和同步 API。
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.3.2</version>
</dependency>// 同步 API
RedisClient client = RedisClient.create("redis://password@localhost:6379");
StatefulRedisConnection<String, String> conn = client.connect();
RedisCommands<String, String> sync = conn.sync();
sync.set("key", "value");
String value = sync.get("key");
conn.close();
client.close();响应式 API
RedisClient client = RedisClient.create("redis://localhost:6379");
StatefulRedisConnection<String, String> conn = client.connect();
RedisReactiveCommands<String, String> reactive = conn.reactive();
reactive.set("key", "value")
.then(reactive.get("key"))
.subscribe(value -> System.out.println(value));连接池
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxTotal(16);
RedisClient client = RedisClient.create("redis://localhost:6379");
ConnectionPoolSupport.createGenericObjectPool(
() -> client.connect(), poolConfig);Jedis vs Lettuce
| 对比 | Jedis | Lettuce |
|---|---|---|
| 线程安全 | ❌ 需连接池 | ✅ 单连接多线程 |
| 响应式 | ❌ | ✅ 支持 |
| 性能 | 高 | 更高(Netty) |
| Spring Boot 默认 | 5.x 之前 | 2.0+ 默认 |
| 学习成本 | 低 | 中 |
Spring Boot 2.x+ 默认使用 Lettuce,但 Jedis 更简单直观。
小结
- Jedis:简单直观,需连接池(JedisPool)保证线程安全。
- Lettuce:线程安全,支持响应式,性能更高。
- Pipeline 批量操作大幅提升吞吐量。
- Spring Boot 默认集成 Lettuce,配置
spring.data.redis即可。
