文档章节

SpringMVC下Redis集群cluster的试水小测

Pig-man
 Pig-man
发布于 2016/08/15 15:50
字数 1963
阅读 165
收藏 3
点赞 2
评论 0

第一步:resource.porperties文件写入cluster的参数

#redis
jedis_max_active=2048
jedis_max_idle=100
jedis_max_wait=10000
jedis_test_on_borrow=true


#cluster
cluster_url=192.168.7.60
cluster_port=6381
cluster_url2=192.168.7.60
cluster_port2=6380
cluster_url3=192.168.7.60
cluster_port3=6381
cluster_url4=192.168.7.60
cluster_port4=6379
cluster_url5=192.168.7.60
cluster_port5=6380
cluster_url6=192.168.7.60
cluster_port6=6383

第二步:封bean,spring-redis.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"  
    xmlns:aop="http://www.springframework.org/schema/aop"  
    xsi:schemaLocation="  
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">  

    <context:property-placeholder location="classpath:resource.properties" />  

    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="${jedis_max_idle}" />
        <property name="maxTotal" value="${jedis_max_active}" />
        <property name="maxWaitMillis" value="${jedis_max_wait}" />
        <property name="testOnBorrow" value="${jedis_test_on_borrow}" />
    </bean>

    <!-- 	 使用构造方法注入:public JedisCluster(Set<HostAndPort> nodes, int timeout, final GenericObjectPoolConfig poolConfig)  -->
    <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
        <constructor-arg index="0">
            <set>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg type="java.lang.String" value="${cluster_url}" />
                    <constructor-arg type="int" value="${cluster_port}" />
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                   <constructor-arg type="java.lang.String" value="${cluster_url2}" />
                   <constructor-arg type="int" value="${cluster_port2}" />
                </bean>-->
                <bean class="redis.clients.jedis.HostAndPort">-->
                    <constructor-arg type="java.lang.String" value="${cluster_url3}" />
                    <constructor-arg type="int" value="${cluster_port3}" />
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">-->
                    <constructor-arg type="java.lang.String" value="${cluster_url4}" />
                    <constructor-arg type="int" value="${cluster_port4}" />
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">-->
                    <constructor-arg type="java.lang.String" value="${cluster_url5}" />
                    <constructor-arg type="int" value="${cluster_port5}" />-->
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">-->
                    <constructor-arg type="java.lang.String" value="${cluster_url6}" />
                    <constructor-arg type="int" value="${cluster_port6}" />
                </bean>
            </set>
        </constructor-arg>
        <constructor-arg index="1" value="60000" type="int"></constructor-arg>
        <constructor-arg index="2" ref="poolConfig"></constructor-arg>
    </bean>
</beans>

第三步 接口描述IRedisCommandService,及方法调用RedisCommandServiceImpl implements IRedisCommandService

package com.aneop.common.cluster;

import java.util.List;
import java.util.Map;
import java.util.Set;

public interface IRedisCommandService {
	//----------------String-------------------
	/**
	 * 给一个 KEY 设置一个 值 ,并且设置有效时间
	 * @param key 存储的KEY
	 * @param value 存储KEY的值
	 * @param expire 有效时间
	 * @return 操作成功完成时返回 OK
	 * @throws Exception 异常
	 */
	public String set(String key, Object value, int expire) throws Exception;
	/**
	 * 获取 KEY对应的值
	 * @param key 查询的KEY
	 * @param cls 返回的对象类型
	 * @return
	 * @throws Exception 异常
	 */
	public <T> T get(String key, Class<T> cls) throws Exception;

	
	//--------------Set-----------------------
	/**
	 * 返回Set中成员的数量,如果该Key并不存在,返回0。
	 * 
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public Long scard(String key) throws Exception;

	/**
	 * 如果在插入的过程用,参数中有的成员在Set中已经存在,该成员将被忽略,而其它成员仍将会被正常插入。
	 * 如果执行该命令之前,该Key并不存在,该命令将会创建一个新的Set,此后再将参数中的成员陆续插入。
	 * 如果该Key的Value不是Set类型,该命令将返回相关的错误信息。
	 * 
	 * @param key
	 * @param members
	 * @return 本次操作实际插入的成员数量。
	 * @throws Exception 
	 */
	public Long sadd(String key, Object... members) throws Exception;

	/**
	 * 从与Key关联的Set中删除参数中指定的成员,不存在的参数成员将被忽略,如果该Key并不存在,将视为空Set处理。
	 * 
	 * @param key
	 * @param members
	 * @return 从Set中实际移除的成员数量,如果没有则返回0。
	 * @throws Exception 
	 */
	public Long srem(String key, Object... members) throws Exception;

	/**
	 * 查询set 里面的成员
	 * 
	 * @param key
	 * @throws Exception 
	 */
	public <T> Set<T> smembers(String key, Class<T> t) throws Exception;

	/**
	 * 删除 set key的数据
	 * @throws Exception 
	 */
	public Long sremove(String key) throws Exception;
	
	//--------------Map-----------------------
	/**
	 *  Map集合存储值(为MAP新增key-value)
	 * @param key map的key
	 * @param mapKey map里面value对应的key
	 * @param value 要存储的值(JSON字符串)
	 * @throws Exception 异常
	 */
	public void setMap(String key, String mapKey, String value) throws Exception;

	/**
	 *  Map存储List(map(key,List))
	 * @param key map的key
	 * @param mapKey map里面value对应的key
	 * @param value 要存储的值
	 * @throws Exception 异常
	 */
	public void setMapList(String key, String mapKey, List<?> list) throws Exception;
	
	/**
	 * 获取缓存中,map集合中mapkey存放的对象
	 * @param name  以对象形式存储的名字
	 * @param mapKey map中key值
	 * @param t 返回实体对象类型
	 * @throws Exception
	 */
	public <T> T getMapValue(String key, String mapKey, Class<T> t) throws Exception;

	public String getMapValue(String key, String string) throws Exception;
	/**
	 * 获取缓存中,map集合中的值
	 * @param name 以对象形式存储的名字
	 * @param t 返回实体对象类型
	 * @throws Exception
	 */
	public <T> List<T> getMapValues(String key, Class<T> t) throws Exception;
	
	/**
	 * 删除 map里面的某一个值
	 * @param key map的外层key
	 * @param valueKey 值对应的key
	 * @return
	 * @throws Exception
	 */
	public Long removeMap(String key, String valueKey) throws Exception;
	
	/**
	 * 获取 map里面 所有 key对应的 value
	 * @param name 以对象形式存储的key
	 * @throws Exception 
	 */
	public Map<String, String> getMaps(String key) throws Exception;
	
	//--------------List----------------------
	
	//--------------common--------------------
	/**
	 * 删除 KEY -----此处可以删除 任意数据类型的KEY数据
	 * @param key 要删除的KEY
	 * @return 影响的数据行
	 * @throws Exception 异常
	 */
	public Long remove(String key) throws Exception;
	/**
	 * 检测 KEY在缓存中是否存在
	 * @param key 检测的KEY
	 * @return
	 * @throws Exception
	 */
	public boolean exists(String key) throws Exception;
	/**
	 * 设置有效期
	 * @param key 有效期的key
	 * @param seconds 有效时间 秒
	 * @return 影响行
	 */
	public Long expire(String key, int seconds) throws Exception;
    
	/**
	 * 
	* @Title: type 
	* @Description: 返回 key 所储存的值的类型。
	* @param @param key
	* @param @return
	* @param @throws Exception 
	* @return String 	none (key不存在)
						string (字符串)
						list (列表)
						set (集合)
						zset (有序集)
						hash (哈希表)
	* @throws
	 */
	public String type(String key)throws Exception;
    
	
	public long rPush(String key, List<?> list);
	
	public String lPop(String key);
	
	public List<String> lrange(String key);
}
  
package com.aneop.common.cluster.impl;

import com.alibaba.fastjson.JSON;
import com.aneop.common.cluster.IRedisCommandService;
import org.springframework.stereotype.Service;
import redis.clients.jedis.JedisCluster;

import javax.annotation.Resource;
import java.util.*;

@Service("redisCommandService")
public class RedisCommandServiceImpl implements IRedisCommandService {
	@Resource(name="jedisCluster")
	public JedisCluster jedisCluster;

	@Override
	public String set(String key, Object value, int expire) throws Exception {
		try {
			String result = jedisCluster.set(key, JSON.toJSONString(value));
			if (expire > 0)
				jedisCluster.expire(key, expire);
			return result;
		} catch (Exception e) {
			throw e;
		}

	}

	@Override
	public <T> T get(String key, Class<T> cls) throws Exception {
		try {
			String jsonValue = jedisCluster.get(key);
			return JSON.parseObject(jsonValue, cls);
		} catch (Exception e) {
			throw e;
		}
	}

	@Override
	public Long scard(String key) throws Exception {
		Long count = 0l;
		try {
			count = jedisCluster.scard(key);
		} catch (Exception e) {
			throw e;
		}

		return count;
	}

	@Override
	public Long sadd(String key, Object... members) throws Exception {
		Long rows = 0l;
		try {
			String[] item = new String[members.length];
			int i = 0;
			for (Object obj : members) {
				item[i] = JSON.toJSONString(obj);
				i++;
			}
			rows = jedisCluster.sadd(key, item);
		} catch (Exception e) {
			throw e;
		}

		return rows;
	}

	@Override
	public Long srem(String key, Object... members) throws Exception {
		Long rows = 0l;
		try {
			String[] item = new String[members.length];
			int i = 0;
			for (Object obj : members) {
				item[i] = JSON.toJSONString(obj);
				i++;
			}
			rows = jedisCluster.srem(key, item);
		} catch (Exception e) {
			throw e;
		}
		return rows;
	}

	@Override
	public <T> Set<T> smembers(String key, Class<T> t) throws Exception {
		try {
			Set<String> sItem = jedisCluster.smembers(key);

			Set<T> result = new HashSet<T>();
			Iterator<String> rt = sItem.iterator();
			while (rt.hasNext()) {
				result.add(JSON.parseObject(rt.next(), t));
			}
			return result;
		} catch (Exception e) {
			throw e;
		}
	}

	@Override
	public Long sremove(String key) throws Exception {
		Long result = 0L;
		try {
			result = jedisCluster.del(key);
		} catch (Exception e) {
			throw e;
		}
		return result;
	}

	// -------------------map--------------------------
	@Override
	public void setMap(String key, String mapKey, String value)
			throws Exception {
		try {
//			String jsonValue = JSON.toJSONString(value);
			jedisCluster.hset(key, mapKey, value);
		} catch (Exception e) {
			throw e;
		}
	}

	@Override
	public void setMapList(String key, String mapKey, List<?> list)
			throws Exception {
		try {
			jedisCluster.hset(key, mapKey, JSON.toJSONString(list));
		} catch (Exception e) {
			throw e;
		}		
	}

	@Override
	public <T> T getMapValue(String key, String mapKey, Class<T> t)
			throws Exception {
		List<String> list = null;
		try {

			list = jedisCluster.hmget(key, mapKey);
		} catch (Exception e) {
			throw e;
		}
		if (list == null || list.size() == 0) {
			return null;
		}

		String value = list.get(0);
		if (value != null) {
			return JSON.parseObject(value, t);
		}
		return null;
	}

	
	
	@Override
	public String getMapValue(String key, String mapKey) throws Exception {
		// TODO Auto-generated method stub
		String value = null;
		try {
			value = jedisCluster.hget(key, mapKey);
		} catch (Exception e) {
			throw e;
		}
		return value;
	}

	@Override
	public <T> List<T> getMapValues(String key, Class<T> t) throws Exception {
		List<String> list = new ArrayList<String>();
		List<T> rList = null;

		try {

			list = jedisCluster.hvals(key);
		} catch (Exception e) {
			throw e;
		}

		if (list != null && list.size()>0) {
			rList = new ArrayList<T>();
			for (int i = 0; i < list.size(); i++) {
				rList.add(JSON.parseObject(list.get(i), t));
			}
		}

		return rList;
	}

	@Override
	public Long removeMap(String key, String valueKey) throws Exception {
		Long result = 0L;

		try {
			result = jedisCluster.hdel(key, valueKey);
		} catch (Exception e) {
			throw e;
		}
		return result;
	}

	@Override
	public Map<String, String> getMaps(String key) throws Exception {

		Map<String, String> rList = new HashMap<String, String>();
		try {

			rList = jedisCluster.hgetAll(key);
		} catch (Exception e) {
			throw new Exception(e);
		}
		return rList;
	}

	// -------------------common--------------------------
	@Override
	public Long remove(String name) throws Exception {
		Long result = 0L;

		try {

			result = jedisCluster.del(name);
		} catch (Exception e) {
			throw e;
		}
		return result;
	}

	@Override
	public boolean exists(String key) throws Exception {

		try {

			return jedisCluster.exists(key);
		} catch (Exception e) {
			throw e;
		}
	}

	@Override
	public Long expire(String key, int seconds) throws Exception {
		try {
			return jedisCluster.expire(key, seconds);
		} catch (Exception e) {
			throw e;
		}
	}

	@Override
	public String type(String key) throws Exception {
		try {
			return jedisCluster.type(key);
		} catch (Exception e) {
			throw e;
		}
	}

	@Override
	public long rPush(String key, List<?> list) {
		try {
			return jedisCluster.rpush(key, JSON.toJSONString(list));
		} catch (Exception e) {
			//throw e;
			return 0l;
		}
	}

	@Override
	public String lPop(String key) {
		try {
			return jedisCluster.lpop(key);
		} catch (Exception e) {
			//throw e;
			return null;
		}
	}

	@Override
	public List<String> lrange(String key) {
		return jedisCluster.lrange(key, 0, -1);
	}

}

第四部,数据的吞吐实例

 IRedisCommandService redisCommandService = (IRedisCommandService) ApplicationContextUtil.getBean("redisCommandService");
        String reParams = this.turnToExpParams(tmsOrder);
        try {
            redisCommandService.setMap("redis_test", map.key(), map.value();
        } catch (Exception e) {
            e.printStackTrace();
        }
  IRedisCommandService redisCommandService = (IRedisCommandService) ApplicationContextUtil.getBean("redisCommandService");
        Map<String, String> newMap = null;//从redis中取出数据
        try {
           newMap = redisCommandService.getMaps("redis_test");
        } catch (Exception e) {
            e.printStackTrace();
        }

 

© 著作权归作者所有

共有 人打赏支持
Pig-man
粉丝 19
博文 61
码字总数 46911
作品 0
青浦
程序员
推荐几个自己写的Java后端相关的范例项目(转载)

http://wosyingjun.iteye.com/blog/2312553 这里推荐几个自己写的范例项目,主要采用SSM(Spring+SpringMVC+Mybatis)框架,分布式架构采用的是(dubbo+zookeeper)。范例项目的好处是简单易...

指尖的舞者 ⋅ 2016/09/27 ⋅ 0

Redis集群方案

Redis回顾 Redis支持的数据结构 字符串(String) 哈希(Hash) 列表(List) 集合(Set) 有序集合(Sorted Set) 位数组 HyperLogLog Redis支持的操作 基本操作 发布/订阅 Pipeline操作 事...

奔跑的阿飞 ⋅ 2017/09/25 ⋅ 0

ZHENFENGSHISAN/perfect-ssm

Quick Start 项目简介 ssm系列 ssm-demo:Spring+SpringMVC+Mybatis+easyUI整合 perfect-ssm:RESTful API+redis缓存 ssm-cluster:前后端分离+集群部署 ssm-dubbo:dubbo服务化 ssm-micro-se......

ZHENFENGSHISAN ⋅ 2017/09/18 ⋅ 0

Redis客户端redisson实战

redis 学习问题总结 http://aperise.iteye.com/blog/2310639 ehcache memcached redis 缓存技术总结 http://aperise.iteye.com/blog/2296219 redis-stat 离线安装 http://aperise.iteye.com......

哲别0 ⋅ 05/21 ⋅ 0

Spring Cloud--Honghu Cloud分布式微服务云系统—组件化

Spring Cloud集成项目有很多,下面我们列举一下和Spring Cloud相关的优秀项目,我们的企业架构中用到了很多的优秀项目,说白了,也是站在巨人的肩膀上去整合的。在学习Spring Cloud之前大家必...

itcloud ⋅ 04/26 ⋅ 0

Spring Boot使用Spring Data Redis操作Redis(单机/集群)

说明:Spring Boot简化了Spring Data Redis的引入,只要引入spring-boot-starter-data-redis之后会自动下载相应的Spring Data Redis和Jedis客户端,可以减少版本这块的冲突,当然,如果要引入...

easonjim ⋅ 2017/11/08 ⋅ 0

容器混搭搞出线上 Redis 事故,这坑我先踩为敬

事情是这样的, 现在有一个 redis 3.0 集群节点都是裸 redis 或 host 网络模式部署的容器 redis (基本上跟裸 redis 差不多), 需要把它们替换成 macvlan 网络模式的 redis 容器, 以显得我们的 ...

kkkls ⋅ 2015/10/13 ⋅ 33

Spring Boot集成Spring Data Reids和Spring Session实现Session共享(多个不同的应用共用一个Redis实例)

从Redis的Key入手,比如Spring Session在注解@EnableRedisHttpSession上提供了redisNamespace属性,只需要在这里设置不同的值即可,效果应该是这样的: pring:session::xxx-x-xx-xx 或者从R...

easonjim ⋅ 2017/11/10 ⋅ 0

Spring集成Redis方案(spring-data-redis)(基于Jedis的单机模式)(待实践)

说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点。并且会与一些低版本的Spring有冲突,要看官方文档...

easonjim ⋅ 2017/10/05 ⋅ 0

Spring Boot集成Spring Data Reids和Spring Session实现Session共享

首先,需要先集成Redis的支持,参考:http://www.cnblogs.com/EasonJim/p/7805665.html Spring Boot集成Spring Data Redis+Spring Session非常的简单,也不用担心版本问题,只需要引入相应的...

easonjim ⋅ 2017/11/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Boot整合模板引擎thymeleaf

项目结构 引入依赖pom.xml <!-- 引入 thymeleaf 模板依赖 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId......

yysue ⋅ 18分钟前 ⋅ 0

ConstraintLayout使用解析

AndroidStudio3.0创建Project默认的布局就是ConstraintLayout。 AndroidStudio3.0前的可以自己修改,使用ConstraintLayout。 为了要使用ConstraintLayout,我们需要在app/build.gradle文件中...

_OUTMAN_ ⋅ 29分钟前 ⋅ 0

OSChina 周三乱弹 —— 这样的女人私生活太混乱了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 胖达panda :你经历过体验到人生的大起大落吗?我一朋友在10秒内体验了,哈哈。@小小编辑 请点一首《almost lover》送给他。 《almost love...

小小编辑 ⋅ 今天 ⋅ 9

自己动手写一个单链表

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对...

公众号_好好学java ⋅ 今天 ⋅ 0

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部