第五十章:SpringBoot2.0新特性 - 岂止至今最简单redis缓存集成
自从SpringBoot
升级到了2.0
版本后集成Redis
作为缓存就更为简单了,我们只需要配置Redis
相关的链接信息以及使用注解@EnableCaching
开启缓存,这样我们就直接可以在项目内使用缓存相关的内容。
由于最近这段时间一直在研发公司的持久化封装框架,用于编写文章的时间比较少,还请大家见谅,不过还会持续更新
SpringBoot
以及SpringCloud
等系列文章,敬请期待!!!
本章目标
基于SpringBoot2
完成快速集成Reids
作为项目缓存,并讲解一些缓存常用的配置。
SpringBoot 企业级核心技术学习专题
专题 |
专题名称 |
专题描述 |
---|---|---|
001 |
Spring Boot 核心技术 |
讲解SpringBoot一些企业级层面的核心组件 |
002 |
Spring Boot 核心技术章节源码 |
Spring Boot 核心技术简书每一篇文章码云对应源码 |
003 |
Spring Cloud 核心技术 |
对Spring Cloud核心技术全面讲解 |
004 |
Spring Cloud 核心技术章节源码 |
Spring Cloud 核心技术简书每一篇文章对应源码 |
005 |
QueryDSL 核心技术 |
全面讲解QueryDSL核心技术以及基于SpringBoot整合SpringDataJPA |
006 |
SpringDataJPA 核心技术 |
全面讲解SpringDataJPA核心技术 |
构建项目
如果之前本地没有Redis
环境,请访问第十六章:使用Redis作为SpringBoot项目数据缓存文章阅读配置,接下来
我们先来创建一个新的SpringBoot
项目,添加本站所使用的依赖,pom.xml
配置文件如下所示:
...省略部分配置
<dependencies>
<!--spring data jpa依赖添加-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--redis依赖添加-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--web相关依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--数据库依赖添加-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--druid依赖添加-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.8</version>
</dependency>
<!--lombok依赖添加-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.44</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--性能测试依赖-->
<dependency>
<groupId>org.databene</groupId>
<artifactId>contiperf</artifactId>
<version>2.3.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
</dependencies>
...省略部分配置
在本章的依赖内我们添加了contiperf
性能测试工具,用于测试分别从数据库、缓存内读取的性能差异。
配置Redis信息
我比较喜欢使用yml
文件方式进行配置,先来删除之前项目自动创建的application.properties
文件,新创建一个名为application.yml
的配置文件,添加Redis
相关的配置信息到application.yml
文件内,如下所示:
spring:
application:
name: spring-boot-redis
jpa:
database: mysql
show-sql: true
datasource:
druid:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/test
# 配置Redis的连接密码
redis:
password: hengyuboy
由于Redis
有很多默认的配置,默认连接localhost
上的Redis
,我们这里仅仅配置连接的密码就可以了,其他的都使用默认的配置。
开启缓存
我们找到创建的XxxApplication
入口程序类,在该类上添加@EnableCaching
注解完成开启缓存,如下所示:
/**
* spring-boot-redis集成项目启动类入口
*
* @author yuqiyu
* @EnableCaching 注解配置启用缓存,自动配置配置文件的配置信息进行条件注入缓存所需实例
*/
@SpringBootApplication
@EnableCaching
public class SpringBootRedisApplication {
}
测试
到现在我们的缓存已经配置完成了,是不是比之前SpringBoot1.x.x
版本的时候要简单很多,当然如果你有一些额外的自定义配置也是可以很简单的集成。
我们本章使用的数据读取是SpringDataJPA
,如果你之前并没有使用过SpringDataJPA
请访问第十三章:SpringBoot实战SpringDataJPA来阅读学习。
测试添加缓存
我们先来创建一个查询方法完成简单的数据缓存,方法如下所示:
/**
* 查询全部用户
*
* @return
*/
@Cacheable(cacheNames = "user.service.all")
public List<TestUserEntity> findAll() {
return userRepository.findAll();
}
接下来编写一个简单的单元测试,我们直接使用创建项目时创建的测试类,在测试类内添加一个测试方法,如下所示:
/**
* 测试全部缓存
*/
@Test
public void findAll() {
userService.findAll();
}
当我们第一次启动findAll
测试方法时可以看到控制台输出的SQL
,如下所示:
Hibernate: select testuseren0_.ui_id as ui_id1_0_, testuseren0_.ui_age as ui_age2_0_, testuseren0_.ui_name as ui_name3_0_, testuseren0_.ui_password as ui_passw4_0_ from test_user_info testuseren0_
本次的数据是从数据库内查询到的,接下来我们再次执行 findAll
方法来看下控制台,这时我们并没有看到输出的SQL
,证明本次的数据是从Redis
缓存内读取得到的。
性能测试
我们在pom.xml
配置文件内已经添加了性能测试的依赖contiperf
,那么下面我们来测试下从 Redis
内读取数据与 数据库
内读取输出的性能差异。
@Rule
public ContiPerfRule i = new ContiPerfRule();
/**
* 性能测试
* 10万次查询,100个线程同时操作findAll方法
*/
@Test
@PerfTest(invocations = 100000, threads = 100)
public void contextLoads() {
userService.findAll();
}
我们的测试是查询10万
次,并且开启100
个线程来完成这个测试方法,我们先来测试使用缓存的性能,如下图所示:
Redis10万性能测试
这是contiperf
执行生成的数据统计,当我们运行性能测试方法完成后,contiperf
就会自动在target->contiperf-report
下自动生成一个index.html
来统计本次执行的状况。
我们使用Redis
缓存时一共耗时23秒
,下面我们把@Cacheable(cacheNames = "user.service.all")
注解注释掉,再来执行一遍性能测试方法。
我们在运行测试的时候可以看到控制台的查询SQL
在不停的输出,这也证明了我们的数据是直接从数据库内获取的,测试结果如下图所示:
数据库10万性能测试
从上图内可以看到一共耗时:43秒
,效果已经很明显了,当然我这是本机模拟测试,如果是读取正在大并发高IO读取的服务器上时差距会更大。
总结
本章主要讲解了SpringBoot2.0
版本如何快速的集成Redis
。
第一步:添加spring-boot-starter-data-redis依赖
第二步:配置@EnableCaching开启缓存
第三步:在application.yml内配置Redis相关的信息
第四步:配置@Cacheable注解完成数据缓存
本章源码已经上传到码云: SpringBoot配套源码地址:https://gitee.com/hengboy/spring-boot-chapter SpringCloud配套源码地址:https://gitee.com/hengboy/spring-cloud-chapter SpringBoot相关系列文章请访问:目录:SpringBoot学习目录 QueryDSL相关系列文章请访问:QueryDSL通用查询框架学习目录 SpringDataJPA相关系列文章请访问:目录:SpringDataJPA学习目录,感谢阅读!
- spring data mongodb 代码连接数据库方式
- spring data mongodb dbref 关联查询
- spring-data-mongodb mapreduce使用
- 项目中如何设计通用的评论模块
- java8 stream
- spring boot中自定义错误提示页面
- spring boot中删除Data MongoDB的_class
- 用aop加redis实现通用接口缓存
- spring boot 实现mysql读写分离
- spring boot集成druid连接池
- spring boot整合dubbox进行服务拆分
- Spring Cloud中如何保证各个微服务之间调用的安全性
- Spring Boot Actuator监控页面报错解决
- Spring Cloud中如何优雅的使用Feign调用接口
- 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 数组属性和方法
- C# devExpress GridControl 行中行 子行 多级行
- 蓝桥杯 试题 基础练习 Huffuman树
- 蓝桥杯 试题 基础练习 2n皇后问题(包含n皇后问题讲解)
- 蓝桥杯 试题 基础练习 报时助手
- 蓝桥杯 试题 基础练习 回形取数
- 了解RefreshScope这篇短文就够了
- Educational Codeforces Round 83 (Rated for Div. 2) A~~E
- Codeforces Round #627 (Div. 3) 题解
- 牛客练习赛59 A~~D
- Codeforces Round #628 (Div. 2) A~~D
- AtCoder Beginner Contest 160 A ~ E
- SwiftUI:创建底部导航栏 tabBar
- AtCoder Beginner Contest 168 C
- 关于 Executor 和 ExecutorService
- 【队伍训练】Codeforces Round #660 (Div. 2)