Jedis Connection Pool

来源:互联网 发布:node schedule 不好使 编辑:程序博客网 时间:2024/05/22 01:54

GitHub : https://github.com/asd821300801/Redis-Java-Client-Jedis


继续之前的文章:Redis Java Client Jedis


  • 我们这一章来学一下Jedis的连接池技术


Jedis连接池技术


  • 引入连接池所需jar包
<dependency>    <groupId>org.apache.commons</groupId>    <artifactId>commons-pool2</artifactId>    <version>2.4.2</version></dependency>

创建测试类


  • JedisConnectionPoolTest.java
import org.junit.BeforeClass;import org.junit.Test;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;/** * Jedis连接池的使用 * @author LingDu */public class JedisConnectionPoolTest {    //定义连接池对象    private static JedisPool jedisPool = null;    // Redis服务器IP    private static String ADDR = "192.168.20.33";    // Redis的端口号    private static int PORT = 6379;    // 访问密码    private static String AUTH = "123456";    /**     * 初始化Redis连接池     */    @BeforeClass    public static void init(){        try {            //创建连接池配置实例            JedisPoolConfig config = new JedisPoolConfig();            // 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true            config.setBlockWhenExhausted(true);            // 设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数)            config.setEvictionPolicyClassName("org.apache.commons.pool2.impl.DefaultEvictionPolicy");            // 是否启用pool的jmx管理功能, 默认true            config.setJmxEnabled(true);            // 最大空闲连接数, 默认8个 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。            config.setMaxIdle(8);            // 最大连接数, 默认8个            config.setMaxTotal(200);            // 表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;            config.setMaxWaitMillis(1000 * 100);            // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;            config.setTestOnBorrow(true);            //实例化连接池对象            jedisPool = new JedisPool(config, ADDR, PORT, 3000, AUTH);        } catch (Exception e) {            e.printStackTrace();        }    }    @Test    public void testGetJedisObject() {        // 从池中获取一个Jedis对象          Jedis jedis = jedisPool.getResource();          jedis.set("username", "admin");        System.out.println(jedis.get("username"));        // 释放jedis资源         jedis.close();    }}

1


代码优化


使用redis配置文件的方式读取连接配置


  • 在resources目录下创建redis.properties,配置信息如下:


#最大连接数, 默认10个redis.pool.maxTotal=10#最小空闲连接数,默认2个redis.pool.minIdle=2#最大空闲连接数,默认10个redis.pool.maxIdle=10 #最大的等待时间redis.pool.maxWait=1000#如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;#这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;redis.pool.testWhileIdle=true#获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的;  redis.pool.testOnBorrow=true#return 一个jedis实例给pool时,是否检查连接可用性(ping());redis.pool.testOnReturn=true#hostredis.ip=127.0.0.1#portredis.port=6379#authredis.auth=123456

创建测试类


  • JedisConnectionPoolConfigTest.java
import java.io.IOException;import java.util.Properties;import org.junit.BeforeClass;import org.junit.Test;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;/** * Jedis连接池的使用 * @author LingDu */public class JedisConnectionPoolConfigTest {    //定义连接池对象    private static JedisPool jedisPool = null;    //定义用于读取配置文件的Properties对象    private static Properties pro;    /**     * 读取配置redis.properties文件     */    static{        pro = new Properties();        try {            //加载配置文件            pro.load(JedisConnectionPoolConfigTest.class.getClassLoader().getResourceAsStream("redis.properties"));        } catch (IOException e) {            e.printStackTrace();        }    }    /**     * 初始化Jedis连接池     */    @BeforeClass    public static void initJedisPoolConfig(){        JedisPoolConfig config = new JedisPoolConfig();          config.setMaxTotal(Integer.valueOf(pro.getProperty("redis.pool.maxTotal")));        config.setMinIdle(Integer.valueOf(pro.getProperty("redis.pool.minIdle")));          config.setMaxIdle(Integer.valueOf(pro.getProperty("redis.pool.maxIdle")));          config.setMaxWaitMillis(Long.valueOf(pro.getProperty("redis.pool.maxWait")));          config.setTestWhileIdle(Boolean.valueOf(pro.getProperty("redis.pool.testWhileIdle")));          config.setTestOnBorrow(Boolean.valueOf(pro.getProperty("redis.pool.testOnBorrow")));          config.setTestOnReturn(Boolean.valueOf(pro.getProperty("redis.pool.testOnReturn")));          jedisPool = new JedisPool(config, pro.getProperty("redis.ip"),                 Integer.valueOf(pro.getProperty("redis.port")),                3000,                 pro.getProperty("redis.auth"));    }    @Test    public void testGetJedisObject() {        // 从池中获取一个Jedis对象          Jedis jedis = jedisPool.getResource();          jedis.set("username", "admin");        System.out.println(jedis.get("username"));        // 释放jedis资源         jedis.close();    }}

2


工程结构图


3