pom引入jar包
<!-- redis start -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<!-- redis end -->
···
### spring配置
<bean id="myJedisClusterHelper" class="com.redis.JedisClusterHelper">
<property name="jedisCluster" ref="myJedisClusterFactory" />
</bean>
<!-- redis集群 -->
<bean id="myJedisClusterFactory" class="com.redis.JedisClusterFactory">
<property name="connectionTimeout" value="3000" />
<property name="soTimeout" value="3000" />
<property name="maxRedirections" value="5" />
<property name="genericObjectPoolConfig" ref="myJedisClusterPoolConfig" />
<property name="jedisClusterNodes">
<set>
<!-- 生产环境 -->
<value>${spring.redis.cluster.nodes1}</value>
<value>${spring.redis.cluster.nodes2}</value>
<value>${spring.redis.cluster.nodes3}</value>
<value>${spring.redis.cluster.nodes4}</value>
<value>${spring.redis.cluster.nodes5}</value>
<value>${spring.redis.cluster.nodes6}</value>
</set>
</property>
</bean>
<!-- redis3.2集群配置 -->
<bean id="myJedisClusterPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="50" />
<property name="maxIdle" value="5" />
<property name="maxWaitMillis" value="100000" />
<property name="testOnBorrow" value="true" />
</bean>
### redis.properties配置文件
###redis集群 spring.redis.cluster.nodes1=127.0.0.1:6380 spring.redis.cluster.nodes2=127.0.0.1:6381 spring.redis.cluster.nodes3=127.0.0.1:6382 spring.redis.cluster.nodes4=127.0.0.1:6390 spring.redis.cluster.nodes5=127.0.0.1:6391 spring.redis.cluster.nodes6=127.0.0.1:6392
Redis数据库索引(默认为0)
spring.redis.database=0
连接超时时间(毫秒)
spring.redis.timeout=60000
最大重试次数
spring.redis.maxRedirects=3
连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=300
连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
连接池中的最大空闲连接
spring.redis.pool.max-idle=100
连接池中的最小空闲连接
spring.redis.pool.min-idle=20
### JedisClusterFactory.java集群工厂类
package com.redis;
import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashSet; import java.util.List; import java.util.Set;
import org.apache.commons.lang.StringUtils; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean;
import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisCluster;
/**
- 读取redis集群节点
- @author
*/ public class JedisClusterFactory implements FactoryBean<JedisCluster>, InitializingBean{ private GenericObjectPoolConfig genericObjectPoolConfig; private JedisCluster jedisCluster; private int connectionTimeout = 2000; private int soTimeout = 3000; private int maxRedirections = 5; private Set<String> jedisClusterNodes;
public void afterPropertiesSet() throws Exception {
if (jedisClusterNodes == null || jedisClusterNodes.size() == 0) {
throw new NullPointerException("jedisClusterNodes is null.");
}
Set<String> nodesStrSet = new LinkedHashSet<String>();
Set<HostAndPort> haps = new LinkedHashSet<HostAndPort>();
for (String node : jedisClusterNodes) {
if (StringUtils.contains(node, "-")) {
nodesStrSet.addAll(Arrays.asList(convertHostIpSectionToList(node)));
} else {
nodesStrSet.add(node);
}
}
for (String node : nodesStrSet) {
String[] arr = node.split(":");
if (arr.length != 2) {
throw new ParseException("node address error !", node.length() - 1);
}
haps.add(new HostAndPort(arr[0], Integer.valueOf(arr[1])));
}
jedisCluster = new JedisCluster(haps, connectionTimeout, maxRedirections, genericObjectPoolConfig);
}
/**
* 将IP段与端口段拆分为详细的IP:端口
*
* @param addresses IP段\端口段,格式为:xxx.xxx.xxx.xxx-xxx:xxxxx-xxxxx
*/
private String[] convertHostIpSectionToList(String addresses) {
if (StringUtils.isBlank(addresses)) {
throw new IllegalArgumentException("The addresses parameter must not be null.");
}
String[] split = StringUtils.split(addresses, ":");
String hostSection = split[0], portSection = split[1];
hostSection = hostSection.trim();
portSection = portSection.trim();
List<String> hostList = new ArrayList<String>();
List<Integer> portList = new ArrayList<Integer>();
if (StringUtils.countMatches(hostSection, ".") != 3) {
throw new IllegalArgumentException("The hostSection [" + hostSection + "] format is incorrect.");
}
int hostMatches = StringUtils.countMatches(hostSection, "-");
if (hostMatches == 0) {
hostList.add(hostSection);
} else if (hostMatches == 1) {
String hostSectionLast = StringUtils.substringAfterLast(hostSection, ".");
String hostFixed = StringUtils.replace(hostSection, hostSectionLast, StringUtils.EMPTY);
String[] hostSections = StringUtils.split(hostSectionLast, "-");
if (hostSections.length != 2) {
throw new IllegalArgumentException("The hostSection [" + hostSection + "] format is incorrect.");
}
int start = Integer.valueOf(hostSections[0]), end = Integer.valueOf(hostSections[1]);
for (int i = start; i <= end; i++) {
hostList.add(String.valueOf(hostFixed + i));
}
} else {
throw new IllegalArgumentException("The hostSection [" + hostSection + "] format is incorrect.");
}
String[] portSections = StringUtils.split(portSection, "-");
if (portSections.length == 1) {
portList.add(Integer.valueOf(portSections[0]));
} else if (portSections.length == 2) {
int start = Integer.valueOf(portSections[0]), end = Integer.valueOf(portSections[1]);
for (int port = start; port <= end; port++) {
portList.add(port);
}
} else {
throw new IllegalArgumentException("The portSection [" + portSection + "] format is incorrect.");
}
Set<String> rtnValue = new LinkedHashSet<String>();
for (String host : hostList) {
for (Integer port : portList) {
rtnValue.add(String.format("%s:%d", host, port));
}
}
return rtnValue.toArray(new String[rtnValue.size()]);
}
public JedisCluster getObject() throws Exception {
return jedisCluster;
}
public Class<?> getObjectType() {
return (this.jedisCluster != null ? this.jedisCluster.getClass() : JedisCluster.class);
}
public boolean isSingleton() {
return true;
}
public GenericObjectPoolConfig getGenericObjectPoolConfig() {
return genericObjectPoolConfig;
}
public void setGenericObjectPoolConfig(GenericObjectPoolConfig genericObjectPoolConfig) {
this.genericObjectPoolConfig = genericObjectPoolConfig;
}
public JedisCluster getJedisCluster() {
return jedisCluster;
}
public void setJedisCluster(JedisCluster jedisCluster) {
this.jedisCluster = jedisCluster;
}
public int getConnectionTimeout() {
return connectionTimeout;
}
public void setConnectionTimeout(int connectionTimeout) {
this.connectionTimeout = connectionTimeout;
}
public int getSoTimeout() {
return soTimeout;
}
public void setSoTimeout(int soTimeout) {
this.soTimeout = soTimeout;
}
public int getMaxRedirections() {
return maxRedirections;
}
public void setMaxRedirections(int maxRedirections) {
this.maxRedirections = maxRedirections;
}
public Set<String> getJedisClusterNodes() {
return jedisClusterNodes;
}
public void setJedisClusterNodes(Set<String> jedisClusterNodes) {
this.jedisClusterNodes = jedisClusterNodes;
}
}
### JedisClusterHelper.java集群帮助工具类
package com.redis; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.TreeSet;
import org.slf4j.Logger; import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisPool; import redis.clients.jedis.ShardedJedis; import redis.clients.jedis.ShardedJedisPool;
/**
-
jedis集群帮助类
-
<p>Title: JedisClusterHelper</p>
-
<p>Description: </p>
-
@author
-
@date 2018-7-2 */ public class JedisClusterHelper{
private static Logger log = LoggerFactory.getLogger(JedisClusterHelper.class); private JedisCluster jedisCluster;
public JedisCluster getJedisCluster() { return jedisCluster; }
public void setJedisCluster(JedisCluster jedisCluster) { this.jedisCluster = jedisCluster; }
/**
- <p>Title: get</p>
- <p>Description: </p>
- @param format
- @return */ public String get(String key) { return jedisCluster.get(key); }
public void set(String key,String value) { jedisCluster.set(key, value); }
public void expire(String key,int seconds) { try { jedisCluster.expire(key, seconds); } catch (Exception e) { log.error("redis集群错误", e); } }
public void setExpire(String key,String value,int seconds){ try { jedisCluster.set(key, value); jedisCluster.expire(key, seconds); } catch (Exception e) { log.error("redis集群错误", e); } }
public boolean exists(String key) { boolean resultExists = false; try { resultExists = jedisCluster.exists(key); } catch (Exception e) { log.error("redis集群错误", e); resultExists = false; } return resultExists; }
public void del(String key) { try{ jedisCluster.del(key); } catch (Exception e) { log.error("redis集群错误", e); } }
/**
- 自增器
- <p>Title: incr</p>
- <p>Description: </p>
- @param key */ public int incr(String key) { int resultIncr = 0; try { resultIncr = jedisCluster.incr(key).intValue(); } catch (Exception e) { log.error("redis集群错误", e); resultIncr = 0; } return resultIncr; }
public void incrExpire(String key,int seconds){ try { jedisCluster.incr(key); jedisCluster.expire(key, seconds); } catch (Exception e) { log.error("redis集群错误", e); } }
public Map<String, String> getSnapShots(String key) { Map resultMap = null; try { resultMap = jedisCluster.hgetAll(key); } catch (Exception e) { log.error("redis集群错误", e); } if (resultMap == null) { resultMap = new HashMap<String, String>(); } return resultMap; }
public Set<String> smembers(String key) { Set<String> resultSet = null; try { resultSet = jedisCluster.smembers(key); } catch (Exception e) { log.error("redis集群错误", e); } if (resultSet == null) { resultSet = new HashSet<String>(); } return resultSet; }
public Long expireAt(String key, long unixTime) { try { return jedisCluster.expireAt(key, unixTime); } catch (Exception e) { log.error("redis集群错误", e); } return null; }
public Set<String> getKeysAll(String likeKey) { TreeSet<String> keys = new TreeSet<String>(); try { if (isNotBlank(likeKey)) { Map<String, JedisPool> clusterNodes = jedisCluster.getClusterNodes(); log.info("getKeysAll start:" + likeKey); for(String k : clusterNodes.keySet()){ JedisPool jp = clusterNodes.get(k); Jedis connection = jp.getResource();
try { keys.addAll(connection.keys(likeKey));
} catch(Exception e){
log.error("Getting keys error: {}", e);
} finally{
log.debug("Connection closed.");
connection.close();//用完一定要close这个链接!!!
} } log.info("getKeysAll end:" + likeKey + "keys.size:" + keys.size()); } } catch (Exception e) { log.error("redis集群错误", e); } return keys; }public Map<String, String> getStrMap(String mapName) { Map<String, String> mapStr = null; try { if (mapName != null && !"".equals(mapName)) { // 获取List下的所有值 mapStr = jedisCluster.hgetAll(mapName); } } catch (Exception e) { log.error("redis集群错误",e); }
return mapStr;}
public Object getObj(String key) { if (key != null && !"".equals(key)) { byte[] byteKey = key.getBytes(); byte[] result = this.getByte(byteKey);// 获取byte类型的数据 Object obj = null; if (result != null) {
obj = SerializeUtil.unserialize(result); } return obj; } return null;}
public byte[] getByte(byte[] key) { try { return jedisCluster.get(key); } catch (Exception e) { log.error("getByte:[key=" + key + "] occur exception..." + e.getMessage(), e); } return null; }
public long setStrMap(String mapName, String key, String value) { long result = -1; try { if (mapName != null && !"".equals(mapName)) { // 向set中存放值 result = jedisCluster.hset(mapName, key, value); } } catch (Exception e) { log.error("setStrMap:[mapName=" + mapName + ";key=" + key + ";value=" + value + "] occur exception..." + e.getMessage(), e); } return result; }
public long delStrMap(String mapName, String key) { long result = -1; try { if (mapName != null && !"".equals(mapName)) { // 向set中存放值 result = jedisCluster.hdel(mapName, key); } } catch (Exception e) { log.error("setStrMap:[mapName=" + mapName + ";key=" + key + "] occur exception..." + e.getMessage(), e); } return result; }
public static boolean isBlank(String str) { int strLen; if (str == null || (strLen = str.length()) == 0) return true; for (int i = 0; i < strLen; i++) if (!Character.isWhitespace(str.charAt(i))) return false;
return true;}
public static boolean isNotBlank(String str) { return !isBlank(str); } }
### 使用方法
@Autowired private JedisClusterHelper myJedisClusterHelper;
myJedisClusterHelper.set("testkey","testvalue");

















