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集群插件的更多相关文章

  1. redis cluster集群中键的分布算法

    Redis Cluster Redis Cluster是Redis的作者 Antirez 提供的 Redis 集群方案 —— 官方多机部署方案,每组Redis Cluster是由多个Redis实例组成 ...

  2. Redis Cluster集群搭建与配置

    Redis Cluster是一种服务器sharding分片技术,关于Redis的集群方案应该怎么做,请参考我的另一篇博客http://www.cnblogs.com/xckk/p/6134655.ht ...

  3. jedis处理redis cluster集群的密码问题

    环境介绍:jedis:2.8.0 redis版本:3.2 首先说一下redis集群的方式,一种是cluster的 一种是sentinel的,cluster的是redis 3.0之后出来新的集群方式 本 ...

  4. 深入分析redis cluster 集群

    深入分析redis cluster 集群安装配置详解 下面小编来为各位介绍一篇深入分析redis cluster 集群安装配置详解,如果你希望做数据库集群就可以来看看此文章的哦. http://rub ...

  5. Redis Cluster集群搭建与应用

    1.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper,但从redis 3.0之后版本支持redis-cluster集群,redis-cluster采用无中心结 ...

  6. Redis Cluster集群主从方案

    本文介绍一种通过Jedis和Cluster实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.8.0(推荐),Redis3.0及以上版本(强制). 附:Redis Cluster集群主 ...

  7. CentOS7 安装Redis Cluster集群

    上一篇中已经讲到了如何安装单击版Redis,这一篇我们来说下如何安装Cluster,关于哨兵模式这里我就不写文章安装了,有兴趣的同学可以自己去研究,哨兵模式可以在主从模式下在创建三台机器的哨兵集群监控 ...

  8. Redis Cluster集群架构实现(四)--技术流ken

    Redis集群简介 通过前面三篇博客的介绍<Redis基础认识及常用命令使用(一)--技术流ken>,<Redis基础知识补充及持久化.备份介绍(二)--技术流ken>,< ...

  9. 【精】搭建redis cluster集群,JedisCluster带密码访问【解决当中各种坑】!

    转: [精]搭建redis cluster集群,JedisCluster带密码访问[解决当中各种坑]! 2017年05月09日 00:13:18 冉椿林博客 阅读数:18208  版权声明:本文为博主 ...

随机推荐

  1. 简单的横向ListView实现(version 4.0)

    这个版本号的博客写起来颇费口舌.有些代码自己语言组织能力有限,感觉描写叙述起来非常费劲,前前后后改了五六遍稿子还是不尽人意 ,只是我还是坚持写出来自己当初的思路,假设看得不明确的地方我在文章最后仍然会 ...

  2. Xcode6:No architectures to compile for(ONLY_ACTIVE_ARCH=YES...)

    1.问题描写叙述 Xcode6真机測试旧project,不能执行,报错例如以下: 2.解决方式 问题非常明显,当前的执行模式设置了ONLY_ACTIVE_ARCH为Yes,当时的project的Val ...

  3. 1.1 Introduction中 Apache Kafka™ is a distributed streaming platform. What exactly does that mean?(官网剖析)(博主推荐)

    不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Apache Kafka™ is a distributed streaming p ...

  4. NAACL 2013 Paper Mining User Relations from Online Discussions using Sentiment Analysis and PMF

    中文简单介绍:本文对怎样基于情感分析和概率矩阵分解从网络论坛讨论中挖掘用户关系进行了深入研究. 论文出处:NAACL'13. 英文摘要: Advances in sentiment analysis ...

  5. arduino串口输出问题

  6. (转)oracle常用的数据字典

    一.oracle数据字典主要由以下几种视图构成: .user视图 以user_为前缀,用来记录用户对象的信息 .all视图 以all_为前缀,用来记录用户对象的信息及被授权访问的对象信息 .dba视图 ...

  7. vc6.0 点编译时提示Cannot complile the file &#39;D:\souce-code\vc-workspace\对话框\MainFrm.h&#39;; no compile tool is

    问题描写叙述: vc6.0程序,点击编译时提示对话框,内容为: Cannot complile the file 'D:\souce-code\vc-workspace\对话框\MainFrm.h'; ...

  8. ZOJ 2770 Burn the Linked Camp 差分约束 ZOJ排名第一~

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1770 题目大意: 陆逊为了火烧连营七百里,派出了间谍刺探敌情,得之刘备的军营以 ...

  9. cocos2d-x 3.0 android mk文件 之 自己主动遍历*.cpp文件

    还记得上一篇android mk 文件的写法吗?传送门, 我们须要手动去加入 cpp文件.假设cpp一多,那不是要累死? LOCAL_PATH := $(call my-dir) include $( ...

  10. js实现点击不同的按钮后各自返回被点击的次数

    js实现点击不同的按钮后各自返回被点击的次数 一.总结 1.注意:返回的不是三个按钮总的点击数,而是每一个的 2.用全局变量的话每一个按钮要多一个函数,用闭包就很方便 二.js实现点击不同的按钮后各自 ...