在spring中使用jedis 连接调试单机redis以及集群redis

来源:互联网 发布:知乎日报所有封面图 编辑:程序博客网 时间:2024/06/06 05:40

1.启动redis [root@nginx bin]# ./redis-server redis.conf
2.`






<!-- 配置redis客户端集群版 单机版和集群版的jedis只能存在一个 --><!-- <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">    <constructor-arg>        <set>            <bean class="redis.clients.jedis.HostAndPort">                <constructor-arg name="host" value="${redis01.real.cluster.client.host}"/>                <constructor-arg name="port" value="${redis01.real.cluster.client.port}"/>            </bean>            <bean class="redis.clients.jedis.HostAndPort">                <constructor-arg name="host" value="${redis02.real.cluster.client.host}"/>                <constructor-arg name="port" value="${redis02.real.cluster.client.port}"/>            </bean>            <bean class="redis.clients.jedis.HostAndPort">                <constructor-arg name="host" value="${redis03.real.cluster.client.host}"/>                <constructor-arg name="port" value="${redis03.real.cluster.client.port}"/>            </bean>            <bean class="redis.clients.jedis.HostAndPort">                <constructor-arg name="host" value="${redis04.real.cluster.client.host}"/>                <constructor-arg name="port" value="${redis04.real.cluster.client.port}"/>            </bean>            <bean class="redis.clients.jedis.HostAndPort">                <constructor-arg name="host" value="${redis05.real.cluster.client.host}"/>                <constructor-arg name="port" value="${redis05.real.cluster.client.port}"/>            </bean>            <bean class="redis.clients.jedis.HostAndPort">                <constructor-arg name="host" value="${redis06.real.cluster.client.host}"/>                <constructor-arg name="port" value="${redis06.real.cluster.client.port}"/>            </bean>        </set>    </constructor-arg></bean><bean id="jedisClientCluster" class="com.lee.rest.component.impl.JedisClientCluster"/> -->`

这是配置的redis-cli的连接池

然后定义一个接口,这个接口供两个类实现

一个是单机版,一个是集群版

有人会问为啥要2个类实现,因为redis的单机和集群都是不同的实现方法

一般在开发环境会使用单机版来做测试,生产环境直接上集群

fake cluster

redis.single.client.host=192.168.1.191
redis.single.client.port=6379

redis01.cluster.client.host=192.168.1.192
redis01.cluster.client.port=7001

redis02.cluster.client.host=192.168.1.192
redis02.cluster.client.port=7002

redis03.cluster.client.host=192.168.1.192
redis03.cluster.client.port=7003

redis04.cluster.client.host=192.168.1.192
redis04.cluster.client.port=7004

redis05.cluster.client.host=192.168.1.192
redis05.cluster.client.port=7005

redis06.cluster.client.host=192.168.1.192
redis06.cluster.client.port=7006

在你的资源文件中配好如上信息,供spring调用
说个题外话,资源文件*.properties,在spring的父子容器中不是公用的
也就是说,在service的spring容器中,只能配service层调用
在springMVC容器中只能被springmvc自己调用,因为资源文件不是夸容器的
而spring容器中的对象是可以被springMVC来访问的
但是springMVC的对象以及资源文件绝对不能被spring来访问,
举个栗子:你有见过service访问controller的吗?没有吧,哈哈
咱们先来建一个通用jedis客户端

package com.lee.rest.component;

/**
*
* @Title: JedisClient.java
* @Package com.lee.rest.component
* @Description: redis客户端
* Copyright: Copyright (c) 2016
* Company:Nathan.Lee.Salvatore
*
* @author leechenxiang
* @date 2016年4月27日 下午4:28:46
* @version V1.0
*/
public interface JedisClient {

public String set(String key, String value);public String get(String key);public Long hset(String key, String item, String value);public String hget(String key, String item);public Long hdel(String key, String item);public Long incr(String key);public Long decr(String key);/** *  * @Description: 设置存存活时间 * @param key * @param second * @return *  * @author leechenxiang * @date 2016年4月27日 下午4:34:35 */public Long expire(String key, int second);/** *  * @Description: 判断key多久过期 * @param key * @return 秒  *             >= 0     剩余秒数 *             = -1    永久存活 *             = -2    已经消除 *  * @author leechenxiang * @date 2016年4月27日 下午4:34:22 */public Long ttl(String key);

}/**
*
* @Title: JedisClientSingle.java
* @Package com.lee.rest.component.impl
* @Description: 单机版的jedis客户端操作
* Copyright: Copyright (c) 2016
* Company:Nathan.Lee.Salvatore
*
* @author leechenxiang
* @date 2016年4月27日 下午4:36:42
* @version V1.0
*/
public class JedisClientSingle implements JedisClient {

@Autowiredprivate JedisPool jedisPool;@Overridepublic String set(String key, String value) {    Jedis jedis = jedisPool.getResource();    String result = jedis.set(key, value);    jedis.close();    return result;}@Overridepublic String get(String key) {    Jedis jedis = jedisPool.getResource();    String result = jedis.get(key);    jedis.close();    return result;}@Overridepublic Long hset(String key, String item, String value) {    Jedis jedis = jedisPool.getResource();    Long result = jedis.hset(key, item, value);    jedis.close();    return result;}@Overridepublic String hget(String key, String item) {    Jedis jedis = jedisPool.getResource();    String result = jedis.hget(key, item);    jedis.close();    return result;}@Overridepublic Long hdel(String key, String item) {    Jedis jedis = jedisPool.getResource();    Long result = jedis.hdel(key, item);    jedis.close();    return result;}@Overridepublic Long incr(String key) {    Jedis jedis = jedisPool.getResource();    Long result = jedis.incr(key);    jedis.close();    return result;}@Overridepublic Long decr(String key) {    Jedis jedis = jedisPool.getResource();    Long result = jedis.decr(key);    jedis.close();    return result;}@Overridepublic Long expire(String key, int second) {    Jedis jedis = jedisPool.getResource();    Long result = jedis.expire(key, second);    jedis.close();    return result;}@Overridepublic Long ttl(String key) {    Jedis jedis = jedisPool.getResource();    Long result = jedis.ttl(key);    jedis.close();    return result;}

}

/**
*
* @Title: JedisClientCluster.java
* @Package com.lee.rest.component.impl
* @Description: 集群版的jedis客户端操作
* Copyright: Copyright (c) 2016
* Company:Nathan.Lee.Salvatore
*
* @author leechenxiang
* @date 2016年4月27日 下午4:44:02
* @version V1.0
*/
public class JedisClientCluster implements JedisClient {

@Autowiredprivate JedisCluster jedisCluster;@Overridepublic String set(String key, String value) {    return jedisCluster.set(key, value);}@Overridepublic String get(String key) {    return jedisCluster.get(key);}@Overridepublic Long hset(String key, String item, String value) {    return jedisCluster.hset(key, item, value);}@Overridepublic String hget(String key, String item) {    return jedisCluster.hget(key, item);}@Overridepublic Long hdel(String key, String item) {    return jedisCluster.hdel(key, item);}@Overridepublic Long incr(String key) {    return jedisCluster.incr(key);}@Overridepublic Long decr(String key) {    return jedisCluster.decr(key);}@Overridepublic Long expire(String key, int second) {    return jedisCluster.expire(key, second);}@Overridepublic Long ttl(String key) {    return jedisCluster.ttl(key);}

}

使用地方,一般都是在service中调用,把需要加缓存的地方都实现接口

取之前查询有没有缓存,有直接返回,没有查数据库,然后再放入缓存

也有企业会这么做,所有的缓存都有一个团队来管理,做一个定时器,每天凌晨固定一个时间点来跑批,把数据放入缓存

这么做也是可以的

我们采取的是第一种

PS:@Autowired 这边是用的类型相同,有人喜欢用@resource,这样的话就得多写一个,区别点
@Autowired
private JedisClient jedisClient;

@Value(“${REDIS_CONTENT_KEY}”)
private String REDIS_CONTENT_KEY;

@Override
public List gettList(Long id) {
// TODO 这个地方加缓存和不加缓存,单台或者集群的redis,都要进行压力测试
//添加缓存
//查询数据库之前先查询缓存,如果有直接返回
try {
//从redis中取缓存数据
String json = jedisClient.hget(REDIS_CONTENT_KEY, id + “”);
if (!StringUtils.isBlank(json)) {
//把json转换成List
List list = JsonUtils.jsonToList(json, Content.class);
return list;
}
} catch (Exception e) {
e.printStackTrace();
}

//执行查询
List<?> list = xxxMapper.select(id);
// 返回结果之前,向缓存中添加数据
try {
// 为了规范key可以使用hash
// 定义一个保存内容的key,hash中每个项就是cid
// value是list,需要把list转换成json数据。
jedisClient.hset(REDIS_CONTENT_KEY, id + “”, JsonUtils.objectToJson(list));
} catch (Exception e) {
e.printStackTrace();
}
return list;
}

0 0
原创粉丝点击