Redis连接池分析

时间:2024-03-16 08:51:30

Redis通过JedisConnectionFactory的fetchJedisConnector方法,从连接池中获取连接,具体过程如下:
Redis连接池分析

继续往下看:
Redis连接池分析

idleObjects是一个LinkedBlockingDeque阻塞队列,
代码“A”位置第一次尝试从这个队列中获取连接,如果获取失败(p==null),那么将进行Create创建连接。
如果创建仍然失败,判断borrowMaxWaitMillis是否小于零,该值赋值点在:
JedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
(1)如果小于0,则执行LinkedBlockingDeque阻塞队列的takeFirst方法。
官方对于takeFirst() 的说明如下:
获取并移除此双端队列的第一个元素,必要时将一直等待可用元素。
着也就是将MaxWaitMillis设置为-1或其他小于零的值时,将不限制最大连接数。
(2)如果大于0,则执行LinkedBlockingDeque阻塞队列的pollFirst方法。
官方对于pollFirst(long timeout, TimeUnit unit) 的说明如下:
获取并移除此双端队列的第一个元素,必要时将在“ 指定的等待时间” 等待可用元素。
此时,如果在指定的时间未获取连接,将会报异常出来。

OK,再回过头来看“A”代码区域的Create方法。
Redis连接池分析

原子操作类型createCount(线程安全),记录了当前创建的连接数。
如果大于了配置的MaxTotal,则返回空,进入上述的LinkedBlockingDeque队列操作,
MaxTotal的赋值点在:JedisPoolConfig.setMaxIdle(maxIdle);
否则,创建连接:p = this.factory.makeObject(), 然后加入到Map变量里。
这里有点疑惑,原以为会加入LinkedBlockingDeque队列,为什么加入了Map变量?
这块还没来及仔细研究,了解的同学可以留言告知。