Spring整合Redis集群

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值