您的位置:首页 > 数据库 > Redis

Springmvc集成redis集群

2017-02-28 00:00 357 查看
摘要: Springmvc集成redis集群

1.maven依赖:

<dependency>

<groupId>redis.clients</groupId>

<artifactId>jedis</artifactId>

<version>2.8.1</version>

</dependency>

2.增加spring 配置

<bean name="genericObjectPoolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig" >

<property name="maxWaitMillis" value="-1" />

<property name="maxTotal" value="1000" />

<property name="minIdle" value="8" />

<property name="maxIdle" value="100" />

</bean>

<bean id="jedisCluster" class="xxx.JedisClusterFactory">

<property name="addressConfig">

<value>classpath:connect-redis.properties</value>

</property>

<property name="addressKeyPrefix" value="address" /> <!-- 属性文件里 key的前缀 -->

<property name="timeout" value="300000" />

<property name="maxRedirections" value="6" />

<property name="genericObjectPoolConfig" ref="genericObjectPoolConfig" />

</bean>

3.增加connect-redis.properties 配置文件

这里配置了6个节点

address1=172.16.23.27:6379

address2=172.16.23.27:6380

address3=172.16.23.27:6381

address4=172.16.23.27:6382

address5=172.16.23.27:6383

address6=172.16.23.27:6384

4.增加java类:

Java代码

import java.util.HashSet;

import java.util.Properties;

import java.util.Set;

import java.util.regex.Pattern;

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

import org.springframework.beans.factory.FactoryBean;

import org.springframework.beans.factory.InitializingBean;

import org.springframework.core.io.Resource;

import redis.clients.jedis.HostAndPort;

import redis.clients.jedis.JedisCluster;

public class JedisClusterFactory implements FactoryBean<JedisCluster>, InitializingBean {

private Resource addressConfig;

private String addressKeyPrefix ;

private JedisCluster jedisCluster;

private Integer timeout;

private Integer maxRedirections;

private GenericObjectPoolConfig genericObjectPoolConfig;

private Pattern p = Pattern.compile("^.+[:]\\d{1,5}\\s*$");

@Override

public JedisCluster getObject() throws Exception {

return jedisCluster;

}

@Override

public Class<? extends JedisCluster> getObjectType() {

return (this.jedisCluster != null ? this.jedisCluster.getClass() : JedisCluster.class);

}

@Override

public boolean isSingleton() {

return true;

}

private Set<HostAndPort> parseHostAndPort() throws Exception {

try {

Properties prop = new Properties();

prop.load(this.addressConfig.getInputStream());

Set<HostAndPort> haps = new HashSet<HostAndPort>();

for (Object key : prop.keySet()) {

if (!((String) key).startsWith(addressKeyPrefix)) {

continue;

}

String val = (String) prop.get(key);

boolean isIpPort = p.matcher(val).matches();

if (!isIpPort) {

throw new IllegalArgumentException("ip 或 port 不合法");

}

String[] ipAndPort = val.split(":");

HostAndPort hap = new HostAndPort(ipAndPort[0], Integer.parseInt(ipAndPort[1]));

haps.add(hap);

}

return haps;

} catch (IllegalArgumentException ex) {

throw ex;

} catch (Exception ex) {

throw new Exception("解析 jedis 配置文件失败", ex);

}

}

@Override

public void afterPropertiesSet() throws Exception {

Set<HostAndPort> haps = this.parseHostAndPort();

jedisCluster = new JedisCluster(haps, timeout, maxRedirections,genericObjectPoolConfig);

}

public void setAddressConfig(Resource addressConfig) {

this.addressConfig = addressConfig;

}

public void setTimeout(int timeout) {

this.timeout = timeout;

}

public void setMaxRedirections(int maxRedirections) {

this.maxRedirections = maxRedirections;

}

public void setAddressKeyPrefix(String addressKeyPrefix) {

this.addressKeyPrefix = addressKeyPrefix;

}

public void setGenericObjectPoolConfig(GenericObjectPoolConfig genericObjectPoolConfig) {

this.genericObjectPoolConfig = genericObjectPoolConfig;

}

}

5.到此配置完成,使用时,直接注入即可, 如下所示:

@Autowired

JedisCluster jedisCluster;

注意:“no reachable node in cluster] with root cause”报错

(1)如果redis集群不是部署在本机,是部署在其它机器或者虚拟机上,一定注意redis.conf配置文件中的bind ip不要使用127.0.0.1,而是改成机器的ip地址,不然将无法访问redis集群,会因为找不到redis集群报这样的错误;

同时防火墙开放端口

$ iptables -I INPUT -p tcp --dport 7000 -j ACCEPT
$ iptables -I INPUT -p tcp --dport 7001 -j ACCEPT
$ iptables -I INPUT -p tcp --dport 7002 -j ACCEPT
$ iptables -I INPUT -p tcp --dport 7003 -j ACCEPT
$ iptables -I INPUT -p tcp --dport 7004 -j ACCEPT
$ iptables -I INPUT -p tcp --dport 7005 -j ACCEPT

(2)查看是否关闭了防火墙,如果没有关闭防火墙,利用如下命令关闭防火墙:

1) 重启后生效
开启: chkconfig iptables on
关闭: chkconfig iptables off

2) 即时生效,重启后失效
开启: service iptables start
关闭: service iptables stop
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  springMvc Redis Cluster