zoukankan      html  css  js  c++  java
  • JFinal redis cluster集群插件

    JFinal 框架到了2.1版本,但是依然只支持redis的主从集群,没有看到Cluster集群的插件,笔者照着主从的插件方式,改了改,实现了个简单的插件,先使用起来,后续会更新完善版本。

    插件地址:点击打开链接
     

    package com.sxt.jfinal.rediscluster;
     
    import java.util.Set;
     
    import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
     
    import redis.clients.jedis.HostAndPort;
    import redis.clients.jedis.JedisCluster;
     
    import com.jfinal.kit.StrKit;
    import com.jfinal.plugin.IPlugin;
     
    /**
     * 为JFinal框架下的 redis cluster集群提供插件方案
     *  
     * JFinal版本 2.1
     * Jedis版本 2.7.2
     * commons-pools版本2.3
     * 
     * 注意:
     * 需要如下包才可以正常使用
     * jedis-2.7.2.jar
     * commons-pool2-2.3.jar
     * 
     * @author 石啸天
     *
     */
    public class RedisClusterPlugin implements IPlugin{
     
    	// 集群名称
    	String clusterName = null;
    	
    	// 集群对象
    	JedisCluster jedisCluster = null;
    	
    	// 超时时间
    	Integer timeout = null;
    	
    	// 连接池
    	GenericObjectPoolConfig poolConfig = null;
    	
    	// 最多重定向次数
    	Integer maxRedirections = null;
    	
    	// 集群地址集合
    	Set<HostAndPort> redisClusterNodes;
    	
    	/**
    	 * 
    	 * 传入集群信息
    	 *
    	 * @param clusterName 集群名称
    	 * @param redisClusterNodes 集群地址集合
    	 * 
    	 */
    	public RedisClusterPlugin(String clusterName, Set<HostAndPort> redisClusterNodes) {
    		
    		// 检查数据
    		this.isRightHostAndPortSet(clusterName, redisClusterNodes);
    		
    		// 绑定集群名称
    		this.clusterName = clusterName;
    		
    		// 绑定地址集合
    		this.redisClusterNodes = redisClusterNodes;
    		
    	}
    	
    	/**
    	 * 
    	 * 传入集群信息
    	 * 
    	 * @param clusterName 集群名称
    	 * @param redisClusterNodes 集群地址集合
    	 * @param timeout 超时时间
    	 * 
    	 */
    	public RedisClusterPlugin(String clusterName, Set<HostAndPort> redisClusterNodes, Integer timeout) {
    		
    		// 复用传入集群方法
    		this(clusterName, redisClusterNodes);
    		
    		// 超时时间绑定
    		this.timeout = timeout;
    		
    	}
    	
    	/**
    	 * 
    	 * 传入集群信息
    	 * 
    	 * @param clusterName 集群名称
    	 * @param redisClusterNodes 集群地址集合
    	 * @param  poolConfig 连接池对象
    	 * 
    	 */
    	public RedisClusterPlugin(String clusterName, Set<HostAndPort> redisClusterNodes, GenericObjectPoolConfig poolConfig) {
    		
    		// 复用传入集群方法
    		this(clusterName, redisClusterNodes);
    		
    		// 连接池绑定
    		this.poolConfig = poolConfig;
    		
    	}
    	
    	/**
    	 * 
    	 * 传入集群信息
    	 * 
    	 * @param clusterName 集群名称
    	 * @param redisClusterNodes 集群地址集合
    	 * @param timeout 超时时间
    	 * @param poolConfig 连接池配置
    	 * 
    	 */
    	public RedisClusterPlugin(String clusterName, Set<HostAndPort> redisClusterNodes, Integer timeout, GenericObjectPoolConfig poolConfig) {
    		
    		// 复用传入集群方法
    		this(clusterName, redisClusterNodes, timeout);
    		
    		// 连接池绑定
    		this.poolConfig = poolConfig;
    		
    	}
    	
    	/**
    	 * 
    	 * 传入集群信息
    	 * 
    	 * @param clusterName 集群名称
    	 * @param redisClusterNodes 集群地址集合
    	 * @param  poolConfig 连接池对象
    	 * 
    	 */
    	public RedisClusterPlugin(String clusterName, Set<HostAndPort> redisClusterNodes, Integer timeout, Integer maxRedirections) {
    		
    		// 复用传入集群方法
    		this(clusterName, redisClusterNodes, timeout);
    		
    		// 连接池绑定
    		this.maxRedirections = maxRedirections;
    		
    	}
    	
    	/**
    	 * 
    	 * 传入集群信息
    	 * 
    	 * @param clusterName 集群名称
    	 * @param redisClusterNodes 集群地址集合
    	 * @param  poolConfig 连接池对象
    	 * 
    	 */
    	public RedisClusterPlugin(String clusterName, Set<HostAndPort> redisClusterNodes, Integer timeout, Integer maxRedirections, GenericObjectPoolConfig poolConfig) {
    		
    		// 复用传入集群方法
    		this(clusterName, redisClusterNodes, timeout, maxRedirections);
    		
    		// 连接池绑定
    		this.poolConfig = poolConfig;
    		
    	}
    	
    	@Override
    	public boolean start() {
    		
    		if(timeout != null && maxRedirections != null && poolConfig != null) {
    			jedisCluster = new JedisCluster(redisClusterNodes, timeout, maxRedirections, poolConfig);
    		} else if(timeout != null && maxRedirections != null) {
    			jedisCluster = new JedisCluster(redisClusterNodes, timeout, maxRedirections);
    		} else if(timeout != null && poolConfig != null) {
    			jedisCluster = new JedisCluster(redisClusterNodes, timeout, poolConfig);
    		} else if(timeout != null) {
    			jedisCluster = new JedisCluster(redisClusterNodes, timeout);
    		} else if(poolConfig != null){
    			jedisCluster = new JedisCluster(redisClusterNodes, poolConfig);
    		} else {
    			jedisCluster = new JedisCluster(redisClusterNodes);
    		}
    		
    		// 加入集群集合
    		RedisCluster.addCache(clusterName, jedisCluster);
    		
    		return true;
    	}
     
    	@Override
    	public boolean stop() {
    		
    		// 清除出集群集合
    		JedisCluster removeRedisCluster = RedisCluster.removeCache(clusterName);
    		
    		// 关闭集群链接
    		removeRedisCluster.close();
    		
    		return false;
    		
    	}
     
    	// 判断传入的集群位置资料是否正确
    	private void isRightHostAndPortSet(String clusterName, Set<HostAndPort> redisClusterNodes) {
    		
    		// 集群名称不能为空
    		if (StrKit.isBlank(clusterName)) {
    			throw new IllegalArgumentException("clusterName can not be blank.");
    		}
    		
    		// 检查集群具体地址和端口号是否正常
    		if(redisClusterNodes != null && redisClusterNodes.size()>0) {
    			for(HostAndPort hap : redisClusterNodes) {
    				
    				// 获取主机ip
    				String host = hap.getHost();
    				
    				// 空字符串
    				if (StrKit.isBlank(host)) {
    					throw new IllegalArgumentException("host can not be blank.");
    				}
    				
    				// 获取端口
    				Integer port = hap.getPort();
    				
    				// 空端口数据
    				if(port == null) {
    					throw new IllegalArgumentException("port can not be blank.");
    				}
    				
    			}
    		} else {
    			
    			// 集群集合数据为空
    			throw new IllegalArgumentException("redisClusterNodes can not be blank.");
    			
    		}
    	
    	}
     
    }
    

    插件地址:点击打开链接

  • 相关阅读:
    ARTS 计划第四周
    ARTS 计划第三周周
    计划表的科学设定
    C/C++内存分配
    ARTS 计划第二周周
    jsoncpp 和 libcurl的编译与使用 vs2010
    ARTS 计划第一周
    unix中的v节点和i节点
    百度地图demo
    带有定位当前位置的百度地图web api 前端代码
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13317496.html
Copyright © 2011-2022 走看看