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

    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.");
    			
    		}
    	
    	}
    
    }
    


    package com.sxt.jfinal.rediscluster;
    
    import java.util.concurrent.ConcurrentHashMap;
    
    import redis.clients.jedis.JedisCluster;
    
    import com.jfinal.kit.StrKit;
    
    /**
     * redis cluster 工具类
     * 
     * @author 石啸天
     *
     */
    public class RedisCluster {
    
    	// 主集群缓存
    	static JedisCluster mainCache = null;
    	
    	// 集群缓存集合
    	private static final ConcurrentHashMap<String, JedisCluster> cacheMap = new ConcurrentHashMap<String, JedisCluster>();
    	
    	/**
    	 * 插入新集群缓存
    	 * 
    	 * @param cacheName 集群缓存名称
    	 * 
    	 * @param cache 集群缓存
    	 */
    	public static void addCache(String cacheName, JedisCluster cache) {
    		
    		if (cache == null)
    			throw new IllegalArgumentException("cache can not be null");
    		if (cacheMap.containsKey(cacheName))
    			throw new IllegalArgumentException("The cache name already exists");
    		
    		cacheMap.put(cacheName, cache);
    		if (mainCache == null)
    			mainCache = cache;
    		
    	}
    	
    	/**
    	 * 
    	 * 删除集群缓存
    	 * 
    	 * @param cacheName 集群缓存名称
    	 * 
    	 * @return JedisCluster 
    	 * 
    	 */
    	public static JedisCluster removeCache(String cacheName) {
    		
    		return cacheMap.remove(cacheName);
    		
    	}
    	
    	/**
    	 * 提供一个设置设置主集群缓存 mainCache 的机会,否则第一个被初始化的 Cache 将成为 mainCache
    	 */
    	public static void setMainCache(String cacheName) {
    		
    		if (StrKit.isBlank(cacheName))
    			throw new IllegalArgumentException("cacheName can not be blank");
    		cacheName = cacheName.trim();
    		JedisCluster cache = cacheMap.get(cacheName);
    		if (cache == null)
    			throw new IllegalArgumentException("the cache not exists: " + cacheName);
    		
    		RedisCluster.mainCache = cache;
    		
    	}
    	
    	/**
    	 * 
    	 * 使用主集群缓存
    	 * 
    	 * @return JedisCluster
    	 */
    	public static JedisCluster use() {
    		return mainCache;
    	}
    	
    	/**
    	 * 
    	 * 使用指定名称集群缓存
    	 * 
    	 * @param cacheName 集群缓存名称
    	 * 
    	 * @return JedisCluster
    	 */
    	public static JedisCluster use(String cacheName) {
    		return cacheMap.get(cacheName);
    	}
    	
    }
    

    JFinal插件加载方式:
           /**
    	 * 配置插件
    	 */
    	public void configPlugin(Plugins me) {
    				
                  // redis cluster集群节点
                  Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
                  jedisClusterNodes.add(new HostAndPort("192.168.1.200", 7000));  
                  jedisClusterNodes.add(new HostAndPort("192.168.1.200", 7001));  
                  jedisClusterNodes.add(new HostAndPort("192.168.1.200", 7002));
    	    
                  // 创建插件对象
                  RedisClusterPlugin redisClusterPlugin = new RedisClusterPlugin("sxt", jedisClusterNodes);
    	    
                  // 加载插件
                  me.add(redisClusterPlugin);
    	    
    	}

    使用方式:
    // 获取redis使用对象
    JedisCluster redis = RedisCluster.use("sxt");
    // 设置值
    redis.set("f", "起飞");
    // 获取值
    String result = redis.get("f");
    // 输出
    System.out.println(result);</span>


    插件地址:点击打开链接

  • 相关阅读:
    BOM
    定位
    浮动
    行内元素和块级元素
    Java SE之正则表达式五:切割
    Java SE之正则表达式四:获取
    Java SE之正则表达式三:替换
    Java SE之正则表达式二:匹配
    Java SE之正则表达式一:概述
    [C++]PAT乙级1012.数字分类 (20/20)
  • 原文地址:https://www.cnblogs.com/llguanli/p/7295923.html
Copyright © 2011-2022 走看看