1. 程式人生 > >JFinal redis cluster集群插件

JFinal redis cluster集群插件

ext 註意 param nal system static private rim spa

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>


插件地址:點擊打開鏈接

JFinal redis cluster集群插件