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 版权声明:本文为博主 ...
随机推荐
- Writing buffer overflow exploits - a tutorial for beginners
Buffer overflows in user input dependent buffers have become one of the biggest security hazards on ...
- php函数,static,globalkeyword及三种变量作用域
函数 和js函数相似,关注php与其它语言不用的地方 函数的形參默认值 形式: function f($a,$b=3,$vc = "abc"){ } 注意:没有给默认值的形參必须传 ...
- 学习笔记:Vue——插槽
关于Vue插槽,只用过最简单的语法,现在完整地走一遍官方文档说明,并且探索更多用法. 01.如果组件中没有包含一个<slot>元素,则该组件起始标签和结束标签之间的任何内容都会被抛弃. 0 ...
- ajax实现简单的点击左侧菜单,右侧加载不同网页
实现:ajax实现点击左侧菜单,右侧加载不同网页(在整个页面无刷新的情况下实现右侧局部刷新,用到ajax注意需要在服务器环境下运行,从HBuilder自带的服务器中打开浏览效果即可) 原理:ajax的 ...
- 【Educational Codeforces Round 33 C】 Rumor
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然最后会形成多个集合,每个集合里面的人能够可以互相到达. 则维护并查集的时候,顺便维护一下每个集合里面的最小值就好. 最后答案就为 ...
- How to Rotate Tomcat catalina.out
If catalina.out becomes 2GB in size, tomcat crashes and fails to start without any error message. To ...
- Android 获取联系人手机号码、姓名、地址、公司、邮箱、生日
public void testGetAllContact() throws Throwable { //获取联系人信息的Uri Uri uri = ContactsContract.Contacts ...
- Redo current损坏
如果损坏的是current redo log (select group#,sequence#,archived,status from v$log;) 有两种情况: A. 数据库是正常关闭 ...
- 学习Java必看书籍和步骤
Java语言基础 谈到Java语言基础学习的书籍,大家肯定会推荐Bruce Eckel的<ThinkinginJava>.它是一本写的相当深刻的技术书籍,Java语言基础部分基本没有其它 ...
- Day2:数据类型
一.数字 1.整型(int),无长整型.python3.x,不论多大的数都是int #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuh ...