Redis系列八:Jedis连接池在java中的使用

前言:重要的不是记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();
     }
}
代码深度解析

为了让大家更好地理解这段代码的精髓,我将其拆解为以下几个关键点:

  1. 工厂设计模式的应用

    工厂模式是实际开发中非常常用的一种设计模式。通过 JedisConnectionFacotry,我们将连接的创建逻辑封装起来。这类似于Spring框架中Bean的创建机制,能够有效降低代码的耦合度。当需要修改连接配置时,我们只需修改工厂类,而无需改动所有调用方的代码。

  2. 静态代码块的妙用

    静态代码块在类加载时执行,且仅执行一次。利用这一特性,我们可以在应用启动时就完成连接池的初始化工作,确保后续的连接获取操作是即时的。

  3. 连接池配置详解

    我们在 JedisPoolConfig 中设置了核心参数:

    • maxTotal: 连接池中最大连接数(含空闲和正在使用的)。
    • maxIdle: 最大空闲连接数,避免资源浪费。
    • maxWaitMillis: 当连接池耗尽时,调用者等待连接的最大毫秒数。
  4. 资源获取与释放
    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();
    }
}
相关推荐
qq_269506756 分钟前
第29课-Servlet基础
java
毅炼18 分钟前
不写多语言 SDK,怎么让 Python、Go、Node 服务接入注册中心?
java·后端·系统架构·gateway
2501_9378609422 分钟前
上篇:网络编程基础与UDP套接字编程
java·网络·计算机网络
泡海椒27 分钟前
jquick-pdf 表格行列尺寸控制实战:单元格合并的可行边界
java·开发语言·pdf
Wang's Blog31 分钟前
Java 项目实战: 外卖平台-后台系统登录功能开发
java·服务器·redis
海鸥-w38 分钟前
spingboot定义一个全局异常处理器
java
曹牧1 小时前
Jackson 反序列化字段名不匹配
java
名字还没想好☜1 小时前
Spring Boot 优雅停机实战:等在途请求处理完再退出,配合 K8s preStop 别丢请求
java·后端·spring
摇滚侠1 小时前
《Spring Boot 3:高级与架构设计》第 1 章 Bean 与 BeanDefinition 个人理解 2
java·spring boot·笔记·后端
qq_269506751 小时前
第30课-请求与响应
java