JFinal 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 cluster集群中键的分布算法
Redis Cluster Redis Cluster是Redis的作者 Antirez 提供的 Redis 集群方案 —— 官方多机部署方案,每组Redis Cluster是由多个Redis实例组成 ...
- Redis Cluster集群搭建与配置
Redis Cluster是一种服务器sharding分片技术,关于Redis的集群方案应该怎么做,请参考我的另一篇博客http://www.cnblogs.com/xckk/p/6134655.ht ...
- jedis处理redis cluster集群的密码问题
环境介绍:jedis:2.8.0 redis版本:3.2 首先说一下redis集群的方式,一种是cluster的 一种是sentinel的,cluster的是redis 3.0之后出来新的集群方式 本 ...
- 深入分析redis cluster 集群
深入分析redis cluster 集群安装配置详解 下面小编来为各位介绍一篇深入分析redis cluster 集群安装配置详解,如果你希望做数据库集群就可以来看看此文章的哦. http://rub ...
- Redis Cluster集群搭建与应用
1.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper,但从redis 3.0之后版本支持redis-cluster集群,redis-cluster采用无中心结 ...
- Redis Cluster集群主从方案
本文介绍一种通过Jedis和Cluster实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.8.0(推荐),Redis3.0及以上版本(强制). 附:Redis Cluster集群主 ...
- CentOS7 安装Redis Cluster集群
上一篇中已经讲到了如何安装单击版Redis,这一篇我们来说下如何安装Cluster,关于哨兵模式这里我就不写文章安装了,有兴趣的同学可以自己去研究,哨兵模式可以在主从模式下在创建三台机器的哨兵集群监控 ...
- Redis Cluster集群架构实现(四)--技术流ken
Redis集群简介 通过前面三篇博客的介绍<Redis基础认识及常用命令使用(一)--技术流ken>,<Redis基础知识补充及持久化.备份介绍(二)--技术流ken>,< ...
- 【精】搭建redis cluster集群,JedisCluster带密码访问【解决当中各种坑】!
转: [精]搭建redis cluster集群,JedisCluster带密码访问[解决当中各种坑]! 2017年05月09日 00:13:18 冉椿林博客 阅读数:18208 版权声明:本文为博主 ...
随机推荐
- 洛谷——P1540 机器翻译
https://www.luogu.org/problem/show?pid=1540#sub 题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的 ...
- 让我们彻底看清MVC、MVP
这里開始记录下来自己对MVC.MVP.MVVM这三种框架模式的理解,本文从以下几个方面来梳理. 架构的目的 框架模式.设计模式 MVC设计的介绍 MVC在Android中的应用 MVC该怎样设计 MV ...
- 感谢党,软考过了。系统集成项目管理project师
人品爆发了,刚用干巴巴的日语做完2小时的设计说明,回到家一查,人品爆发了.软考竟然过了. 绝对是评卷老师给人品啊!真想请他吃顿饭. 系统集成项目管理project师 64 53 幸运飞过! 今天真是 ...
- JS contcat() 连接数组 函数
语法: arrayObject.concat(arrayX,arrayX,......,arrayX) 1.把元素添加到数组中 arr.concat(a,b,c);2.把数组连起来 arr.conca ...
- 使用node.js+babel,支持import/export语法
如果要在node里面支持import/export default语法步骤: 1.使用npm安装 babel的客户端工具 npm init 会生成package.json文件 2.接着安装bebel客 ...
- 洛谷——P2515 [HAOI2010]软件安装
https://www.luogu.org/problem/show?pid=2515#sub 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中 ...
- amazeui学习笔记--css(基本样式3)--文字排版Typography
amazeui学习笔记--css(基本样式3)--文字排版Typography 一.总结 1.字体:amaze默认非 衬线字体(sans-serif) 2.引用块blockquote和定义列表:引用块 ...
- Ubuntu 14.04安装teamviewer 远程桌面
teamviewer 真是一款非常强大的远程登录软件,可以跨Windows和Ubuntu远程登录,但是在64bit的Ubuntu下安装时,按照官方安装方法总是会遇到问题,下面说一下如何安装: 安装i3 ...
- 折叠table中的tr
code <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- iOS图片加载-SDWebImage
一.SDWebImage内部实现过程 1, 入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWeb ...