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

4 篇文章 0 订阅

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 {

@Autowired
private JedisPool jedisPool;

@Override
public String set(String key, String value) {
    Jedis jedis = jedisPool.getResource();
    String result = jedis.set(key, value);
    jedis.close();
    return result;
}

@Override
public String get(String key) {
    Jedis jedis = jedisPool.getResource();
    String result = jedis.get(key);
    jedis.close();
    return result;
}

@Override
public Long hset(String key, String item, String value) {
    Jedis jedis = jedisPool.getResource();
    Long result = jedis.hset(key, item, value);
    jedis.close();
    return result;
}

@Override
public String hget(String key, String item) {
    Jedis jedis = jedisPool.getResource();
    String result = jedis.hget(key, item);
    jedis.close();
    return result;
}

@Override
public Long hdel(String key, String item) {
    Jedis jedis = jedisPool.getResource();
    Long result = jedis.hdel(key, item);
    jedis.close();
    return result;
}

@Override
public Long incr(String key) {
    Jedis jedis = jedisPool.getResource();
    Long result = jedis.incr(key);
    jedis.close();
    return result;
}

@Override
public Long decr(String key) {
    Jedis jedis = jedisPool.getResource();
    Long result = jedis.decr(key);
    jedis.close();
    return result;
}

@Override
public Long expire(String key, int second) {
    Jedis jedis = jedisPool.getResource();
    Long result = jedis.expire(key, second);
    jedis.close();
    return result;
}

@Override
public 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 {

@Autowired
private JedisCluster jedisCluster;

@Override
public String set(String key, String value) {
    return jedisCluster.set(key, value);
}

@Override
public String get(String key) {
    return jedisCluster.get(key);
}

@Override
public Long hset(String key, String item, String value) {
    return jedisCluster.hset(key, item, value);
}

@Override
public String hget(String key, String item) {
    return jedisCluster.hget(key, item);
}

@Override
public Long hdel(String key, String item) {
    return jedisCluster.hdel(key, item);
}

@Override
public Long incr(String key) {
    return jedisCluster.incr(key);
}

@Override
public Long decr(String key) {
    return jedisCluster.decr(key);
}

@Override
public Long expire(String key, int second) {
    return jedisCluster.expire(key, second);
}

@Override
public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值