Redis 一二事(2) - 在spring中使用jedis 连接调试单机redis以及集群redis
Redis真是好,其中的键值用起来真心强大啊有木有,
之前的文章讲过搭建了redis集群
那么咋们该如何调用单机版的redis以及集群版的redis来使用缓存服务呢?
先讲讲单机版的,单机版redis安装非常简单,不多说了,直接使用命令:
[root@nginx bin]# ./redis-server redis.conf
启动就行
在sprig文件中配置如下
这是配置的redis-cli的连接池
然后定义一个接口,这个接口供两个类实现
一个是单机版,一个是集群版
有人会问为啥要2个类实现,因为redis的单机和集群都是不同的实现方法
一般在开发环境会使用单机版来做测试,生产环境直接上集群
#fake cluster
redis.single.client.host=192.168.1.191
redis.single.client.port=6379
在你的资源文件中配好如上信息,供spring调用
说个题外话,资源文件*.properties,在spring的父子容器中不是公用的
也就是说,在service的spring容器中,只能配service层调用
在springMVC容器中只能被springmvc自己调用,因为资源文件不是夸容器的
而spring容器中的对象是可以被springMVC来访问的
但是springMVC的对象以及资源文件绝对不能被spring来访问,
举个栗子:你有见过service访问controller的吗?没有吧,哈哈
咱们先来建一个通用jedis客户端
(有2个小家伙看不懂最后2个方法什么意思,就加了注释,其实规范点来讲,所有的接口方法都要加注释,而实现类就不需要,但是实现类中的私有方法必须加注释,这是规范)
单机版的实现类:
这是集群的:
使用地方,一般都是在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就好了,集群版的也通用
那么集群的配置如何呢?
放开注释
使用资源文件的配置
#real cluster
redis01.real.cluster.client.host=192.168.1.193
redis01.real.cluster.client.port=7001
redis02.real.cluster.client.host=192.168.1.194
redis02.real.cluster.client.port=7002
redis03.real.cluster.client.host=192.168.1.195
redis03.real.cluster.client.port=7003
redis04.real.cluster.client.host=192.168.1.196
redis04.real.cluster.client.port=7004
redis05.real.cluster.client.host=192.168.1.197
redis05.real.cluster.client.port=7005
redis06.real.cluster.client.host=192.168.1.198
redis06.real.cluster.client.port=7006
好了,启动一下就可以运行了
配置好Test或者controller都可以调用
但是要做好缓存同步,也就是在增加,修改,删除数据后,要同步缓存,把原有的del,在放入新的
这样就可以了`~
- CentOs7.3 搭建 MySQL 5.7.19 主从复制,以及复制实现细节分析
- 1.Linux操作系统安装的5种方法以及心得
- 我(作为一名开发者)所犯过的错误
- Hadoop-2.7.4 集群快速搭建
- Scala-2.13.0 安装及配置
- HBase-1.3.1 集群搭建
- CentOs7.3 Hadoop 用户 ssh 免密登录
- 手把手教你用Mysql-Cluster-7.5搭建数据库集群
- 简单的java开源图床
- 调度器Quartz的简述与使用总结
- 使用 RecyclerView 实现 Gallery 画廊效果,并控制 Item 停留位置
- linux chmod,chown命令详解
- Quartz任务调度快速入门
- ElasticSearch 安装报错整理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- rxjs switchMap的实现原理
- rxjs里scan operator的执行研究
- rxjs pipe和map组合的一个实际例子的单步调试
- Win10+Python2.7.14+cocos2d-x-3.17.2+VS2017环境搭建
- VUE-001-在表格单元格(el-table-column)中添加超链接访问
- 关于vue的title标签中出现的htmlWebpackPlugin.options.title
- dotnet tool 工具安装提示 Could not find a part of the path 安装失败
- dotnet core 进行 XML 序列化抛出 XmlSerializers dll 文件找不到
- C# dotnet 高性能多线程工具 ExecuteOnceAwaiter 只执行一次的任务
- 一道Postgresql递归树题
- 突击并发编程JUC系列-JDK1.8 扩展类型 LongAdder
- 利用tensorflow训练简单的生成对抗网络GAN
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.7):运算符(基本算数运算符、原码、反码、补码)
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.6):基本数据类型及字符集编码(字符编码和char型)
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.6):基本数据类型及字符集编码(整型、浮点型、布尔型)