前言:重要的不是记api而是要知道有这些东西,为什么要用,怎么查语法。
Redis进阶:利用Jedis连接池与工厂模式优化Java应用性能
在Java开发中,与Redis进行交互是构建高性能应用的常见需求。初学者往往习惯于每次操作都新建一个Jedis连接(new Jedis()),并在操作结束后关闭它。然而,这种"短连接"的方式在高并发场景下会导致频繁的TCP握手与挥手,极大地消耗系统资源。
今天,我们将通过引入连接池(Connection Pool) 与工厂设计模式(Factory Pattern),对原始代码进行优雅的重构,从而显著提升应用的稳定性和吞吐量。
核心架构:Jedis连接池工厂
为了降低代码耦合度并统一管理连接资源,我们创建了一个名为 JedisConnectionFacotry 的工厂类。这个类的核心职责是:在类加载时初始化连接池,并提供获取连接的静态方法。
以下是该工厂类(当成一个工具放在一个工具包下面)的核心实现:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisConnectionFacotry {
// 1. 声明静态的连接池对象
private static final JedisPool jedisPool;
// 2. 静态代码块:随着类的加载而加载,确保初始化只执行一次
static {
// 配置连接池参数
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(8); // 最大连接数
poolConfig.setMaxIdle(8); // 最大空闲连接
poolConfig.setMinIdle(0); // 最小空闲连接
poolConfig.setMaxWaitMillis(1000); // 获取连接的最大等待时间
// 3. 创建连接池实例
jedisPool = new JedisPool(poolConfig,
"192.168.150.101", // Redis服务器地址
6379, // 端口号
1000, // 连接超时时间
"123321"); // 密码
}
// 4. 对外提供获取连接的方法
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
代码深度解析
为了让大家更好地理解这段代码的精髓,我将其拆解为以下几个关键点:
-
工厂设计模式的应用
工厂模式是实际开发中非常常用的一种设计模式。通过
JedisConnectionFacotry,我们将连接的创建逻辑封装起来。这类似于Spring框架中Bean的创建机制,能够有效降低代码的耦合度。当需要修改连接配置时,我们只需修改工厂类,而无需改动所有调用方的代码。 -
静态代码块的妙用
静态代码块在类加载时执行,且仅执行一次。利用这一特性,我们可以在应用启动时就完成连接池的初始化工作,确保后续的连接获取操作是即时的。
-
连接池配置详解
我们在
JedisPoolConfig中设置了核心参数:maxTotal: 连接池中最大连接数(含空闲和正在使用的)。maxIdle: 最大空闲连接数,避免资源浪费。maxWaitMillis: 当连接池耗尽时,调用者等待连接的最大毫秒数。
-
资源获取与释放
getJedis()方法通过jedisPool.getResource()从池中获取连接。如果池中有空闲连接,直接返回;如果没有且未达上限,则新建;如果已达上限且无空闲,则等待(超时抛异常)。
测试代码改造
在编写单元测试或业务逻辑时,我们需要改造原有的直连代码,改由工厂来获取连接。
改造前(直连模式):
@BeforeEach
void setUp(){
// 每次都新建连接,性能差
jedis = new Jedis("127.0.0.1", 6379);
jedis.select(0);
}
改造后(连接池模式):
@BeforeEach
void setUp(){
// 通过工厂获取连接,高效且复用
jedis = JedisConnectionFacotry.getJedis();
jedis.select(0);
}
@AfterEach
void tearDown() {
if (jedis != null) {
// 注意:此时的 close() 并不是物理关闭
// 而是将连接"归还"给连接池,以便复用
jedis.close();
}
}