Commit 57394548 by 李传峰

Merge branch 'feature/mq_resource_0307' into 'master'

feat:[none] 调整jedis初始化结构,便于一个项目可以接入多个redis

See merge request rays/pcloud-common-parent!253
parents f23269ee 231ca56e
package com.pcloud.common.utils.cache.redis;
import com.pcloud.common.utils.json.JSONUtils;
import com.pcloud.common.utils.string.StringUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Pattern;
/**
*
* @描述:redis集群初始化
* @作者:songx
* @创建时间:2017年9月13日,下午5:50:17
* @版本:1.0
*/
public class JedisClusterBeanBuilder {
/**
*
*/
private static final Logger LOGGER = LoggerFactory.getLogger(JedisClusterBeanBuilder.class);
/**
* 正则校验IP
*/
private static final Pattern p = Pattern.compile("^.+[:]\\d{1,5}\\s*$");
/**
* Jedis连接池
*
* @return
*/
public static GenericObjectPoolConfig<?> createJedisPoolConfig(JedisClusterProperties properties) {
LOGGER.info("jedis pool config initialize...");
GenericObjectPoolConfig<?> poolConfig = new GenericObjectPoolConfig<>();
poolConfig.setMaxTotal(properties.getPool().getMaxTotal());
poolConfig.setMinIdle(properties.getPool().getMinIdle());
poolConfig.setMaxIdle(properties.getPool().getMaxIdle());
poolConfig.setMaxWaitMillis(properties.getPool().getMaxWaitMillis());
poolConfig.setTimeBetweenEvictionRunsMillis(properties.getPool().getTimeBetweenEvictionRunsMillis());
poolConfig.setTestOnBorrow(properties.getPool().isTestOnBorrow());
LOGGER.info("jedis pool config initialize,properties={}", JSONUtils.toJsonString(properties));
return poolConfig;
}
/**
* JedisCluster
*/
public static JedisCluster createJedisCluster(JedisClusterProperties properties, GenericObjectPoolConfig<?> config) {
LOGGER.info("JedisCluster create start,{},=>{}<=]", properties.getTimeout(), properties.getPassword());
try {
JedisCluster jc = new JedisCluster(parseHostAndPort(properties.getHost()),
properties.getTimeout(), properties.getTimeout(), properties.getMaxRedirections(), StringUtils.trimToNull(properties.getPassword()), config);
LOGGER.info("JedisCluster create completed,echo={}", jc.echo("Echo Successfully."));
return jc;
} catch (Exception e) {
LOGGER.info("JedisCluster create without password,{},=>{}<=],message={}", properties.getTimeout(), properties.getPassword(), e.getMessage());
JedisCluster jc = new JedisCluster(parseHostAndPort(properties.getHost()), properties.getTimeout(), properties.getMaxRedirections(), config);
LOGGER.info("JedisCluster create without password,echo={}", jc.echo("Echo Successfully."));
return jc;
}
}
/**
* 组装节点IP
*
* @return
*/
private static Set<HostAndPort> parseHostAndPort(final String host) {
LOGGER.info("JedisCluster connect nodes {}", host);
Set<HostAndPort> hostAndPorts = new HashSet<>();
if (StringUtil.isEmpty(host)) {
throw new IllegalArgumentException("解析 jedis配置文件 -> 节点IP不能为空");
}
String[] hosts = host.split(",");
for (int i = 0; i < hosts.length; i++) {
String value = hosts[i];
boolean isIpPort = p.matcher(value).matches();
if (!isIpPort) {
throw new IllegalArgumentException("解析 jedis配置文件 -> ip或 port不合法");
}
String[] ipAndPort = value.split(":");
hostAndPorts.add(new HostAndPort(ipAndPort[0].trim(), Integer.parseInt(ipAndPort[1].trim())));
}
return hostAndPorts;
}
}
package com.pcloud.common.utils.cache.redis; package com.pcloud.common.utils.cache.redis;
import com.pcloud.common.utils.string.StringUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Qualifier;
import org.slf4j.LoggerFactory; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.HostAndPort; import org.springframework.context.annotation.Primary;
import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisCluster;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Pattern;
/** /**
* *
* @描述:redis集群初始化
* @作者:songx
* @创建时间:2017年9月13日,下午5:50:17
* @版本:1.0
*/ */
@Configuration @Configuration
@EnableCaching @EnableCaching
public class JedisClusterConfig { public class JedisClusterConfig {
/** public static final String PROPERTIES_NAME = "defaultJedisClusterProperties";
* public static final String JEDIS_CLUSTER_NAME = "defaultJedisCluster";
*/
private static final Logger LOGGER = LoggerFactory.getLogger(JedisClusterConfig.class);
@Value("${redis.cluster.host}")
private String host;
@Value("${redis.cluster.password}")
private String password;
@Value("${redis.cluster.timeout}")
private int timeout;
@Value("${redis.cluster.maxRedirections}")
private int maxRedirections;
@Value("${redis.cluster.pool.maxTotal}")
private int maxTotal;
@Value("${redis.cluster.pool.minIdle}")
private int minIdle;
@Value("${redis.cluster.pool.maxIdle}")
private int maxIdle;
@Value("${redis.cluster.pool.maxWaitMillis}")
private int maxWaitMillis;
@Value("${redis.cluster.pool.timeBetweenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;
@Value("${redis.cluster.pool.testOnBorrow}")
private boolean testOnBorrow;
/**
* 正则校验IP
*/
private Pattern p = Pattern.compile("^.+[:]\\d{1,5}\\s*$");
/** @Bean(PROPERTIES_NAME)
* Jedis连接池 @Primary
* @ConfigurationProperties(prefix = "redis.cluster")
* @return public JedisClusterProperties defaultJedisClusterProperties() {
*/ return new JedisClusterProperties();
@Bean
public GenericObjectPoolConfig jedisPoolConfig() {
LOGGER.info("【redis】JedisPool注入成功,<START>");
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxTotal(maxTotal);
poolConfig.setMinIdle(minIdle);
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMaxWaitMillis(maxWaitMillis);
poolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
poolConfig.setTestOnBorrow(testOnBorrow);
return poolConfig;
} }
/** /**
* JedisCluster * JedisCluster
*/ */
@Bean @Bean(JEDIS_CLUSTER_NAME)
public JedisCluster JedisClusterFactory() { @Primary
LOGGER.info("【redis】JedisCluster创建,{},=>{}<=]", timeout, password); public JedisCluster jedisCluster(@Qualifier(PROPERTIES_NAME) JedisClusterProperties properties) {
try { GenericObjectPoolConfig<?> config = JedisClusterBeanBuilder.createJedisPoolConfig(properties);
JedisCluster jc = new JedisCluster(parseHostAndPort(), timeout, timeout, maxRedirections, StringUtils.trimToNull(password), jedisPoolConfig());
LOGGER.info("【redis】JedisCluster创建,echo={}", jc.echo("Echo Successfully."));
return jc;
} catch (Exception e) {
LOGGER.info("【redis】JedisCluster创建无密重试,{},=>{}<=],message={}", timeout, password, e.getMessage());
JedisCluster jc = new JedisCluster(parseHostAndPort(), timeout, maxRedirections, jedisPoolConfig());
LOGGER.info("【redis】JedisCluster创建无密重试,echo={}", jc.echo("Echo Successfully."));
return jc;
}
} JedisCluster cluster = JedisClusterBeanBuilder.createJedisCluster(properties, config);
/** /*
* 组装节点IP * Important,若是copy,这里请注意是否需要设置
*
* @return
*/ */
private Set<HostAndPort> parseHostAndPort() { JedisClusterUtils.initJedisCluster(cluster);
LOGGER.info("【redis】节点IP解析,<START>");
Set<HostAndPort> hostAndPorts = new HashSet<HostAndPort>(); return cluster;
if (StringUtil.isEmpty(host)) {
throw new IllegalArgumentException("解析 jedis配置文件 -> 节点IP不能为空");
}
String[] hosts = host.split(",");
for (int i = 0; i < hosts.length; i++) {
String value = hosts[i];
boolean isIpPort = p.matcher(value).matches();
if (!isIpPort) {
throw new IllegalArgumentException("解析 jedis配置文件 -> ip或 port不合法");
}
String[] ipAndPort = value.split(":");
hostAndPorts.add(new HostAndPort(ipAndPort[0].trim(), Integer.parseInt(ipAndPort[1].trim())));
}
return hostAndPorts;
} }
} }
package com.pcloud.common.utils.cache.redis;
import java.io.Serializable;
public class JedisClusterPoolProperties implements Serializable {
private static final long serialVersionUID = -7902154239743365109L;
private int maxTotal;
private int minIdle;
private int maxIdle;
private int maxWaitMillis;
private int timeBetweenEvictionRunsMillis;
private boolean testOnBorrow;
public int getMaxTotal() {
return maxTotal;
}
public void setMaxTotal(int maxTotal) {
this.maxTotal = maxTotal;
}
public int getMinIdle() {
return minIdle;
}
public void setMinIdle(int minIdle) {
this.minIdle = minIdle;
}
public int getMaxIdle() {
return maxIdle;
}
public void setMaxIdle(int maxIdle) {
this.maxIdle = maxIdle;
}
public int getMaxWaitMillis() {
return maxWaitMillis;
}
public void setMaxWaitMillis(int maxWaitMillis) {
this.maxWaitMillis = maxWaitMillis;
}
public int getTimeBetweenEvictionRunsMillis() {
return timeBetweenEvictionRunsMillis;
}
public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) {
this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
}
public boolean isTestOnBorrow() {
return testOnBorrow;
}
public void setTestOnBorrow(boolean testOnBorrow) {
this.testOnBorrow = testOnBorrow;
}
}
package com.pcloud.common.utils.cache.redis;
import java.io.Serializable;
public class JedisClusterProperties implements Serializable {
private static final long serialVersionUID = -3077470762060722520L;
private String host;
private String password;
private int timeout;
private int maxRedirections;
private JedisClusterPoolProperties pool;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public int getMaxRedirections() {
return maxRedirections;
}
public void setMaxRedirections(int maxRedirections) {
this.maxRedirections = maxRedirections;
}
public JedisClusterPoolProperties getPool() {
return pool;
}
public void setPool(JedisClusterPoolProperties pool) {
this.pool = pool;
}
}
...@@ -3,35 +3,26 @@ ...@@ -3,35 +3,26 @@
*/ */
package com.pcloud.common.utils.cache.redis; package com.pcloud.common.utils.cache.redis;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.pcloud.common.utils.ListUtils; import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.string.StringUtil; import com.pcloud.common.utils.string.StringUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.params.SetParams; import redis.clients.jedis.params.SetParams;
import java.util.*;
/** /**
* @描述:redis集群API * @描述:redis集群API
* @作者:songx * @作者:songx
* @创建时间:2017年5月11日,下午4:15:40 * @创建时间:2017年5月11日,下午4:15:40
* @版本:1.0 * @版本:1.0
*/ */
@Component("jedisClusterUtils")
public class JedisClusterUtils { public class JedisClusterUtils {
/** /**
...@@ -46,6 +37,11 @@ public class JedisClusterUtils { ...@@ -46,6 +37,11 @@ public class JedisClusterUtils {
private static JedisCluster jedisCluster; private static JedisCluster jedisCluster;
public static void initJedisCluster(JedisCluster jedisCluster) {
JedisClusterUtils.jedisCluster = jedisCluster;
LOGGER.warn("JedisClusterUtils inject jedisCluster {}", jedisCluster);
}
/** /**
* 保存一个字符串到redis中,长期有效 * 保存一个字符串到redis中,长期有效
* *
...@@ -1477,12 +1473,6 @@ public class JedisClusterUtils { ...@@ -1477,12 +1473,6 @@ public class JedisClusterUtils {
return result; return result;
} }
@Autowired
public void setJedisCluster(JedisCluster jedisCluster) {
JedisClusterUtils.jedisCluster = jedisCluster;
}
/** /**
* set添加元素进去 * set添加元素进去
* *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment