java
public class JedisConnectionFactory{
private static JedisPool jedisPool;
static {
//配置连接池
JedisPoolConfig poolConfig=new JedisPoolConfig();
poolConfig.setMaxTotal(8); // 连接池最大连接数:8个
poolConfig.setMaxIdle(8); // 最大空闲连接数:8个
poolConfig.setMaxIdle(0); // 最小空闲连接数:0个
poolConfig.setMaxWaitMillis(1000); // 获取连接最大等待时间:1秒
//创建连接池对象
jedisPool=new JedisPool(poolConfig,"192.168.75.150",6379,1000);
}
public static Jedis getJedisPool(){
return jedisPool.getResource();
}
}
功能概述
这是一个Redis连接池的工厂类,用于管理Redis连接,避免频繁创建和销毁连接。
核心组件
| 组件 | 作用 | 类比 |
|---|---|---|
| JedisPool | Redis连接池 | 像停车场,预先准备多个车位(连接) |
| JedisPoolConfig | 连接池配置 | 停车场的规则(最多几辆车、空闲几辆等) |
| getJedisPool() | 获取连接方法 | 取车钥匙,用完要还回去 |
配置参数解析
java
poolConfig.setMaxTotal(8); // 连接池最大连接数:8个
poolConfig.setMaxIdle(8); // 最大空闲连接数:8个
poolConfig.setMinIdle(0); // 最小空闲连接数:0个
poolConfig.setMaxWaitMillis(1000); // 获取连接最大等待时间:1秒
使用流程
- 初始化:类加载时创建连接池
- 获取连接:调用 getJedisPool() 从池中取连接
- 使用连接:执行Redis操作
- 归还连接:调用 jedis.close() 归还到池中
优势对比
| 方式 | 直接连接 | 连接池 |
|---|---|---|
| 性能 | 每次创建新连接,慢 | 复用现有连接,快 |
| 资源消耗 | 高 | 低 |
| 并发处理 | 差 | 好 |
注意事项
- 使用完连接后必须调用 close() 归还连接
- 连接池会自动管理连接的创建和销毁
- 适合高并发场景,避免连接资源耗尽
最大空闲连接数 (MaxIdle)
生活类比:
就像停车场规定最多只能有8个空车位,超过8个空车位就要关闭一些,避免浪费空间。
专业解释:
连接池中最多保留8个空闲连接,超过这个数量会自动关闭多余的连接。
最小空闲连接数 (MinIdle)
生活类比:
就像停车场至少要保证有0个空车位随时可用,如果低于这个数量就要提前准备车位。
专业解释:
连接池中至少保持0个空闲连接,低于这个数量会自动创建新连接。
实际运行效果
| 场景 | 最大空闲=8, 最小空闲=0 | 说明 |
|---|---|---|
| 高并发时 | 最多8个连接空闲等待 | 避免资源浪费 |
| 低并发时 | 最少0个连接保持 | 可以完全关闭空闲连接 |
| 连接不够时 | 自动创建新连接 | 保证业务需求 |
配置建议
java
// 保守配置(适合小项目)
poolConfig.setMaxIdle(5); // 最多5个空闲
poolConfig.setMinIdle(2); // 最少2个空闲
// 激进配置(适合大项目)
poolConfig.setMaxIdle(20); // 最多20个空闲
poolConfig.setMinIdle(5); // 最少5个空闲
static 的作用
生活类比:
就像公司里的公共设施(比如打印机、会议室),所有员工都可以使用,不需要每个人都买一台。
专业解释:
static 表示静态的,属于类而不是实例,所有对象共享同一个资源。
在你的代码中的具体作用
1. static JedisPool jedisPool
java
private static JedisPool jedisPool
- 作用:整个类共享一个连接池(哪个类?看补充说明)
- 好处:避免重复创建连接池,节省资源
2. static 代码块
java
static {
JedisPoolConfig poolConfig=new JedisPoolConfig();
//配置代码.....
jedisPool=new JedisPoolConfig(poolConfig,"192.168.75.150",6379,1000);
}
- 作用:类加载时自动执行,初始化连接池
- 好处:程序启动时就准备好连接池,无需手动初始化
3. static getJedisPool()
java
public static Jedis getJedisPool(){
return jedisPool.getResource();
}
- 作用:可以直接通过类名调用,无需创建对象
- 好处:使用方便,JedisConnectionFactory.getJedisPool()
对比:有static vs 无static
| 方式 | 有static | 无static |
|---|---|---|
| 调用方式 | JedisConnectionFactory.getJedisPool() | new JedisConnectionFactory().getJedisPool() |
| 资源消耗 | 一个连接池 | 每个对象一个连接池 |
| 内存使用 | 低 | 高 |
| 适用场景 | 单例模式 | 多实例模式 |
为什么用static?
- 连接池只需要一个:整个应用共享一个Redis连接池
- 避免重复创建:节省内存和初始化时间
- 使用方便:直接通过类名调用,无需new对象
- 线程安全:JedisPool本身是线程安全的
这就是典型的单例模式应用场景!
补充说明
static 整个类共享一个连接池 说的是哪个类 ?
指的是 JedisConnectionFactory 这个类!
具体说明
java
public class JedisConnectionFactory {
private static JedisPool jedisPool; // 这个连接池属于整个类
}
"整个类共享一个连接池" 的含义
生活类比:
就像公司里只有一台打印机,所有员工都共用这一台,而不是每个员工都有自己的打印机。
专业解释:
- JedisConnectionFactory 类中的所有方法都使用同一个 jedisPool 对象
- 不管调用多少次 getJedisPool() 方法,都是从同一个连接池中获取连接
实际使用场景
java
//场景1:在A类中使用
public class UserService{
public void saveUser(){
Jedis jedis=JedisConnectionFactory.getJedisPool();//从同一个连接池获取
//使用jedis
}
}
//场景2:在B类中使用
public class OrderService{
public void saveOrder(){
Jedis jedis=JedisConnectionFactory.getJedisPool();//还是在同一个连接池获取
//使用jedis...
}
}
为什么这样设计?
| 好处 | 说明 |
|---|---|
| 资源节约 | 整个应用只需要一个连接池,不重复创建 |
| 统一管理 | 所有Redis操作都通过同一个连接池 |
| 配置一致 | 所有地方使用相同的连接池配置 |
所以"整个类共享一个连接池"指的是 JedisConnectionFactory 类内部的 jedisPool 对象!