redis集群测试代码:
@Test
public void testCluster(){
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.126.166",7000));
nodes.add(new HostAndPort("192.168.126.166",7001));
nodes.add(new HostAndPort("192.168.126.166",7002));
nodes.add(new HostAndPort("192.168.126.166",7003));
nodes.add(new HostAndPort("192.168.126.166",7004));
nodes.add(new HostAndPort("192.168.126.166",7005));
nodes.add(new HostAndPort("192.168.126.166",7006));
nodes.add(new HostAndPort("192.168.126.166",7007));
nodes.add(new HostAndPort("192.168.126.166",7008));
JedisCluster jedisCluster = new JedisCluster(nodes);
jedisCluster.set("aa", "小提莫哪里逃");
System.out.println(jedisCluster.get("aa"));
}
我们使用了3主6从的结构建立了redis的集群,要连接集群Jedis提供了JedisCluster对象,根据对象源码得知创建此对象需要Set集合,而HostAndPort的对象源码显示创建此对象需要redis的ip和端口,至此即可根据源码要求实现redis的连接,建立连接后存储并读取数据进行redis集群的测试。
根据测试结果进行整合:
(1)根据redis.conf配置文件选取需要使用的参数编辑属性文件
#最小空闲数
redis.minIdle=100
#最大空闲数
redis.maxIdle=300
#最大连接数
redis.maxTotal=1000
#客户端超时时间单位是毫秒
redis.timeout=5000
#最大建立连接等待时间
redis.maxWait=1000
#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
redis.testOnBorrow=true
#redis cluster
redis.cluster0=192.168.126.166:7000
redis.cluster1=192.168.126.166:7001
redis.cluster2=192.168.126.166:7002
redis.cluster3=192.168.126.166:7003
redis.cluster4=192.168.126.166:7004
redis.cluster5=192.168.126.166:7005
redis.cluster6=192.168.126.166:7006
redis.cluster7=192.168.126.166:7007
redis.cluster8=192.168.126.166:7008
(2) 创建JedisCluster工厂类并交给Spring管理
由于JedisCluster对象创建时需要放入大量的连接信息,因此适合使用工厂模式进行管理,创建并整合JedisClusterFactory工厂类即可合理获取JedisCluster对象,维护时,只需修改属性配置文件即可实现集群结构的变更。
package com.jt.common.factory;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.core.io.Resource;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
public class JedisClusterFactory implements FactoryBean<JedisCluster>{
//引入pro配置文件
private Resource propertySource;
private JedisPoolConfig poolConfig;
private String redisNodePrefix;
//获取Set集合信息
public Set<HostAndPort> getNodes(){
Set<HostAndPort> nodes = new HashSet<>();
//操作pro对象
Properties pro = new Properties();
try {
pro.load(propertySource.getInputStream());
//遍历获取nodes节点数据
for (Object key : pro.keySet()) {
//将key变为String类型 目的判断字符串方便
String strKey = (String) key;
//判断哪个是redis节点数据
if(strKey.startsWith(redisNodePrefix)){
//IP:端口
String value = pro.getProperty(strKey);
String[] args = value.split(":");
HostAndPort hostAndPort =
new HostAndPort(args[0],Integer.parseInt(args[1]));
nodes.add(hostAndPort);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return nodes;
}
@Override
public JedisCluster getObject() throws Exception {
Set<HostAndPort> nodes = getNodes();
return new JedisCluster(nodes, poolConfig);
}
@Override
public Class<?> getObjectType() {
return JedisCluster.class;
}
@Override
public boolean isSingleton() {
return false;
}
public Resource getPropertySource() {
return propertySource;
}
public void setPropertySource(Resource propertySource) {
this.propertySource = propertySource;
}
public JedisPoolConfig getPoolConfig() {
return poolConfig;
}
public void setPoolConfig(JedisPoolConfig poolConfig) {
this.poolConfig = poolConfig;
}
public String getRedisNodePrefix() {
return redisNodePrefix;
}
public void setRedisNodePrefix(String redisNodePrefix) {
this.redisNodePrefix = redisNodePrefix;
}
}
(3)配置xml文件,将工厂对象交给Spring管理
<!-- jedis 配置-->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" >
<!--最大空闲数-->
<property name="maxIdle" value="${redis.maxIdle}" />
<!--最大建立连接等待时间-->
<property name="maxWaitMillis" value="${redis.maxWait}" />
<!--是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个-->
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
<property name="maxTotal" value="${redis.maxTotal}" />
<property name="minIdle" value="${redis.minIdle}" />
</bean>
<!--通过工厂模式获取数据 -->
<bean id="jedisCluster" class="com.jt.common.factory.JedisClusterFactory">
<!--引入配置文件源文件 -->
<property name="propertySource">
<value>classpath:/property/redis.properties</value>
</property>
<!--引入池配置文件 -->
<property name="poolConfig" ref="poolConfig"/>
<!--添加配置前缀-->
<property name="redisNodePrefix" value="redis.cluster"/>
</bean>