参数名:maxTotal
含义:资源池最大连接数【默认值:8】
使用建议:需要考虑以下几点
1. 业务希望的 Redis 并发量
2. 客户端执行命令时间
3.Redis 资源:例如应用个数(客户端)* maxTotal 不能超过 Redis 服务端的最大连接数(config get maxclients)
4. 资源开销:例如虽然希望控制空闲连接,但是不希望因为连接池的频繁释放创建连接造成不必要的开销。
举例:
命令平均执行时间 0.1ms = 0.001s
业务需要 50000 QPS
maxTotal 理论值 = 0.001 * 50000 = 50 个。实际值要偏大一些。
参数名:maxIdle
含义:资源池允许最大的空闲连接数【默认值:8】
使用建议:建议跟 maxTotal 设置的值一样,这样可以减少创建新连接的开销
参数名:minIdle
含义:资源池确保最少空闲连接数【默认值:0】
使用建议:建议第一次开启的时候预热(初始化一个值),减少第一次启动后的新连接开销
参数名:jmxEnabled
含义:是否开启 jmx 监控,可用于监控资源使用状态【默认值:true】
使用建议:开启
参数名:blockWhenExhausted
含义:当资源池用尽后,调用者是否要等待。只有当为 true 时,配置的 maxWaitMillis 参数才会生效【默认值:true】
使用建议:建议先使用默认值,但这个也要看情况,如果并发量大,可以直接设置 false,即每次请求资源时,如果连接资源不够,马上 new 个新的
参数名:maxWaitMillis
含义:当资源池连接用尽后,调用者最大等待时间(单位为毫秒)【默认 -1,表示永不超时】
使用建议:不建议使用默认值,再高并发环境下,获取资源不能 hand 在一个没有超时时间的地方,具体设置根据实际场景 如设置 1000 即为等待 1 秒。
参数名:testOnBorrow、testOnReturn
含义:这两个参数是说,客户端向连接池借用或归还时,是否会在内部进行有效性检测(ping),无效的资源将被移除【默认值:false】
使用建议:建议 false,在高并发场景下,因为这样无形给每次增加了两次 ping 操作,对 QPS 有影响,如果不是高并发环境,可以考虑开启,或者自己来检测。
无法从连接池中获取连接(超时)
连接池中资源耗尽(最大连接 maxTotal 和最大空闲连接 maxIdle 设置不等)
解决思路:
1. 慢查询阻塞:池子连接都被 hang 住。
2. 资源参数不合理:例如 QPS 高,池子小。
3. 连接泄露(没有 close()):也就是没有归还连接,可以用 client list、netstat 观察连接的一个增长情况,最重要的是 try…catch…finally