JFinal redis cluster集群插件
阿新 • • 發佈:2017-08-06
ext 註意 param nal system static private rim spa
JFinal redis cluster集群插件
JFinal 框架到了2.1版本號,可是依舊僅僅支持redis的主從集群,沒有看到Cluster集群的插件。筆者照著主從的插件方式,改了改,實現了個簡單的插件,先使用起來,興許會更新完好版本號。
插件地址:點擊打開鏈接
附上源代碼:
JFinal插件加載方式:
使用方式:
插件地址:點擊打開鏈接
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集群插件