JedisPool资源池优化

背景

合理的JedisPool资源池参数设置能为业务使用Redis保驾护航,本文将对JedisPool的使用、资源池的参数进行详细说明,最后给出“最合理”配置。

一、使用方法

以官方的2.9.0为例子(Jedis Release),Maven依赖如下:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
    <scope>compile</scope>
</dependency>

Jedis使用apache commons-pool2对Jedis资源池进行管理,所以在定义JedisPool时一个很重要的参数就是资源池GenericObjectPoolConfig,使用方式如下,其中有很多资源管理和使用的参数(具体看第二节)

注意:后面会提到建议用JedisPoolConfig代替GenericObjectPoolConfig

GenericObjectPoolConfig jedisPoolConfig = new GenericObjectPoolConfig();
jedisPoolConfig.setMaxTotal(..);
jedisPoolConfig.setMaxIdle(..);
jedisPoolConfig.setMinIdle(..);
jedisPoolConfig.setMaxWaitMillis(..);
...

JedisPool的初始化如下:

// redisHost和redisPort是实例的IP和端口
// redisPassword是实例的密码
// timeout,这里既是连接超时又是读写超时,从Jedis 2.8开始有区分connectionTimeout和soTimeout的构造函数

JedisPool jedisPool = new JedisPool(jedisPoolConfig, redisHost, redisPort, timeout, redisPassword);
执行命令如下:
Jedis jedis = null;
try {
    jedis = jedisPool.getResource();
    //具体的命令
    jedis.executeCommand()
} catch (Exception e) {
    logger.error(e.getMessage(), e);
} finally {
    //注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。
    if (jedis != null) 
        jedis.close();
}

二、参数说明

JedisPool保证资源在一个可控范围内,并且提供了线程安全,但是一个合理的GenericObjectPoolConfig配置能为应用使用Redis保驾护航,下面将对它的一些重要参数进行说明和建议:

在当前环境下,Jedis连接就是资源,JedisPool管理的就是Jedis连接。

2.1. 资源设置和使用

<
参数名 含义 默认值 使用建议
maxTotal 资源池中最大连接数 8 设置建议见下节
maxIdle 资源池允许最大空闲的连接数 8 见下节
minldle 资源池确保最少空闲的连接数 0 见下节
maxRedirections 最大重定向次数;超过设置后,抛出此异常 5 5
timeout jedis的socket timeout值,单位毫秒 2000 200~1000
blockWhenExhausted 当资源池用尽后,调用者是否要等待。只有当为true时,下面的maxWaitMillis才会生效 true 建议使用默认值
maxWaitMillis 当资源池连接用尽后,调用者的最大等待时间(单位为毫秒) -1:表示永不超时 不建议使用默认值
testOnBorrow 向资源池借用连接时是否做连接有效性检测(ping),无效连接会被移除
<think>首先,用户的问题是关于JedisPool连接池配置和Apollo读取配置的顺序。用户说:"我想了解JedisPool连接池配置和Apollo读取配置的顺序",意思是他们想知道在Java应用中,配置JedisPool连接池和从Apollo读取配置时的顺序问题。 回顾系统级指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考站内引用:用户提供了两个引用: - 引用[1]:关于Redis哨兵模式配置的启动顺序和配置项。 - 引用[2]:关于MyBatis-Plus的BaseMapper。 用户提到这些引用仅供参考,并不是真正的需求,我应该参考用户上一次的问题和我的回答。但在这个会话中,这是第一条用户消息,所以我需要基于当前问题回答。 用户的问题是:"JedisPool连接池配置与Apollo读取配置的顺序"。Apollo通常指的是携程开源的配置中心Apollo,用于管理和获取配置项。JedisPool是用来管理Redis连接池的。 关键点是顺序:应用启动时,如何配置JedisPool并读取Apollo配置的顺序问题。通常,在Spring Boot应用中,Apollo配置中心会在应用启动时加载配置,然后这些配置可以用来初始化JedisPool。 典型的顺序: 1. 应用启动。 2. Apollo配置客户端初始化并连接到Apollo服务器,获取配置。 3. 使用从Apollo获取的配置数据(如Redis服务器地址、端口、密码等)来配置JedisPool。 4. JedisPool初始化,建立连接池。 所以,顺序应该是先读取Apollo配置,然后基于这些配置初始化JedisPool。 在代码实现中,通常在Spring的配置类或Bean定义中,使用@Value或@ConfigurationProperties来注入Apollo提供的配置值,然后用这些值创建JedisPool实例。 例如: - 在Spring Boot中,使用@EnableApolloConfig启用Apollo。 - 定义一个Bean来创建JedisPool,参数从Apollo配置中获取。 回答需要结构化: - 逐步解释顺序。 - 确保真实可靠。 - 使用中文。 - 生成相关问题。 - 引用的段落末尾添加引用标识:但由于用户提供的引用可能与当前问题不直接相关,我需要谨慎处理。引用[1]是关于Redis哨兵的,引用[2]是MyBatis-Plus的,不太相关。用户说这些仅供参考,我应该专注于问题本身。 - 用户提到“请尽可能多的参考用户上一次的问题和你的回答”,但这是第一条消息,所以没有历史。 最终回答结构: 1. 引言:解释问题。 2. 详细说明顺序:先Apollo读取配置,然后JedisPool配置。 3. 代码示例(如果需要)。 4. 生成相关问题。 5. 添加引用标识:如果使用用户提供的引用,但由于不相关,可能不需要。或者只在必要时提及。 用户提供的引用: - 引用[1]:Redis服务启动顺序和哨兵配置。这与JedisPool配置相关,但不是完全相同。JedisPool是客户端连接池。 - 引用[2]:MyBatis-Plus,无关。 所以,在回答中,我可以忽略这些引用,除非找到相关点。例如,引用[1]提到配置项,JedisPool也有配置参数。 核心顺序: - Apollo配置中心在应用启动时加载。 - JedisPool在应用上下文初始化时创建,依赖于配置值。 在Spring中,Bean的初始化顺序可以通过@DependsOn或配置顺序来管理。 回答步骤: - 步骤1:Apollo配置加载。 - 步骤2:JedisPool配置使用Apollo的配置值。 - 可能讨论依赖关系和初始化顺序。 生成相关问题: - 例如: 1. 如何确保Apollo配置在JedisPool初始化前加载? 2. 在Spring Boot中如何集成Apollo和Jedis? 3. JedisPool常见的配置参数有哪些? 确保LaTeX:如果有数学表达式,但这里可能没有。用户问题中没有数学,所以可能不需要。 最终回答: - 用中文。 - 清晰结构。 </think>### JedisPool连接池配置与Apollo读取配置的顺序 在Java应用中(特别是基于Spring Boot框架),JedisPool连接池配置和Apollo配置中心的读取顺序非常重要,以确保Redis连接池能正确初始化并使用最新的配置。以下是详细的顺序说明和实现逻辑,基于标准实践: #### 1. **总体顺序原则** - **Apollo配置读取优先于JedisPool配置**:应用启动时,必须先加载Apollo配置中心的参数(如Redis主机地址、端口、密码等),然后使用这些参数实例化JedisPool连接池。否则,JedisPool可能因缺少必要配置而初始化失败。 - **原因**:Apollo作为配置中心,负责动态管理外部配置;JedisPoolRedis客户端连接池,依赖于这些配置值进行初始化。顺序错误会导致连接池无法获取Redis服务器信息,从而引发异常。 #### 2. **详细启动顺序(以Spring Boot应用为例)** 以下是典型顺序,确保配置加载和连接池初始化的正确性: **步骤1: 应用启动时初始化Apollo配置** - Apollo配置客户端在Spring上下文初始化阶段加载(通常在`ApplicationContext`启动时)。 - Apollo通过`@EnableApolloConfig`注解或`bootstrap.yml`文件触发配置加载。 - 例如,读取Redis相关配置(如`redis.host`、`redis.port`)并注入到Spring环境。 - 代码示例: ```java // bootstrap.yml 文件配置Apollo app: id: your-app-id apollo: meta: http://apollo-config-server:8080 spring: redis: host: ${redis.host} // 从Apollo动态获取 port: ${redis.port} ``` **步骤2: JedisPool配置基于Apollo参数初始化** - Apollo加载成功后,Spring Bean(如JedisPoolFactoryBean)使用`@Value`或`@ConfigurationProperties`注入配置值。 - JedisPool在Bean初始化阶段创建连接池。 - 代码示例: ```java @Configuration public class RedisConfig { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private int port; @Bean public JedisPool jedisPool() { JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(100); // 最大连接数(从Apollo读取更佳) return new JedisPool(poolConfig, host, port); } } ``` **关键依赖管理**: - 使用Spring的`@DependsOn`注解确保顺序(如果Apollo初始化有依赖): ```java @Bean @DependsOn("apolloConfig") // 假设apolloConfig是Apollo配置Bean public JedisPool jedisPool() { // 初始化代码 } ``` - 如果Apollo配置未加载,JedisPool初始化会抛出`IllegalArgumentException`(如未指定host)。 #### 3. **常见问题与优化** - **配置同步问题**:Apollo支持动态更新配置(如Redis地址变更)。JedisPool需要监听Apollo变更事件,通过`ConfigChangeListener`重启连接池实现热更新。 - 示例监听器: ```java @ApolloConfigChangeListener public void onChange(ConfigChangeEvent event) { if (event.isChanged("redis.host")) { jedisPool.destroy(); // 销毁旧池 jedisPool = new JedisPool(...); // 重新初始化 } } ``` - **错误顺序的后果**:如果JedisPool先于Apollo初始化,可能导致: - 连接失败(配置值为空或默认值)。 - 资源泄漏(连接池无法关闭)。 - **最佳实践**: - 在`bootstrap.yml`中优先配置Apollo元数据。 - 使用Spring Profile区分环境(如dev/prod)。 - 结合哨兵模式时,确保Redis服务启动顺序正确,主机先启动,哨兵再监控[^1]。 #### 4. **性能与可靠性建议** - **Apollo读取优化**:启用Apollo缓存(`apollo.cacheDir`)减少网络延迟。 - **JedisPool配置参数**:通过Apollo管理关键参数,如: - `maxTotal`(最大连接数) - `maxIdle`(空闲连接数) - `testOnBorrow`(借出连接时测试有效性) - 这些参数应优先从Apollo读取,避免硬编码。 通过遵循以上顺序和优化措施,可以确保JedisPool在高并发场景下稳定运行,同时利用Apollo的动态配置优势[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值