Redis Client封装的大致步骤

1)创建配置对象(通过连接池配置对象创建连接池,根据具体的场景配置连接池参数 JedisPoolConfig),

2)创建连接池对象(单例模式管理JedisPool,连接池中会有很多jedis实例,RedisPool对象会很大,所以写成单例模式),

3)获取连接实例Jedis(别忘了归还连接释放资源,否则连接可能会被耗尽),

4)释放连接;在try块里面有了其他异常会导致resouce无法正常关闭,导致某个Jedis实例用完后没有还给JedisPool,导致资源不足。 出现异常导致Jedis连接无法关闭,所以要在finally里面释放资源。

 

JedisPool的配置参数很大程度上依赖于实际应用需求、软硬件能力,JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。

maxTotal 最大连接数

maxIdle 最小连接数

maxWaitMillis 获取连接时最大等待时间

testOnReturn 释放检测连接

testOnBorrow 获取检测连接

whenExhaustedAction [ɪgˈzɔ:stɪd] 连接耗尽时采取的策略

1)maxTotal 最大连接数,连接池的最大连接数,控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted( 耗尽状态 )。

2)maxWaitMillis 最大等待时间 表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;

3)testOnBorrow:在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;

4)testOnReturn:在return给pool时,是否提前进行validate操作;

5)whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种。

(1)WHEN_EXHAUSTED_FAIL 表示无jedis实例时,直接抛出NoSuchElementException;

(2)WHEN_EXHAUSTED_BLOCK 则表示阻塞住,或者达到maxWaitMillis时抛出JedisConnectionException;

(3)WHEN_EXHAUSTED_GROW 则表示新建一个jedis实例,也就说设置的maxTotal无用;

复用连接对象,提高效率。性能高。重复创建连接和关闭连接,浪费资源。

常用类:Jedis,JedisPool,JedisPoolConfig。

通过java客户端Jedis来操作redis。

客户端----->连接池----->redis.

限制最大连接数,防止系统资源耗尽。 两个时间的设置。

获取连接时,测试连接是否可用。怎么检查的?

释放连接时,测试连接是否可用。怎么检查的?

等待空闲连接:如果连接池中连接被取走完了,连接池没有空余连接,当前连接池的状态就是疲劳的。其他需要获取连接的线程就处于等待状态,等待空闲连接。

 

1、什么情况下,会出现连接耗尽情况?

连接池中的所有连接都被占用了,解决这个问题可以增加连接池中连接的个数,但是如果程序有问题,没有释放连接,那你增加多少最终还是会报错,因为连接没有释放回收。

java.util.NoSuchElementException: Timeout waiting for idle object 等待空闲的连接对象超时。idle 空闲。连接对象较少,拿不到连接对象。

java.util.NoSuchElementException: Timeout waiting for idle object

2、连接池配置的连接数过少可能会引起性能问题

查看具体线程信息,明显可以看出来是在等待redis线程池。都在等待获取连接,导致tps上不去。因为单个get或者set只有几毫秒,不可能慢的。

复现场景:1个连接,100万次处理。

3、timeBetweenEvictionRunsMillis;[ɪˈvɪkʃn]:驱除、驱赶。连接池中的连接空闲超过一定时间将会被回收。

minEvictableIdleTimeMillis; 连接池中连接可空闲的时间, 单位毫秒(如果连接超过多少毫秒没有被使用,就会被释放掉)

每n毫秒检查一次连接池中空闲的连接,把空闲时间超过m毫秒的连接断开,直到连接池中的连接数到minIdle为止。

4、问题:Could not return the resource to the pool;

不能将redis连接放回池内,放回连接池的对象是无效的对象。进行了两次returnResource释放连接资源造成的,因为第一次return成功以后,第二次return就会报上面这个错误。

1) 释放资源的时候,判断是否为空;2)把连接返回给连接池的时候,要进行校验,参数设置为testOnReturn(true); 3) 在finally中释放连接,防止抛出异常连接释放失败。

finally {
    if (jedis != null) {
        log.info("queryBuildingListFromCache 释放连接资源");
        jedis.close();
    }
}