All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.wicp.tams.common.redis.RedisAssit Maven / Gradle / Ivy

/*
 * **********************************************************************
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称:common
 * 项目描述:公共的工具集
 * 版权说明:本软件属andy.zhou([email protected])所有。
 * ***********************************************************************
 */
package net.wicp.tams.common.redis;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

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

import net.wicp.tams.common.Conf;
import net.wicp.tams.common.apiext.StringUtil;
import net.wicp.tams.common.redis.builder.RedisSentinelBuilderTams;
import net.wicp.tams.common.redis.builder.RedisStandaloneBuilderTams;
import net.wicp.tams.common.redis.pool.AbsPool;
import net.wicp.tams.common.redis.pool.JedisPoolTams;
import net.wicp.tams.common.redis.pool.JedisSentinelPoolTams;
import redis.clients.jedis.Jedis;

public abstract class RedisAssit {
	static {
		// 防止自定义classload的时错过默认的加载配置,再次加载配置文件,不覆盖已存在的项
		Conf.overConf("/common-redis.properties", RedisAssit.class, false);
	}

	private static final Map innerPoolMap = new HashMap();

	public static Map getInnerpoolmap() {
		return innerPoolMap;
	}

	public static JedisPoolTams standalone(String serverName, String host, int port,
			GenericObjectPoolConfig poolConfig) {
		if (StringUtil.isNotNull(serverName) && innerPoolMap.containsKey(serverName)) {
			return (JedisPoolTams) innerPoolMap.get(serverName);
		}
		Map data = Conf
				.getAllConfigValues(String.format("%s.%s", "common.redis.redisserver", serverName), true);
		GenericObjectPoolConfig poolConfigtrue = poolConfig == null ? initDefaultConfig(serverName) : poolConfig;
		host = StringUtil.hasNull(host, data.get("host"));
		port = port <= 0 ? getConfigInt(data, "port") : port;
		RedisStandaloneBuilderTams tams=new RedisStandaloneBuilderTams();
		tams.setHost(host);
		tams.setPort(port);
		tams.setServerName(serverName);
		tams.setTimeout(getConfigInt(data, "timeout"));
		tams.setPoolConfig(poolConfigtrue);
		tams.init();
		System.out.println("拿到的data=====================================");
		data.forEach((k, v) -> System.out.println(k.concat(":::").concat(v)));
		return tams.getJedisPoolTams();
	}

	public static JedisPoolTams standalone(String serverName) {
		return standalone(serverName, null, 0, null);
	}

	public static JedisSentinelPoolTams sentinel(String serverName, String masterName, String[] sentinelAry,
			GenericObjectPoolConfig poolConfig) {
		if (StringUtil.isNotNull(serverName) && innerPoolMap.containsKey(serverName)) {
			return (JedisSentinelPoolTams) innerPoolMap.get(serverName);
		}
		GenericObjectPoolConfig poolConfigtrue = poolConfig == null ? initDefaultConfig(serverName) : poolConfig;
		Set sentinels = new HashSet<>();
		for (String sentinel : sentinelAry) {
			String[] sentinelArr = sentinel.split(":");
			if (sentinelArr.length == 2) {
				sentinels.add(sentinel);
			}
		}
		RedisSentinelBuilderTams build=new RedisSentinelBuilderTams();
		build.setMasterName(masterName);
		build.setSentinels(sentinels);
		build.setPoolConfig(poolConfigtrue);
		build.init();
		return build.getJedisSentinelPoolTams();
	}

	public static JedisSentinelPoolTams sentinel(String serverName, String masterName, String[] sentinelAry) {
		return sentinel(serverName, masterName, sentinelAry, null);
	}

	public synchronized static AbsPool getPool(String serverName) {
		if (StringUtil.isNotNull(serverName) && innerPoolMap.containsKey(serverName)) {
			return innerPoolMap.get(serverName);
		}
		Map data = Conf
				.getAllConfigValues(String.format("%s.%s", "common.redis.redisserver", serverName), true);
		String masterName = data.get("masterName");
		String sentinelAry = data.get("sentinelAry");
		AbsPool retpool = null;
		if (StringUtil.isNotNull(masterName) && StringUtil.isNotNull(sentinelAry)) {
			String[] sentinelArys = sentinelAry.split(",");
			retpool = sentinel(serverName, masterName, sentinelArys);
		} else {
			retpool = standalone(serverName);
		}
		// 测试一个连接是否正确
		Jedis jedis = null;
		try {
			jedis = retpool.getResource();
			if (!jedis.isConnected()) {
				retpool.destroy();
			}
		} catch (Exception e) {
			retpool.destroy();
		} finally {
			retpool.returnResource(jedis);
		}
		innerPoolMap.put(serverName, retpool);
		return retpool;
	}

//	public static String getConfigValue(String serverName, String confName) {
//		String conf = Conf.get(String.format("common.redis.redisserver.%s.%s", serverName, confName));
//		if ("default".equalsIgnoreCase(confName) && StringUtil.isNull(conf)) {
//			conf = Conf.get(String.format("common.redis.redisserver.%s.%s", serverName, "default"));
//		}
//		return conf;
//	}
//
	public static Integer getConfigInt(Map data, String confName) {
		return data.containsKey(confName) ? Integer.parseInt(data.get(confName)) : null;
	}

	public static Boolean getConfigBoolean(Map data, String confName) {
		return data.containsKey(confName) ? Boolean.parseBoolean(data.get(confName)) : null;
	}

	private static GenericObjectPoolConfig initDefaultConfig(String serverName) {
		Map data = Conf
				.getAllConfigValues(String.format("%s.%s", "common.redis.redisserver", serverName), true);
		GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig<>();
		poolConfig.setMaxWaitMillis(getConfigInt(data, "maxWaitMillis"));
		poolConfig.setMaxTotal(getConfigInt(data, "maxTotal"));
		poolConfig.setMaxIdle(getConfigInt(data, "maxIdle"));
		poolConfig.setTestOnBorrow(getConfigBoolean(data, "testOnBorrow"));
		poolConfig.setTestWhileIdle(getConfigBoolean(data, "testWhileIdle"));
		poolConfig.setMinIdle(getConfigInt(data, "minIdle"));
		// 这里配置错误会报:UNEXPECTED END OF STREAM,原因:没有把空闲链接自动移除
		poolConfig.setMinEvictableIdleTimeMillis(getConfigInt(data, "minEvictableIdleTimeMillis"));
		poolConfig.setSoftMinEvictableIdleTimeMillis(getConfigInt(data, "softMinEvictableIdleTimeMillis"));
		poolConfig.setNumTestsPerEvictionRun(getConfigInt(data, "numTestsPerEvictionRun"));
		poolConfig.setTestOnReturn(getConfigBoolean(data, "testOnReturn"));
		poolConfig.setTimeBetweenEvictionRunsMillis(getConfigInt(data, "timeBetweenEvictionRunsMillis"));
		poolConfig.setBlockWhenExhausted(getConfigBoolean(data, "blockWhenExhausted"));
		return poolConfig;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy