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集群插件的主要内容,如果未能解决你的问题,请参考以下文章