1. 程式人生 > >Java Java實現的多例模式

Java Java實現的多例模式

參考文章

設計模式之多例模式

Java 多例模式實際就是單例模式的一個擴充套件,下面給出一個多例模式的實現 

需要引入的Java包 

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

RedisClusterMulti.java

package com.yaobaling.td.blacklist.redis;

import redis.clients.jedis.JedisCluster;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Random;

/**
 * Created by szh on 2018/10/29.
 *
 * @author szh
 */
public class RedisClusterMulti implements Serializable {

    private static final Integer MAX_JEDIS_CLUSTER_NUM = 20;

    private static List<RedisCluster> redisClusterList = new ArrayList<>();

    private static final Random random = new Random();

    private RedisClusterMulti() {

    }

    public static void init(Properties conf) throws Exception {
        for (int i = 0; i < MAX_JEDIS_CLUSTER_NUM; i++) {
            redisClusterList.add(new RedisCluster(conf));
        }
    }


    public static JedisCluster getJedisCluster() {
        int index = random.nextInt(MAX_JEDIS_CLUSTER_NUM);
        return redisClusterList.get(index).getClusterConn();
    }
}

RedisCluster.java

package com.yaobaling.td.blacklist.redis;

import com.yaobaling.td.blacklist.config.ConfigCenter;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;

/**
 * Created by szh on 2018/10/9.
 *
 * @author szh
 * @date 2018-10-09
 */
public class RedisCluster implements Serializable{

    private JedisCluster jedisCluster = null;

    public RedisCluster(Properties config) throws Exception {

        String clusterAddr = null;
        if (StringUtils.isNotBlank(config.getProperty("redis.cluster.addr"))) {
            clusterAddr = config.getProperty("redis.cluster.addr");
        }

        Set<HostAndPort> hostAndPortSet = new HashSet<>();
        String[] addrList = clusterAddr.split(",");
        for (String tmpAddr : addrList) {
            String[] tmpHostAndPortArr = tmpAddr.split(":");
            HostAndPort tmphostAndPort = new HostAndPort(tmpHostAndPortArr[0], Integer.valueOf(tmpHostAndPortArr[1]));
            hostAndPortSet.add(tmphostAndPort);
        }


        //進行設定,防止以下異常: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
        genericObjectPoolConfig.setMinIdle(10);
        genericObjectPoolConfig.setMaxIdle(100);

        jedisCluster = new JedisCluster(hostAndPortSet,genericObjectPoolConfig);
    }

    public JedisCluster getClusterConn() {
        return jedisCluster;
    }

}