一、前言:为什么选择 Jedis?
在 Java 生态中,操作 Redis 有多个客户端可选,如 Jedis 、Lettuce 、Redisson 。
其中,Jedis 因其:
- ✅ 轻量级(无 Netty 依赖)
- ✅ API 简洁直观(方法名与 Redis 命令高度一致)
- ✅ 社区成熟、文档丰富
成为许多中小型项目的首选 Redis 客户端。
本文将带你从零开始:
✅ 搭建 Jedis 环境
✅ 掌握核心 API 使用
✅ 配置连接池
✅ 避开常见坑点
二、环境准备
1. Maven 依赖(推荐最新稳定版)
XML
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.4.7</version> <!-- 截至 2025 年主流版本 -->
</dependency>
⚠️ 注意:Jedis 4.x 要求 Java 8+ ,且默认使用 Redis 6+ 协议。
2. 启动本地 Redis 服务
确保已安装并启动 Redis:
bash
# 启动 Redis(默认端口 6379)
redis-server
💡 若未安装,可使用 Docker 快速启动
bashdocker run -d --name redis -p 6379:6379 redis:7.0
三、快速上手:单连接操作
⚠️ 仅用于测试!生产环境必须用连接池
java
import redis.clients.jedis.Jedis;
public class JedisDemo {
public static void main(String[] args) {
// 1. 创建 Jedis 对象(默认 localhost:6379)
try (Jedis jedis = new Jedis("localhost", 6379)) {
// 2. 测试连接
System.out.println("Redis 连接状态: " + jedis.ping()); // 输出 PONG
// 3. String 操作
jedis.set("name", "张三");
System.out.println("name = " + jedis.get("name"));
// 4. Hash 操作
jedis.hset("user:1001", "age", "25");
jedis.hset("user:1001", "city", "北京");
System.out.println("用户城市: " + jedis.hget("user:1001", "city"));
// 5. List 操作
jedis.lpush("tasks", "task1", "task2");
System.out.println("任务列表: " + jedis.lrange("tasks", 0, -1));
// 6. 设置过期时间(秒)
jedis.expire("name", 10); // 10秒后自动删除
}
}
}
✅ 关键点:
- 使用
try-with-resources自动关闭连接- 方法命名与 Redis CLI 命令几乎一致(如
set→SET)
四、生产必备:配置连接池(JedisPool)
直接创建 Jedis 对象会频繁建立/销毁 TCP 连接,性能极差!
必须使用 JedisPool 连接池。
1. 创建连接池工具类
java
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolUtil {
private static JedisPool jedisPool;
static {
// 配置连接池参数
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(20); // 最大连接数
config.setMaxIdle(10); // 最大空闲连接
config.setMinIdle(2); // 最小空闲连接
config.setMaxWaitMillis(2000); // 获取连接最大等待时间(ms)
config.setTestOnBorrow(true); // 借出连接时测试连通性
// 创建连接池(无密码)
jedisPool = new JedisPool(config, "localhost", 6379, 2000);
// 若有密码,使用:
// jedisPool = new JedisPool(config, "localhost", 6379, 2000, "your_password");
}
public static Jedis getJedis() {
return jedisPool.getResource();
}
public static void close(Jedis jedis) {
if (jedis != null) {
jedis.close(); // 归还连接到池
}
}
}
2. 使用连接池操作 Redis
java
public class UserService {
public void saveUser(String userId, String name) {
Jedis jedis = null;
try {
jedis = JedisPoolUtil.getJedis();
jedis.hset("user:" + userId, "name", name);
System.out.println("用户保存成功");
} finally {
JedisPoolUtil.close(jedis);
}
}
}
✅ 最佳实践:
jedis.close()不是关闭连接,而是归还到连接池- 必须放在
finally块中,防止连接泄漏
五、常用数据类型操作示例
| Redis 类型 | Jedis 方法示例 |
|---|---|
| String | set(key, value), get(key), incr(key) |
| Hash | hset(key, field, value), hget(key, field), hgetAll(key) |
| List | lpush(key, values...), rpop(key), lrange(key, start, end) |
| Set | sadd(key, members...), smembers(key), sismember(key, member) |
| Sorted Set | zadd(key, score, member), zrevrange(key, 0, 9), zscore(key, member) |
示例:实现排行榜(ZSet)
java
Jedis jedis = JedisPoolUtil.getJedis();
try {
// 添加玩家分数
jedis.zadd("game:rank", 95.0, "playerA");
jedis.zadd("game:rank", 98.0, "playerB");
// 获取 Top 3
Set<String> top3 = jedis.zrevrange("game:rank", 0, 2);
System.out.println("Top 3: " + top3);
} finally {
JedisPoolUtil.close(jedis);
}
六、Spring Boot 中集成 Jedis(可选)
虽然 Spring Boot 官方推荐 Lettuce,但你仍可手动集成 Jedis:
1. 排除默认 Lettuce
java
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
2. 配置 application.yml
java
spring:
redis:
host: localhost
port: 6379
password:
jedis:
pool:
max-active: 20
max-idle: 10
min-idle: 2
max-wait: 2000ms
🔔 但注意:Spring Data Redis 对 Jedis 的支持不如 Lettuce 完善,新项目建议优先考虑 Lettuce。
七、常见问题与避坑指南
❌ 坑 1:忘记关闭 Jedis 连接
后果 :连接池耗尽,系统卡死
解决 :始终用try-finally或try-with-resources
❌ 坑 2:在多线程中共享同一个 Jedis 实例
原因 :Jedis 不是线程安全 的!
正确做法:每个线程从连接池获取独立实例
❌ 坑 3:存储大 Value(如 10MB JSON)
风险 :阻塞 Redis 单线程,影响其他请求
建议:Value 控制在 10KB 以内,大对象考虑压缩或分片
八、Jedis vs Lettuce:如何选择?
| 特性 | Jedis | Lettuce |
|---|---|---|
| 线程安全 | ❌ 否 | ✅ 是(基于 Netty) |
| 性能 | 高(轻量) | 高(异步非阻塞) |
| 资源占用 | 低 | 较高(Netty 开销) |
| Spring Boot 默认 | 否 | ✅ 是 |
| 适用场景 | 中小型项目、简单场景 | 高并发、响应式编程 |
📌 建议:
- 学习/小项目 → Jedis(简单直观)
- 企业级/高并发 → Lettuce
九、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!