java操作redis叢集連線池

深圳gg發表於2019-03-12

redis3.0.6叢集使用連線池,需要jedis-2.8.0.jar和commons-pool2-2.0.jar。 JedisCluster包含了所有節點的連線池,建議JedisCluster使用單例。JedisCluster每次操作完成後,不需要管理連線池的借還,它在內部已經完成。JedisCluster不用執行close()操作,它會將所有的JedisPool執行destory操作。

import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
public class ClusterPoolUtil {
private static JedisCluster jedisCluster;
private static String redisConfigFile = “redis.properties”;
private static String hostAndPorts = null;
public static JedisCluster getJedisCluster(){
Properties props = new Properties();
try{
//載入連線池配置檔案
props.load(RedisPoolUtil.class.getClassLoader().getResourceAsStream(redisConfigFile));
hostAndPorts = props.getProperty(“redis.ips.ports”);
if(jedisCluster==null){
int connectTimeOut = 10000;//連線超時
int soTimeOut =5000;//讀寫超時
int maxAttemts =10;//重試次數
Set jedisClusterNode = new HashSet();
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(Integer.valueOf(props.getProperty(“redis.maxActive”)));
poolConfig.setMaxIdle(Integer.valueOf(props.getProperty(“redis.maxIdle”)));
poolConfig.setMaxWaitMillis(Long.valueOf(props.getProperty(“redis.maxWaitMillis”)));
poolConfig.setTestOnBorrow(Boolean.valueOf(props.getProperty(“redis.testOnBorrow”)));
poolConfig.setTestOnReturn(Boolean.valueOf(props.getProperty(“redis.testOnReturn”)));
String[] hosts = hostAndPorts.split("\|\|");
for(String hostport:hosts){
String[] ipport = hostport.split("?;
String ip = ipport[0];
int port = Integer.parseInt(ipport[1]);
jedisClusterNode.add(new HostAndPort(ip, port));
}
if (jedisCluster == null) {
jedisCluster = new JedisCluster(jedisClusterNode,connectTimeOut,soTimeOut,maxAttemts, poolConfig);
}

        }
    }catch(Exception e){
        e.printStackTrace();
    }
    return jedisCluster;
}

public static void set(String key,String value){
    jedisCluster = getJedisCluster();
    jedisCluster.set(key, value);
}

public static String get(String key){
    jedisCluster = getJedisCluster();
    String value = jedisCluster.get(key);
    return value;
}

public static void main(String[] args) {
    set("key1", "value1");
    System.out.println(get("key1"));
}

}

redis.properties

#自己定義的引數
redis.ips.ports=10.10.15.191:7000||10.10.15.191:7001||10.10.15.191:7002||10.10.15.191:7003||10.10.15.191:7004||10.10.15.191:7005||10.10.15.191:7006||10.10.15.191:7007

##連線池最大連線數,預設是8。
redis.maxActive=80

##連線池中最大空閒的連線數
redis.maxIdle=10
##連線池中最小空閒的連線數
redis.minIdle=10
#空閒連線的檢測週期(單位為毫秒),預設-1 表示不做檢測
redis.timeBetweenEvictionRunsMillis=60000
#做空閒連線檢測時,每次的取樣數,預設3
redis.numTestsPerEvictionRun=10

#當連線池用盡後,呼叫者是否要等待,此引數和maxWaitMillis對應的,只有當此引數為true時,maxWaitMills才會生效。
redis.blockWhenExhausted=false
#當連線池用盡後,呼叫者的最大等待時間(單位為毫秒),預設值為-1 表示永不超時,一直等待,一般不建議使用預設值。
redis.maxWaitMillis = 1000

##向連線池借用連線時是否做連線有效性檢測(ping),無效連線會被移除,每次借出多執行一次ping命令,預設false。
redis.testOnBorrow=true
##向連線池歸還連線時是否做連線有效性檢測(ping),無效連線會被移除,每次借出多執行一次ping命令,預設false。
redis.testOnReturn=true
#向連線池借用連線時是否做連線空閒檢測,空閒超時的連線會被移除,預設false。
redis.testWhileIdle=true

##當客戶端閒置多長時間後關閉連線,如果指定為0,表示關閉該功能,單位毫秒
redis.timeout=3000

#連線的最小空閒時間,達到此值後空閒連線將被移除
redis.minEvictableIdleTimeMills=30000

相關文章