Redis 集群模式连接代码,需要密码,创建JedisCluster 对象

修正:这个代码在大数据集群验证测试之后,发现redis连接数会缓慢增加最后导致redis集群不可用,请自我验证。

查看连接数命令我博客里面有。。。。。

 

1,创建一个工程类,输入集群配置,需要输入密码的哦

package com.dianyou.redis;

import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import java.util.LinkedHashSet;
import java.util.Set;


public class LpPoolFactory implements PooledObjectFactory {


    /**
     * * 功能描述:激活资源对象
     * *
     * * 什么时候会调用此方法
     * * 1:从资源池中获取资源的时候
     * * 2:资源回收线程,回收资源的时候,根据配置的 testWhileIdle 参数,
     * * 判断 是否执行 factory.activateObject()方法,true 执行,false 不执行
     * * @param arg0
     * 
     */
    @Override
    public void activateObject(PooledObject arg0) throws Exception {
        System.out.println("activate Object");
    }




    @Override
    public void destroyObject(PooledObject arg0) throws Exception {
        System.out.println("destroy Object");
        JedisCluster JedisCluster = arg0.getObject();
        JedisCluster = null;
    }




    @Override
    public PooledObject makeObject() throws Exception {
        System.out.println("make Object");
        JedisPoolConfig poolConfig = new JedisPoolConfig(); 
        // 最大连接数 
        poolConfig.setMaxTotal(300); 
        // 最大空闲数 
        poolConfig.setMaxIdle(10); 
        // 最大允许等待时间,如果超过这个时间还未获取到连接,则会报JedisException异常: 
        // Could not get a resource from the pool 
        poolConfig.setMaxWaitMillis(1000); 
        Set nodes = new LinkedHashSet();
        nodes.add(new HostAndPort("172.10.10.120", 9000));
        nodes.add(new HostAndPort("172.10.10.121", 9001));
        nodes.add(new HostAndPort("172.10.10.122", 9001));
//        JedisCluster JedisCluster = new JedisCluster(nodes, poolConfig);
        JedisCluster JedisCluster = new JedisCluster(nodes,6000,1000,1,"111",new GenericObjectPoolConfig());

        return new DefaultPooledObject(JedisCluster);
    }


/**
 * 功能描述:钝化资源对象
 *
 * 什么时候会调用此方法
 * 1:将资源返还给资源池时,调用此方法。
 */


    @Override
    public void passivateObject(PooledObject arg0) throws Exception {
        System.out.println("passivate Object");
    }


/**
 * 功能描述:判断资源对象是否有效,有效返回 true,无效返回 false
 *
 * 什么时候会调用此方法
 * 1:从资源池中获取资源的时候,参数 testOnBorrow 或者 testOnCreate 中有一个 配置 为 true 时,则调用 factory.validateObject() 方法
 * 2:将资源返还给资源池的时候,参数 testOnReturn,配置为 true 时,调用此方法
 * 3:资源回收线程,回收资源的时候,参数 testWhileIdle,配置为 true 时,调用此方法
 */


    @Override
    public boolean validateObject(PooledObject arg0) {
        System.out.println("validate Object");
        return true;
    }

    public static void main(String[] args) {


    }
}



 

2,创建线程池

package com.dianyou.redis;

import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;


import redis.clients.jedis.JedisCluster;


public class RedisClusterPool {
    public static GenericObjectPool objectPool = null;

    static {
         //工厂
        LpPoolFactory factory = new LpPoolFactory();
        //资源池配置
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        //设置最大实例总数
        poolConfig.setMaxTotal(500);
        //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
        poolConfig.setMinIdle(1);
        poolConfig.setMaxIdle(1);
        //表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
        poolConfig.setMaxWaitMillis(1000);
        // 在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
        poolConfig.setTestOnBorrow(true);
        // 在还会给pool时,是否提前进行validate操作
        poolConfig.setTestOnReturn(true);
        //如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉  ;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;
        poolConfig.setTestWhileIdle(true);
        //表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;
        poolConfig.setMinEvictableIdleTimeMillis(6000);
        //表示idle object evitor两次扫描之间要sleep的毫秒数
        poolConfig.setTimeBetweenEvictionRunsMillis(30000);
        //在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义
        // poolConfig.setSoftMinEvictableIdleTimeMillis();

        //创建资源池
        objectPool = new GenericObjectPool(factory, poolConfig);
    }

    @SuppressWarnings("finally")
    public static JedisCluster getJedisCluster() {
        JedisCluster jedisCluster = null;
        try {
            jedisCluster = objectPool.borrowObject();
        } catch (Exception e) {
// TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            return jedisCluster;
        }

    }

    public static void closeJedisCluster(JedisCluster jedisCluster) {
        if (jedisCluster != null) {
            objectPool.returnObject(jedisCluster);
        }

    }

    public static void main(String[] args) {
        JedisCluster jedisCluster = RedisClusterPool.getJedisCluster();
        String name = jedisCluster.get("test_tmp");
        System.out.println("name = " + name);
    }
}

 

你可能感兴趣的:(redis)