Jedis是Redis生态中使用最广泛的Java客户端之一,它的最大特点是API与Redis原生命令高度一致,会写Redis命令就基本会用Jedis。相比Letture等其他客户端,Jedis的设计简单直接,方法名和Redis命令一一对应,比如set对应SET命令,hgetAll对应HGETALL命令,非常适合初学者理解。本文将从环境搭建开始,逐步讲解Jedis的连接建立、数据操作、事务管道以及连接池配置,带你完整走一遍Jedis的核心用法。

一、引入依赖与建立连接
使用Jedis前,需要在项目中引入它的依赖包。如果项目使用Maven构建,直接在pom.xml中添加如下依赖即可。需要注意Jedis 4.x版本要求JDK 8及以上,且不同版本之间API有少量差异,建议选择相对稳定的版本。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.4.1</version>
</dependency>依赖引入后,建立连接非常简单,只需创建一个Jedis对象并指定Redis服务器的地址和端口。如果Redis设置了密码,还需要调用auth方法完成认证。下面是一段最基础的连接代码:
import redis.clients.jedis.Jedis;
public class JedisDemo {
public static void main(String[] args) {
// 创建Jedis实例,默认连接本机6379端口
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 如果Redis设置了密码,需要先认证
// jedis.auth("yourPassword");
// 选择数据库,默认是0号库
jedis.select(0);
// 执行ping测试连通性
System.out.println(jedis.ping()); // 输出PONG
jedis.close();
}
}这段代码中,new Jedis(...)会在底层建立一条与Redis服务器的TCP连接,后续所有操作都复用这条连接。操作完成后调用close()释放连接。这种直连方式适合测试和演示,但在生产环境中并不推荐,原因在后面连接池部分会详细说明。
二、常用数据结构操作
Jedis对Redis五种基本数据类型都提供了完整支持,方法名与Redis命令保持一致,从命令行迁移到Java代码几乎没有学习成本。先看字符串类型的操作,这是使用频率最高的一种:
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 字符串操作
jedis.set("name", "zhangsan");
String name = jedis.get("name");
System.out.println(name); // zhangsan
// 设置过期时间,60秒后自动删除
jedis.setex("code", 60, "abc123");
// 仅当key不存在时才设置,常用于分布式锁
jedis.setnx("lock", "1");
// 数值自增,常用于计数器
jedis.incr("count");
System.out.println(jedis.get("count")); // 1哈希类型适合存储对象的多个字段,比如保存用户信息时,一个用户对应一个key,各个属性作为field存储,修改单个字段时不需要序列化整个对象:
// 哈希操作
jedis.hset("user:1", "name", "zhangsan");
jedis.hset("user:1", "age", "25");
// 一次设置多个字段
Map<String, String> map = new HashMap<>();
map.put("city", "beijing");
map.put("sex", "male");
jedis.hset("user:1", map);
// 获取所有字段
Map<String, String> all = jedis.hgetAll("user:1");
System.out.println(all);
// 获取单个字段
String age = jedis.hget("user:1", "age");列表、集合和有序集合的使用方式同样直观。lpush和rpop可以实现简单的消息队列效果,sadd用于去重场景,zadd则常用于排行榜。几个典型示例如下:
// 列表:从左边压入,从右边弹出
jedis.lpush("queue", "a", "b", "c");
String item = jedis.rpop("queue");
// 集合:添加元素并判断成员是否存在
jedis.sadd("tags", "java", "redis");
boolean exists = jedis.sismember("tags", "java");
// 有序集合:带分数排序,适合排行榜
jedis.zadd("rank", 100, "player1");
jedis.zadd("rank", 200, "player2");
// 按分数从高到低取前10名
List<String> top = jedis.zrevrange("rank", 0, 9);三、事务与管道的使用
Redis的事务通过MULTI、EXEC命令实现,Jedis对此做了封装。事务中的命令会被放入队列暂存,执行EXEC时一次性提交,中间不会插入其他客户端的命令。需要注意Redis的事务不支持回滚,如果队列中某条命令执行出错,其余命令仍会执行:
Transaction tx = jedis.multi();
tx.set("t1", "v1");
tx.incr("num");
tx.zadd("rank", 300, "player3");
// 执行事务
List<Object> results = tx.exec();
System.out.println(results); // 输出每条命令的执行结果管道则是提升性能的利器。正常情况下客户端每执行一条命令都要经历一次网络往返,命令数量多时网络开销会成为瓶颈。管道允许把多条命令打包后一次性发送,Redis将结果一次性返回,网络往返次数从N次降为1次。在批量插入数据的场景下,管道能带来数倍甚至数十倍的性能提升:
Pipeline pipe = jedis.pipelined();
for (int i = 0; i < 10000; i++) {
pipe.set("key:" + i, "value:" + i);
}
// 一次性发送并获取全部结果
List<Object> list = pipe.syncAndReturnAll();
System.out.println("写入数量:" + list.size());两者的区别在于:事务保证命令的原子性执行,中间不会被其他客户端的命令打断;管道只是减少网络往返,并不保证原子性。根据实际场景选择即可,批量读写优先考虑管道,需要原子操作时使用事务。
四、连接池配置与生产环境建议
直连方式下,每次操作都新建TCP连接,用完即销毁,高并发场景下频繁的连接创建和销毁会带来明显的性能损耗,甚至可能耗尽端口资源。正确的做法是使用JedisPool连接池,连接复用后这些问题都能避免。Jedis本身不是线程安全的,多线程环境必须从池中借取连接,用完归还:
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class PoolUtil {
// 连接池建议做成单例,全局共享
private static final JedisPool pool = new JedisPool(
new JedisPoolConfig(), "127.0.0.1", 6379, 2000, "yourPassword");
public static Jedis getJedis() {
return pool.getResource();
}
public static void main(String[] args) {
try (Jedis jedis = pool.getResource()) {
jedis.set("poolTest", "ok");
System.out.println(jedis.get("poolTest"));
} // try-with-resources会自动归还连接
}
}生产环境中还应对连接池参数做合理配置。常用的几个参数包括:最大连接数maxTotal,一般设置为200到500;最大空闲连接maxIdle,建议与最大连接数接近,避免频繁创建销毁空闲连接;连接超时时间connectionTimeout和读写超时soTimeout,通常设置为2000毫秒左右;以及testOnBorrow,设为true可以在借出连接前做一次校验,代价是略微降低性能。
此外还有几个容易踩坑的地方需要提醒。第一,Jedis实例在多线程间共享会抛出异常,务必保证一个线程使用一个从池中借出的实例。第二,从池中借出的连接使用完毕后必须归还,否则连接泄漏会导致池被耗尽,推荐使用try-with-resources写法。第三,如果使用的是Jedis 4.x版本,连接池构造方法的参数顺序与3.x不同,密码不再作为独立位置参数,升级版本时要留意兼容性。第四,Spring Boot项目中如果引入了spring-boot-starter-data-redis,默认客户端是Lettuce,想切换为Jedis需要手动排除依赖并重新引入,且新版本Spring Boot已经不再提供Jedis的自动装配支持,这一点在技术选型时要提前考虑清楚。
总结来说,Jedis凭借与Redis命令一致的API风格,依然是学习Redis和开发中小型项目的优秀选择。掌握连接管理、数据操作、管道优化和连接池配置这四个核心要点,就能够在Java项目中稳定高效地使用Redis了。
JedisRedis Java客户端Jedis连接池修改时间:2026-09-13 12:10:43