`
xyqck163
  • 浏览: 106785 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

spring集成 JedisCluster 连接 redis3.0 集群

阅读更多

最近在公司做了 jedisCluster整合spring 的配置, 分享如下

 

客户端采用最新的jedis 2.7

1.

maven依赖:

<dependency>

<groupId>redis.clients</groupId>

<artifactId>jedis</artifactId>

<version>2.7.2</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类:

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;

 

 

分享到:
评论
8 楼 happy366day 2017-09-14  
如果redis集群设置了密码呢?
7 楼 映像云 2016-08-19  
你好,请问一下,我集群配置好了,也连接上了,但是数据返回比较慢,一个操作需要5s,遇到过这种情况吗  能帮忙回答一下吗 谢谢
6 楼 tengyizu 2016-04-08  
有没有遇到连接池没有释放的问题?
5 楼 Dear疼你 2016-01-18  
引用
引用
引用
引用
引用
引用
引用
" target="_blank">" />" target="_blank">" wmode="" quality="high" menu="false" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="200" height="200">
4 楼 Dear疼你 2016-01-18  
北域游龙 写道
配置完报错:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: redis.clients.jedis.JedisCluster com.showersx.test.controller.TestController.jedisCluster; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [redis.clients.jedis.JedisCluster] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
... 29 more

你报错是因为你没注入
3 楼 北域游龙 2015-07-07  
配置完报错:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: redis.clients.jedis.JedisCluster com.showersx.test.controller.TestController.jedisCluster; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [redis.clients.jedis.JedisCluster] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
... 29 more
2 楼 xyqck163 2015-07-07  
都配置上不报错
1 楼 qingfeng197 2015-06-08  
你这个配置启动的时候不报错?

相关推荐

    redis3.0安装包 window 64位

    (4)集群:Redis 3.0支持集群,可以将多个Redis实例拼接成一个集群,并实现负载均衡,提高Redis的可用性。 3、总结: Redis 3.0是一款高性能的开源内存数据库,它拥有非常快速的读写性能,几乎是传统数据库的1000倍...

    redis3.0widows集群+spring整合jedis

    redis3.0 widows集群 spring整合jedis redis搭建window集群代码和文档rubygems-2.5.1和rubyinstaller-2.2.3-x64软件下载

    redis3.0.集群环境安装手册

    Redis 3.0 集群环境安装手册 Redis 3.0 集群环境安装手册是指在 Linux 操作系统中安装和配置 Redis 3.0 集群的步骤指南。Redis 是一个开源、基于内存的数据结构存储系统,可以用作数据库、消息队列、缓存层等。 ...

    redis 3.0 集群指南

    ### Redis 3.0 集群指南 #### 一、Redis 3.0 的安装与配置 **安装步骤:** 在安装 Redis 3.0 之前,首先确保已安装了必要的依赖包,如 cpp、binutils、glibc 等。通过 `yum` 命令安装这些依赖: ```bash yum -y ...

    redis3.0-集群部署文档

    cp /usr/local/redis3.0/redis.conf /usr/local/cluster/ vi redis.conf ``` - 修改以下配置项: - `port`: 设置为节点对应的端口号(例如7000) - `daemonize yes`: 后台运行 - `cluster-enabled yes`: 开启...

    springcloud部署redis集群

    为了监控Redis集群的状态,可以使用`JedisCluster`或`LettuceClientResources`提供的方法获取节点信息。同时,定期检查节点的健康状况和复制状态,确保数据的一致性和完整性。 总的来说,部署SpringCloud中的Redis...

    redis最新3.0版本

    5. **Cluster改进**: Redis Cluster在3.0版本中得到了进一步优化,增加了更多的自动故障转移功能,使得分布式部署更加稳定。此外,槽的迁移过程也更加平滑,减少了服务中断的时间。 6. **Bits per value (Bitmaps)*...

    Redis3.0集群代理系统源码

    Redis3.0集群代理系统, 并发接收客户端请求,计算Key的哈希槽值,转发到对应的缓存服务器,并将缓存服务器的返回值回传给客户端, 这样客户端只要访问集群代理系统,实现一次性定位访问,效率与单台缓存服务器...

    spring4.0结合redis3.0

    当我们谈论"spring4.0结合redis3.0"时,主要涉及到如何在Spring 4.0版本的应用中集成并利用Redis 3.0的功能。 首先,集成Spring与Redis的关键在于`spring-data-redis`模块,它为Spring应用提供了操作Redis的高级...

    redis 3.0 win7 32位x86

    虽然Redis 3.0不支持集群功能,但在更高版本中,Redis引入了集群方案,允许在多台服务器之间分散数据,提高可用性和容量。若需要扩展,可以考虑升级到更高版本或使用哨兵(Sentinel)系统实现高可用性。 综上所述,...

    redis3.0 demo

    通过这个“redis3.0 demo”,我们可以学习如何配置和使用Redis集群,如何编写和执行LUA脚本,以及如何利用其他新特性来优化应用性能。同时,它也将演示如何处理复制、连接管理和安全性等核心问题。通过实践,你可以...

    redis3.0集群安装

    最后,可以使用`redis-cli`工具连接到集群中的任一节点,并使用`cluster nodes`命令来查看当前集群的状态和节点信息。 ```bash ./redis-cli -h 192.168.118.136 -p 7001 192.168.118.136:7001&gt; cluster nodes ``` ...

    Redis3.0集群与应用.zip

    Redis 3.0 集群与应用是关于如何配置、管理和使用Redis分布式数据库系统的一个教程,旨在提供简单明了的指导。Redis是一款高性能的键值存储服务,常用于数据库缓存、消息队列等场景。在3.0版本中,引入了集群功能,...

    redis集群批量插入

    Java客户端库如JedisCluster或Lettuce提供了连接和操作Redis集群的API。 批量插入String类型数据时,通常使用`JedisCluster`类中的`mset`方法。这个方法允许一次性设置多个键值对,但需要注意的是,由于Redis集群的...

    redis3.0-window免安装

    本资源“redis3.0-window免安装”是专门为Windows操作系统设计的Redis 3.0版本,旨在简化在Windows平台上的部署和使用流程。 Redis 3.0是一个重要的版本,它引入了多项新特性和改进,包括但不限于: 1. **多线程...

    nodejs-redis-cluster:redis3.0的nodejs扩展,支持集群

    redis3.0 的 nodejs 扩展,支持基于 nodejs npm redis url 的集群: : 更改日志 当我们向 redis 集群的一个节点发送命令时,我们可能会收到类似“ERR: MOVED 111 127.0.0.1:6379”的返回错误。 这不是错误,而是...

    redis windows安装包 3.0.503

    本文将详细讲解如何在Windows环境下安装Redis 3.0.503版本,以及安装过程中可能遇到的问题和解决方法。 首先,Redis 3.0.503是Redis的一个较早版本,但在当时已经具备了稳定性和高效性。在安装前,确保你的系统满足...

    redis3.0-windows

    这个"redis3.0-windows"压缩包文件显然包含了Redis 3.0版本的Windows兼容版本,允许用户在Windows操作系统上运行和管理Redis实例。 Redis的核心特性包括: 1. **键值存储**:Redis的基础是键值对存储,它允许存储...

Global site tag (gtag.js) - Google Analytics