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();
    }
}
相关推荐
咩咩啃树皮12 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚12 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白14 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司15 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地16 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415916 小时前
TCP超时重传机制是为了解决什么问题?
java
二宝哥17 小时前
CentOS 7.9 系统下 Redis 5.0.4 单机安装与源码编译安装指南
redis·centos
莫逸风18 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898619 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112319 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python