第五十章: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学习目录,感谢阅读!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

Windows Server2008中的IIS7的五大特性

1、完全模块化的IIS 如果你非常熟悉流行的Apache Web server软件,那么你会知道它最大的优势就在于它的定制化,你可以把它配置为只能显示静态的...

1866
来自专栏GopherCoder

Python:一周笔记

1424
来自专栏张善友的专栏

MySQL管理工具HeidiSQL

HeidiSQL 是一个功能非常强大的 MySQL 客户端软件。它是德国程序员Ansgar Becker和几个Delphi程序员开发的一个开源工具。要通过Hei...

3258
来自专栏全华班

springcloud学习手册-Eureka(第二节)

导读 |springboot创建服务消费者和服务提供者 一、用springboot创建一个服务提供者(Service Provider) 模拟业务场景:根据用户...

3304
来自专栏架构师之旅

关于Socket高并发的原理介绍及使用Apache Mina带来线上的问题分析

上周在线上出现了一个很低级的问题,但是正是这个低级的问题引起了我的兴趣,其实所谓的低级是因为配置文件配置错了,原本线上是为每个客户端设置了一个席位,就说是客户端...

953
来自专栏服务端技术杂谈

乐视支付架构

架构 乐视 订单架构 分库分表 构建一个支撑每秒十万只读系统并不复杂,无非是通过一致性哈希扩展缓存节点,水平扩展web服务器等。每秒钟数十万数据更新操作,在任何...

3328
来自专栏社区的朋友们

TAF 必修课(三):Server 启动全过程

本节对 Taf-server整个启动流程进行解析,思考多协议支持,开发运营一体化。

8350
来自专栏zhisheng

SpringBoot RabbitMQ 整合使用

前提 上次写了篇文章,《SpringBoot Kafka 整合使用》,阅读量还挺高的,于是想想还是把其他几种 MQ 也和 SpringBoot 整合使用下。 下...

2809
来自专栏Ken的杂谈

博客从ASP.NET 迁移到了ASP.NET Core 2.0

在迁移之前,本站点是基于 ASP.NET MVC 4构建且部署在Linux+Mono环境下,Web服务器使用的是Jexus,在 .NET Core出来之前,这是...

703
来自专栏Albert陈凯

YARN & Mesos,论集群资源管理所面临的挑战

在国内,大部分的Spark用户都是由Hadoop过渡而来,因此YARN也成了大多Spark应用的底层资源调度保障。而随着Spark应用的逐渐加深,各种问题也随之...

2725

扫码关注云+社区