JFinal redis cluster集群插件

Posted llguanli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>


插件地址:点击打开链接











以上是关于JFinal redis cluster集群插件的主要内容,如果未能解决你的问题,请参考以下文章

redis集群与分片-Redis Cluster集群的搭建与实践

Redis Cluster集群

redis cluster集群理解

Redis集群Cluster集群

redis cluster 集群搭建

redis cluster集群选主