`
phipray
  • 浏览: 65805 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Redis 3.0.2高可用集群(下)------ Jedis-Cluster

 
阅读更多

         Jedis的github链接https://github.com/xetorthio/jedis,请下载Master分支。

          目前Jedis最新稳定版本是2.7.2,但并未合并诸如BinaryJedisCluster(提供持久化Java对象操作)等类,而最新的2.7.3主要是fix spring-data-redis在整合2.7.2的抛异常问题,Jedis-Cluster方面还在观察中,所以想要获得对Cluster操作更多更齐全的api就要稍微冒点风险下载Master分支,即Jedis-3.0-snapshot。

 

package com.csair.dean;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashSet;
import java.util.Set;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;


public class PlayJedis {

	public static void main(String[] args) {
		
		Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
		//Jedis Cluster will attempt to discover cluster nodes automatically
		jedisClusterNodes.add(new HostAndPort("10.92.21.17", 6379));
		jedisClusterNodes.add(new HostAndPort("10.92.21.17", 7379));
		jedisClusterNodes.add(new HostAndPort("10.92.21.17", 8379));
		jedisClusterNodes.add(new HostAndPort("10.92.21.18", 6380));
		jedisClusterNodes.add(new HostAndPort("10.92.21.18", 7380));
		jedisClusterNodes.add(new HostAndPort("10.92.21.18", 8380));		
		JedisCluster jc = new JedisCluster(jedisClusterNodes);
		
		jc.set("foo", "bar");//不设置超时
		jc.setex("foo",1800, "bar");//设置1800s超时
		
		
		Person p = new Person();
		p.setName("DeanPhipray");
		p.setGender("M");
		p.setAge(30);
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try{
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(p);
            oos.flush();
       
	    jc.set("fooMap".getBytes(), baos.toByteArray());
	    jc.setex("fooMap".getBytes(), 1800, baos.toByteArray());
		
	    String value = jc.get("foo");
	    System.out.println("foo=========="+ value);
	
	    ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(jc.get("fooMap".getBytes())));
	    Person  pr = (Person) in.readObject(); 
		
	    System.out.println("再次为人"+ pr.getName()+"+++"+pr.getGender()+"+++"+pr.getAge());
		
	} catch (Exception e) {
			 //do something   
			e.printStackTrace();
	} 
		
		
		
    }
	
	
}

 运行结果:

foo==========bar
再次为人DeanPhipray+++M+++30

 

---------------------------------------------------------------------------------------------------------------------------------

跟spring整合

spring-redis.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd">
	
	<!-- jedis configuration starts -->
	<bean id="config" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
		<property name="maxTotal" value="200"></property>
		<property name="maxIdle" value="50"></property>
		<property name="minIdle" value="10"></property>
		<property name="maxWaitMillis" value="15000"></property>
		<property name="lifo" value="true"></property>
		<property name="blockWhenExhausted" value="true"></property>
		<property name="testOnBorrow" value="false"></property>
		<property name="testOnReturn" value="false"></property>
		<property name="testWhileIdle" value="true"></property>
		<property name="timeBetweenEvictionRunsMillis" value="30000"></property>
	</bean>
	
	<bean id="jedisCluster" class="com.csair.csmbp.utiltool.redis.JedisClusterFactory">  
	    <property name="addressConfig">  
	        <value>classpath:redis-servers.properties</value>  
	    </property>  
	    <property name="addressKeyPrefix" value="address" /> 	      
	    <property name="timeout" value="300000" />  
	    <property name="maxRedirections" value="6" />  
	    <property name="config" ref="config" />  
	</bean>  
	
	
	
	<bean id="jedisClusterHelper" class="com.csair.csmbp.utiltool.redis.JedisClusterHelper">		
		<constructor-arg index="0" name="jedisCluster" type="redis.clients.jedis.JedisCluster"
			ref="jedisCluster" />	
		 <property name="timeOut" value="1800" />
	</bean>
	
	
	<!-- jedis configuration ends -->
	
</beans>
 

 

pom.xml 片段

 

。。。。。。。。

<mvn.redis.server1>10.92.21.17:6379</mvn.redis.server1>
<mvn.redis.server2>10.92.21.17:7379</mvn.redis.server2>
<mvn.redis.server3>10.92.21.17:8379</mvn.redis.server3>
<mvn.redis.server4>10.92.21.18:6380</mvn.redis.server4>
<mvn.redis.server5>10.92.21.18:7380</mvn.redis.server5>
<mvn.redis.server6>10.92.21.18:8380</mvn.redis.server6>	

。。。。。。。。。。。
 

 

redis-server.properties

 

address1=${mvn.redis.server1}
address2=${mvn.redis.server2}
address3=${mvn.redis.server3}
address4=${mvn.redis.server4}
address5=${mvn.redis.server5}
address6=${mvn.redis.server6}
 

 

JedisClusterFactory

 

 

package com.csair.csmbp.utiltool.redis;

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.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 final Logger logger = LoggerFactory.getLogger(getClass());	
	private Resource addressConfig;  
    private String addressKeyPrefix ;    
    private JedisCluster jedisCluster;  
    private Integer timeout;  
    private Integer maxRedirections;  
    private GenericObjectPoolConfig config;       
    private Pattern p = Pattern.compile("^.+[:]\\d{1,5}\\s*$");  	
	
	@Override
	public void afterPropertiesSet() throws Exception {
		// TODO Auto-generated method stub
		  Set<HostAndPort> haps = this.parseHostAndPort();            
	      jedisCluster = new JedisCluster(haps, timeout, maxRedirections,config);  
	}

	@Override
	public JedisCluster getObject() throws Exception {
		// TODO Auto-generated method stub
		return jedisCluster;
	}

	@Override
	public Class<? extends JedisCluster> getObjectType() {
		// TODO Auto-generated method stub
		return (this.jedisCluster != null ? this.jedisCluster.getClass() : JedisCluster.class);  
	}

	@Override
	public boolean isSingleton() {
		// TODO Auto-generated method stub
		return false;
	}
	
	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 setConfig(GenericObjectPoolConfig config) {  
        this.config = config;  
    }  
	

	 private Set<HostAndPort> parseHostAndPort() throws Exception { 
		 	Set<HostAndPort> haps = new HashSet<HostAndPort>();
	        try {  
	            Properties prop = new Properties();  
	            prop.load(this.addressConfig.getInputStream());  	              
	            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);  
	            }  
	  
	        } catch (IllegalArgumentException ex) {  
	            throw ex;  	            
	        } catch (Exception ex) {  
	        	logger.error("解析 jedis 配置文件失败",ex);
	            throw new Exception("解析 jedis 配置文件失败", ex); 
	        }finally{
	        	return haps;
	        }  
	    }  
	
}
 

 

 JedisClusterHelper

 

 

package com.csair.csmbp.utiltool.redis;

import org.springframework.util.SerializationUtils;

import redis.clients.jedis.JedisCluster;


public class JedisClusterHelper {
	

	private JedisCluster jedisCluster;
	private int timeOut;
	
	public JedisClusterHelper(JedisCluster jedisCluster){
		this.jedisCluster = jedisCluster;
	}
	
	public void setTimeOut(int timeout) {  
	        this.timeOut = timeout;  
	}  
	
	
	public void saveOrUpdate(String key,Object obj,int timeout) {
		jedisCluster.setex(key.getBytes(), timeout, SerializationUtils.serialize(obj));
		
	}
	
	public void saveOrUpdate(String key,Object obj) {
		jedisCluster.setex(key.getBytes(), this.timeOut , SerializationUtils.serialize(obj));
	}
	
	public void saveOrUpdate(String key,String value,int timeout) {
		jedisCluster.setex(key, timeout, value);
		
	}
	
	public void saveOrUpdate(String key,String value) {		
		jedisCluster.setex(key,this.timeOut , value);
	}
	
	public void incr(String key){
		jedisCluster.incr(key);
	}
	
	public void expire(String key, int unixTime){
		jedisCluster.expire(key, unixTime);
	}
	
	public void setnx(String key, String value){
		jedisCluster.setnx(key, value);
	}
	
	public void hset(String key, String field, String value){
		jedisCluster.hset(key, field, value);
	}
	
	public boolean exists(String key){
		return jedisCluster.exists(key);
	}
	
	public <T> T getValue(String key ,Class<T> clazz){	
		 return (T) SerializationUtils.deserialize(getValue(key.getBytes()));
	}
	
	public byte[] getValue(byte[] key){
		return jedisCluster.get(key);
	}
	
	public String get(String key){		
		return jedisCluster.get(key);		
	}
	
	public boolean del(String key){
		boolean delFlag = false;
		jedisCluster.del(key);
		return delFlag;
	}
	
	
}
 

 

调用示例

 @Autowired
    private JedisClusterHelper jedisHelper;

    jedisHelper.saveOrUpdate(redisKey, obj, EXPIRED_SECOND);

 

 

 

 

分享到:
评论

相关推荐

    03-VIP-Redis缓存高可用集群(预习)1

    【Redis缓存高可用集群】是为了解决单机Redis在面临高并发、大数据量时可能出现的性能瓶颈和单点故障问题。本文将探讨Redis的两种集群方案:哨兵模式和高可用集群模式,以及如何搭建Redis高可用集群。 1. **哨兵...

    PyPI 官网下载 | redis-py-cluster-1.1.0.tar.gz

    《Redis-Py-Cluster:Python中的Redis集群库详解》 Redis-Py-Cluster是一个Python库,专门用于在Python环境中操作Redis分布式集群。该库为开发者提供了便捷的方式与Redis集群进行交互,支持各种数据结构,如字符串...

    redis-cluster redis伪集群文件

    3、./redis-cluster-start-all.sh 开启reids 4、执行 ./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 5、验证集群已经启动 ps -...

    docker-compose redis主从哨兵 redis多节点高可用 redis集群高可用

    这里我们将详细探讨如何利用Docker Compose部署Redis的主从哨兵配置和集群高可用性解决方案。 首先,Docker Compose是一个强大的工具,可以让我们通过YAML文件定义和运行多容器的Docker应用。在这个场景下,我们...

    redis-py-cluster-1.3.5.tar.gz

    而`redis-py-cluster`是Python连接Redis集群的一个库,它允许Python开发者方便地与Redis集群进行交互。`redis-py-cluster-1.3.5.tar.gz`这个压缩包文件包含了该库的源代码和相关资源,版本号为1.3.5。 首先,让我们...

    redis-stack-server 7.2.0 安装包合集

    redis-stack-server-7.2.0-v9.arm64.snap redis-stack-server-7.2.0-v9.bionic.arm64.tar.gz redis-stack-server-7.2.0-v9.bionic.x86_64.tar.gz redis-stack-server-7.2.0-v9.bullseye.x86_64.tar.gz redis-stack-...

    Redis集群管理工具redis-cluster-tool.zip

    redis-cluster-tool 是一个非常便利的 Redis 集群管理工具。help   Usage: redis-cluster-tool [-?hVds] [-v verbosity level] [-o output file] [-c conf file] [-a addr] [-i interval] [-p pid file] [-C ...

    Redis3.0.2 分布式集群安装手册

    Redis Cluster 是 Redis 3.0 引入的一项新功能,它提供了原生的集群能力,使得 Redis 能够更好地支持高并发环境下的数据存储需求。通过 Redis Cluster,用户可以在多个 Redis 实例之间进行数据的分布存储,实现负载...

    tomcat9+tomcat-cluster-redis-session-manager_4.0.zip

    "tomcat9+tomcat-cluster-redis-session-manager_4.0.zip"这个文件组合涉及到的是在Tomcat 9上实现负载均衡以及使用Redis作为Session管理器的高级配置。 首先,Tomcat 9是Apache Tomcat服务器的一个版本,它是Java ...

    redis-6.2.6-x64-windows.zip

    这个"redis-6.2.6-x64-windows.zip"压缩包包含了针对Windows 10和Windows Server 2016等64位操作系统的Redis版本。以下是关于Redis 6.2.6在Windows环境下的详细知识点: 1. **Redis版本**:6.2.6是Redis的一个稳定...

    redis-2.21-win32-win64

    这个名为 "redis-2.21-win32-win64" 的压缩包包含了 Redis 在 Windows 平台上的二进制版本,适用于 32 位和 64 位操作系统。下面将详细介绍 Redis 的基本概念、功能以及与Windows相关的安装和配置。 1. **Redis的...

    redis-7.2-x64-for-windows-bin.zip

    这个压缩包"redis-7.2-x64-for-windows-bin.zip"是Redis 7.2版本的64位Windows构建,包含了运行Redis服务所需的所有组件。 1. **Redis 7.2**: Redis是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和...

    redis集群以及Spring-data-redis操作集群

    3. **创建集群**:使用`redis-trib.rb`工具(在Redis源码包的`utils`目录下)将这些节点连接起来,创建并初始化集群。 4. **分配槽**:Redis集群通过槽(Slot)来管理数据分布,共有16384个槽,每个键根据哈希值被...

    jedis-2.9.0 最新版Redis客户端CSDN下载

    - 集群支持:Jedis 2.9.0版本已经支持Redis集群,可以方便地在多个节点间进行数据操作。 - 分布式锁:提供基于Redis的分布式锁实现,可以跨服务进行资源锁定。 - 事件监听:允许注册监听器,监听Redis中的某些事件,...

    Redis-x64-7.0.5-windows11

    在Windows 11环境下,安装和配置Redis-x64-7.0.5-dragon需要注意以下几点: 1. **编译环境**:由于Redis原生为Linux系统设计,所以在Windows上需要安装交叉编译工具,如msys2和mingw-w64,才能进行编译。 2. **下载...

    redis校验工具redis-full-check

    `redis-full-check` 正是这样一款针对 Redis 的专业校验工具,它能够帮助管理员检测 Redis 集群或单实例的潜在问题,保障系统的正常运行。 `redis-full-check` 工具主要功能包括但不限于以下几个方面: 1. **键...

    Redis-Cluster集群模式部署

    Redis Cluster 是 Redis 的一个高可用解决方案,通过将多个 Redis 节点组合成集群,提高 Redis 的可用性和性能。 环境准备 在开始部署 Redis Cluster 之前,需要准备 3 台服务器,每台服务器上需要安装 Redis ...

    redis-py-cluster-1.3.6.tar.gz

    此外,`redis-py-cluster`还有自动故障转移的功能,当某个节点出现故障时,它会自动重定向到其他可用节点,保证了服务的高可用性。 总结起来,`redis-py-cluster-1.3.6`是一个强大的Python库,专门用于处理Redis...

    redis缓存需要的jar commons-pool.jar jedis-1.5.2.jar

    Redis是一种高性能的键值对数据存储系统,常用于构建分布式缓存、数据库或者消息中间件。在Java开发中,为了与Redis进行交互,通常需要引入相关的Java库,如`commons-pool.jar`和`jedis-1.5.2.jar`。 `commons-pool...

    RedisDesktopManager0.9.5-windows-X64,支持集群

    直接解压即可使用,亲测可用! 对比0.8.8等老版本,本版本支持redis集群!! 0.9.4版本开始官方不再提供Windows安装文件的免费下载。 官方更新0.9.5版本,, Windows10亲测可用。

Global site tag (gtag.js) - Google Analytics