导读:本期聚焦于黑豹创作的《Jedis客户端怎么用?Redis Java客户端从入门到实战的完整教程》,敬请观看详情。Jedis是Redis官方推荐的Java客户端之一,API命名与Redis命令几乎一一对应,学习成本低、上手快。本文将系统讲解Jedis的基本使用方法,包括如何通过Maven引入依赖、建立连接、执行字符串与哈希等常用数据结构操作、使用事务与管道提升性能,以及配置连接池避免频繁创建连接带来的开销。文中还对比了直连方式与连接池方式的差异,给出了生产环境下的推荐配置和常见踩坑点,帮助你快速在Java项目中稳定地操作Redis。

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

Jedis客户端怎么用?Redis Java客户端从入门到实战的完整教程

一、引入依赖与建立连接

使用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");

列表、集合和有序集合的使用方式同样直观。lpushrpop可以实现简单的消息队列效果,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

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260913/55991.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。