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();
    }
}
相关推荐
cyforkk1 小时前
Java 并发编程教科书级范例:深入解析 computeIfAbsent 与方法引用
java·开发语言
后青春期的诗go2 小时前
泛微OA-E9与第三方系统集成开发企业级实战记录(八)
java·接口·金蝶·泛微·oa·集成开发·对接
dreamxian2 小时前
苍穹外卖day09
java·spring boot·tomcat·log4j·maven
剑海风云2 小时前
JDK 26之安全增强
java·开发语言·安全·jdk26
左左右右左右摇晃2 小时前
Java并发——多线程
java·开发语言·jvm
23.2 小时前
【Java】字符串底层与常量池演变全解析
java·开发语言·jvm
极客先躯2 小时前
高级java每日一道面试题-2025年9月09日-数据处理篇[LangChain4j]-金融行业使用 LLM 有哪些合规要求?
java·金融·高级面试题·权限与访问控制·数据脱敏与隐私计算·模型可解释性工具·审计日志与监控
jing-ya2 小时前
day 59 图论part10
java·开发语言·数据结构·算法·图论
短剑重铸之日2 小时前
《ShardingSphere解读》16 改写引擎:如何理解装饰器模式下的 SQL 改写实现机制?
java·数据库·后端·sql·shardingsphere·分库分表·装饰器模式