Bootstrap

JedisSentinelPool配置说明

Jedis是Java最常用的用于连接Redis的客户端。也是Redis官方推荐的Redis连接客户端之一。

一般在项目中是使用Spring来管理jedis的连接池的,利用Spring ioc容器来管理。

 <!--配置Jedis连接池-->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="${redis.maxTotal}" />
        <property name="minIdle" value="${redis.minIdle}" />
        <property name="maxWaitMillis" value="${redis.maxWaitTime}" />
        <property name="maxIdle" value="${redis.maxIdle}" />
        <property name="testOnBorrow" value="${redis.testOnBorrow}" />
        <property name="testOnReturn" value="${redis.testOnReturn}" />
        <property name="testWhileIdle" value="${redis.testWhileIdle}" />
    </bean>
    <bean id="jedisSentinelPool" class="redis.clients.jedis.JedisSentinelPool">
        <constructor-arg index="0" value="mymaster" />
        <constructor-arg index="1">
            <set>
                <value>${redis.hostname}:${redis.port}</value>
            </set>
        </constructor-arg>
        <constructor-arg index="2" ref="poolConfig" />
    </bean>

上面的这段配置对应的Java代码即为:

package com.test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class TestRedis {
    private static JedisSentinelPool jedisSentinelPool = null;

    /**
     *  初始化Redis连接池.
     */
    static {
        JedisPoolConfig config = new JedisPoolConfig();
        //设置最大连接总数
        config.setMaxTotal(300);
        //设置最大空闲数
        config.setMaxIdle(50);
        //设置最小空闲数
        config.setMinIdle(8);
        config.setMaxWaitMillis(10000);
        //在获取连接的时候检查有效性, 默认false
        config.setTestOnBorrow(true);
        //在空闲时检查有效性, 默认false
        config.setTestOnReturn(true);
        //是否启用pool的jmx管理功能, 默认true
        config.setJmxEnabled(true);
        //Idle时进行连接扫描
        config.setTestWhileIdle(true);
        //是否启用后进先出, 默认true
        config.setLifo(true);
        //逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
        config.setTimeBetweenEvictionRunsMillis(30000);
        //每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
        config.setNumTestsPerEvictionRun(10);
        //表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义
        config.setMinEvictableIdleTimeMillis(60000);
        //连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
        config.setBlockWhenExhausted(true);
        //对象空闲多久后逐出, 当空闲时间>该值 且 空闲连接>最大空闲数 时直接逐出,不再根据MinEvictableIdleTimeMillis判断  (默认逐出策略)
        config.setSoftMinEvictableIdleTimeMillis(1800000);
        Set<String> set = new HashSet<>();
        //连接地址以及端口号,有多个就一次增加
        set.add("192.168.1.101:26379");
        jedisSentinelPool = new JedisSentinelPool("mymaster", set, config);
    }

    /**
     * 获取Jedis实例
     * @return 返回Jedis实例
     */
    public synchronized static Jedis getJedis() {
        try {
            if (jedisSentinelPool != null) {
                return jedisSentinelPool.getResource();
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 释放资源.
     * @param jedis jedis
     */
    public static void releaseResource(final Jedis jedis) {
        if (jedis != null){
            jedis.close();
            jedisSentinelPool.destroy();
        }
    }
    public static void main(String[] args) {
        Jedis jedis = getJedis();
        jedis.hgetAll("hash");
        releaseResource(jedis);
    }
}
;