Redis真是好,其中的键值用起来真心强大啊有木有,

之前的文章讲过搭建了redis集群

那么咋们该如何调用单机版的redis以及集群版的redis来使用缓存服务呢?

先讲讲单机版的,单机版redis安装非常简单,不多说了,直接使用命令:

[root@nginx bin]# ./redis-server redis.conf

启动就行

在sprig文件中配置如下

 <!--
TODO:
开发环境使用单机版
生产环境务必切换成集群
-->
<!-- 配置redis客户端单机版 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="${redis.single.client.host}"></constructor-arg>
<constructor-arg name="port" value="${redis.single.client.port}"></constructor-arg>
</bean>
<!-- 配置redis客户端实现类 -->
<bean id="jedisClientSingle" class="com.lee.rest.component.impl.JedisClientSingle"/> <!-- 配置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客户端

(有2个小家伙看不懂最后2个方法什么意思,就加了注释,其实规范点来讲,所有的接口方法都要加注释,而实现类就不需要,但是实现类中的私有方法必须加注释,这是规范)

 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<Content> gettList(Long id) {
// TODO 这个地方加缓存和不加缓存,单台或者集群的redis,都要进行压力测试
//添加缓存
//查询数据库之前先查询缓存,如果有直接返回
try {
//从redis中取缓存数据
String json = jedisClient.hget(REDIS_CONTENT_KEY, id + "");
if (!StringUtils.isBlank(json)) {
//把json转换成List
List<Content> 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;
}

那么service就好了,集群版的也通用

那么集群的配置如何呢?

放开注释

使用资源文件的配置

好了,启动一下就可以运行了

配置好Test或者controller都可以调用

但是要做好缓存同步,也就是在增加,修改,删除数据后,要同步缓存,把原有的del,在放入新的

这样就可以了`~

Redis 一二事 - 在spring中使用jedis 连接调试单机redis以及集群redis的更多相关文章

  1. Spring Cloud - Nacos注册中心入门单机模式及集群模式

    近几年微服务很火,Spring Cloud提供了为服务领域的一整套解决方案.其中Spring Cloud Alibaba是我们SpringCloud的一个子项目,是提供微服务开发的一站式解决方案. 包 ...

  2. Spring + Jedis集成Redis(集群redis数据库)

    前段时间说过单例redis数据库的方法,但是生成环境一般不会使用,基本上都是集群redis数据库,所以这里说说集群redis的代码. 1.pom.xml引入jar <!--Redis--> ...

  3. Redis安装(单机及各类集群,阿里云)

    Redis安装(单机及各类集群,阿里云) 前言 上周,我朋友突然悄悄咪咪地指着手机上的一篇博客说,这是你的博客吧.我看了一眼,是之前发布的<Rabbit安装(单机及集群,阿里云>.我朋友很 ...

  4. Redis单机多节点集群实验

    第一步:安装Redis 前面已经安装过了 不解释, Reids安装包里有个集群工具,要复制到/usr/local/bin里去 cp redis-3.2.9/src/redis-trib.rb /usr ...

  5. phpredis Redis集群 Redis Cluster

    官方url: https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#readme 2017年10月29日20:44:25 ...

  6. Redis集群--Redis集群之哨兵模式

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 搭建R ...

  7. Redis单机安装以及集群搭建

    今天主要来看一下Redis的安装以及集群搭建(我也是第一次搭建). 环境:CentOS 7.1,redis-5.0.7 一.单机安装 1.将Redis安装包放置服务器并解压 2.进入redis安装目录 ...

  8. redis 一二事 - 搭建集群缓存服务器

    在如今并发的环境下,对大数据量的查询采用缓存是最好不过的了,本文使用redis搭建集群 (个人喜欢redis,对memcache不感冒) redis是3.0后增加的集群功能,非常强大 集群中应该至少有 ...

  9. 【docker】【redis】2.docker上设置redis集群---Redis Cluster部署【集群服务】【解决在docker中redis启动后,状态为Restarting,日志报错:Configured to not listen anywhere, exiting.问题】【Waiting for the cluster to join...问题】

    参考地址:https://www.cnblogs.com/zhoujinyi/p/6477133.html https://www.cnblogs.com/cxbhakim/p/9151720.htm ...

随机推荐

  1. 什么是CSR证书申请文件?

      CSR是Cerificate Signing Request的英文缩写,即证书请求文件,在多方之间在互联网上安全分享数据的公钥基础架构PKI系统中,CSR文件必须在申请和购买SSL证书之前创建.也 ...

  2. java LinkedBlockingQueue和ConcurrentLinkedQueue的区别

    实现上看,两者都继承于AbstractQueue,但是ConcurrentLinkedQueue实现了Queue,而LinkedBlockingQueue实现了BlockingQueue,Blocki ...

  3. HTML Jquery

    在<网页制作Dreamweaver(悬浮动态分层导航)>中,运用到了jQuery的技术,轻松实现了菜单的下拉.显示.隐藏的效果,不必再用样式表一点点地修改,省去了很多麻烦,那么jQuery ...

  4. CSS基础选择器温故-1

    1.基本选择器语法 2.浏览器兼容性:浏览器对基本选择器都是一路绿灯通行,可以放心使用. 3.通配选择器:选择所有元素,也可以选择某个元素下的所有元素 (1)选择所有元素: *{margin: 0;p ...

  5. .net学习总结

    .NET 学前入门 了解.Net能做什么 了解.NET,C#语言及其特点(分清.NET和C#的关系),对.Net学习有系统全面的认识. C#基础 变量,赋值运算符.数据类型转换等. 选择结构控制(if ...

  6. c++类的定义《一》

    最近好忙,一来要在店里看店,二来朋友办结婚酒,搞的我这几天好疲惫啊···博客又有好几天没提笔了. 下午简单看了下书,看到了类的部分,自己动手练习了一下 笔记:1.类是数据类型 / 它的变童就是对象  ...

  7. English Training Material - 01

    Building a relationship Cross-cultural understanding Eye contact In many Western societies, includin ...

  8. 利用UIScrollView实现几个页面的切换

    此实例可以了解一下UIScrollView的运用,以及表格跟页面跳转的内容: 原作者地址:http://www.cocoachina.com/bbs/read.php?tid=323514 效果图如下 ...

  9. 【读书笔记】iOS-类别

    一,类别是一种为现有的类添加新方法的方式. 二,类别的局限性. 1,无法向类中添加新的实例变量.类别没有位置容纳实例变量. 2,名称冲突,即类别中的方法与现有的方法重名.当发生名称冲突时,类别具有更高 ...

  10. Retrofit源码设计模式解析(下)

    本文将接着<Retrofit源码设计模式解析(上)>,继续分享以下设计模式在Retrofit中的应用: 适配器模式 策略模式 观察者模式 单例模式 原型模式 享元模式 一.适配器模式 在上 ...