最近项目中使用Spring data redis + lettuce管理redis连接。
其通过GenericObjectPool管理连接池,具体lettuce怎么用的连接池暂不考虑,仅关注池对象(连接)是如何管理的。
GenericObjectPool连接池idle对象及其清理
使用自动装配的方式,只支持配置这几个变量
- minIdle 最小空闲对象数量
- maxIdle 最大空闲对象数量
- timeBetweenEvictionRuns 清理空闲连接线程的执行间隔时间
- maxWait 获取池对象等待时间,超了就报错
维护了一个idleObjects队列
- 每次使用完一个连接后,都会判断队列是否超过maxIdle数量,满足就放入。
- 每次取,也先从idleObjects获取。 默认取用顺序LIFO (last in, first out)
启动一个清理idle连接的线程
- 每过 timeBetweenEvictionRuns 时间执行一次。
- 每次清理最多 numTestsPerEvictionRun 个idle对象
- 每次从最久的idle对象开始清理
配置结论:
使用spring data redis lettuce 自动装配时无法配置连接池的numTestsPerEvictionRun属性,且其默认值是3。
假设每过 240s,连接会中断导致异常,需要保证没有任何idle对象闲置时间超过240s,可以如下配置:
- numTestsPerEvictionRun = 3 (默认值,自动装配方式无法修改)
- timeBetweenEvictionRuns = 60 (240s 内理论上可以触发四次清理线程)
- minIdle = 3 (只要不为零即可,确保有连接复用)
- maxIdle = 12 (每次清理3个,最多4次可以清理完毕)
(有个隐藏的前提条件:清理时每次都清理最久的idle对象)