Jedis Connection Pool

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

#host
redis.ip=127.0.0.1

#port
redis.port=6379

#auth
redis.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值