1. Jedis 快速入门
Jedis 是 Redis 官方推荐的 Java 客户端之一,它提供了与 Redis 原生命令一一对应的 API,使用起来非常直观。使用 Jedis 主要分为以下四个标准步骤:
第一步:引入依赖
新建一个 Maven 工程,并在 pom.xml 中引入 Jedis 和单元测试的依赖:
<!--jedis依赖-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
第二步:建立连接
新建一个单元测试类,利用 @BeforeEach 注解在测试方法执行前初始化连接、设置密码并选择目标数据库:
private Jedis jedis;
@BeforeEach
void setUp() {
// 1.建立连接(指定虚拟机IP和Redis端口)
jedis = new Jedis("192.168.150.101", 6379);
// 2.设置密码
jedis.auth("123321");
// 3.选择库(默认有16个库,这里选择0号库)
jedis.select(0);
}
第三步:测试基本命令
调用 Jedis 对象的方法来操作 Redis。方法名与 Redis 的命令行指令完全一致:
@Test
void testString() {
// 存入 String 数据
String result = jedis.set("name", "虎哥");
System.out.println("result = " + result);
// 获取 String 数据
String name = jedis.get("name");
System.out.println("name = " + name);
}
@Test
void testHash() {
// 插入 Hash 数据
jedis.hset("user:1", "name", "Jack");
jedis.hset("user:1", "age", "21");
}
第四步:释放资源
测试执行完毕后,需要使用 @AfterEach 注解修饰的方法来释放连接资源:
@AfterEach
void tearDown() {
if (jedis != null) {
jedis.close();
}
}
2. 核心进阶:使用 Jedis 连接池
为什么要使用连接池? Jedis 本身是线程不安全的,并且在多线程环境下频繁地创建和销毁连接会带来极大的性能损耗。因此,强烈推荐使用 Jedis 连接池(JedisPool) 来代替直连方式,这也是典型的“池化思想”应用(类似于数据库连接池和线程池)。
2.1 创建连接池工厂类
我们可以通过工厂设计模式和静态代码块,在类加载时完成连接池的初始化,以降低代码的耦合度:
public class JedisConnectionFactory {
private static final JedisPool jedisPool;
static {
// 1. 配置连接池属性
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(8); // 最大连接数
poolConfig.setMaxIdle(8); // 最大空闲连接数
poolConfig.setMinIdle(0); // 最小空闲连接数
poolConfig.setMaxWaitMillis(1000); // 获取连接的最大等待时间
// 2. 创建连接池对象
jedisPool = new JedisPool(poolConfig, "192.168.150.101", 6379, 1000, "123321");
}
// 3. 提供获取 Jedis 连接的方法
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
2.2 改造原始代码
引入连接池后,我们在入门代码中获取连接和关闭连接的方式需要做微小改动:
- 获取连接: 注释掉直接
new Jedis(...)的代码,改为通过工厂获取:jedis = JedisConnectionFactory.getJedis();。 - 关闭连接的机制变化: 代码依然是调用
jedis.close(),但此时它的底层逻辑变了。它并不会真正关闭和销毁连接,而是将该 Jedis 对象归还给连接池,供后续请求复用。