redis系列-连接池

Posted LittleJAVA

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis系列-连接池相关的知识,希望对你有一定的参考价值。

  1. 目标 

    1. 了解连接池和Commons Pool2的实现 

    2. 熟悉redis的自动配置选项 

    3. 连接池的设计原理 

    4. 掌握redis集群的连接 

  2. 连接池 

今天来讲讲连接池,我以前认识的连接池是傻傻的分不清连接池是在哪一个端实现。有时候写服务器的时候,会去考虑实现连接池,那么全是问题了。同时也会思考,redis-server明明是单线程的,为什么会有多个连接。网络这块傻傻不懂啊。 

首先添张图,连接池(connection pool)是客户端去管理连接的一种设计模式(resource pool)。它可以通过重用pool中对象,来提供性能。例如重用连接,可以省去每次建立tcp连接的三次握手。 

 

连接池的主要应用接口是getObjectreturnObject。例如我们redis池抽象。 

redis系列-连接池

实现的该接口的类体系结构 

redis系列-连接池

这里来看DefaultLettucePool 

redis系列-连接池

redispool实现都是依赖于org.apache.commons.pool2包来实现。这到后面再说。 

 

  1. redis的自动配置 

现在spring-boot比较流行,我看一些组件跟spring集成,都喜欢看看XXXAutoConfiguration。这里我们来看org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration这个类 

redis系列-连接池

@ConditionalOnClass注解主要解释 

redis系列-连接池

主要当classpath中存在所指定的类就触发。 

 

其次看看这个RedisAutoConfiguration向容器中注册几个bean 

redis系列-连接池

 

redis系列-连接池

这里注册了三个beanJedisConnectionFactoryRedisTemplateStringRedisTemplate。而JedisConnectionFactory中使用连接池。连接池的配置如下。 

redis系列-连接池

这里JedisPoolConfig的配置有两种:一种是默认的,另一种的在RedisProperties中配置。 

redis系列-连接池

继承了Commons Pool2GenericObjectPoolConfig的实现。最后补充张图 

redis系列-连接池

 

  1. 连接池的设计原理 

 

所以对池有如下的问题: 

  • 池中的资源如何重用? 

  • 池中的资源未空时怎么办? 

  • 池中的资源满的时候怎么办? 

这些问题,其实在了解线程池时也会出现相同的问题。 

 

redis的连接都是通过pool.getResource()来获取的 

redis系列-连接池

 

jedis.close时归还JedisPool中去。 

 

当资源为空/满时,这个问题主要看org.apache.commons.pool2.impl.GenericObjectPool的实现。 

利用阻塞队列来实现。 

 


以上是关于redis系列-连接池的主要内容,如果未能解决你的问题,请参考以下文章

Redis Jedsi使用方法

redis系列之数据库与缓存数据一致性解决方案

Redis系列-远程连接redis

Redis系列-远程连接redis

golang-redis系列——返回值助手函数(二)

springboot整合redis