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();
    }
}
相关推荐
二哈赛车手10 小时前
新人笔记---多策略搭建策略执行链实现RAG检索后过滤
java·笔记·spring·设计模式·ai·策略模式
PESS ABIN10 小时前
JavaWeb项目打包、部署至Tomcat并启动的全程指南(图文详解)
java·tomcat
AI进化营-智能译站10 小时前
ROS2 C++开发系列15-模板实现通用算法|宏定义ROS2调试开关|一次编码适配多平台
java·c++·算法·ai
刀法如飞10 小时前
Java数组去重的20种实现方式——指导AI解决不同问题的思路
java·算法·面试
薪火铺子10 小时前
SpringMVC请求处理流程源码解析(第1篇):请求入口与处理器映射
java·后端·spring
ch.ju10 小时前
Java程序设计(第3版)第二章——参数(实参 形参)
java
椰猫子10 小时前
SpringMVC(SpringMVC简介、请求与响应(请求映射路径、请求参数、日期类型参数传递、响应json数据))
java·前端·数据库
海兰10 小时前
【开篇】Spring AI、OpenClaw 和Hermes
java·人工智能·spring·spring ai
bzmK1DTbd10 小时前
微服务架构设计:Spring Cloud Gateway与Nacos集成
java·spring·微服务
上弦月-编程10 小时前
指针编程:高效内存管理核心
java·数据结构·算法