美文网首页SpringFrameworkSpring Boot 核心技术服务器学习
第五十章:SpringBoot2.0新特性 - 岂止至今最简单r

第五十章:SpringBoot2.0新特性 - 岂止至今最简单r

作者: 恒宇少年 | 来源:发表于2018-04-15 17:44 被阅读3139次

    自从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核心技术
    007 SpringBoot核心技术学习目录 SpringBoot系统的学习目录,敬请关注点赞!!!

    构建项目

    如果之前本地没有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学习目录,感谢阅读!
    欢迎加入QQ技术交流群,共同进步。

    QQ技术交流群

    相关文章

      网友评论

      • 9c018e1dc62c:请问 @恒宇少年 请问key名如何进行模糊匹配,比如@CachePut(value=“user”,key = “‘user_*’”)这个好像不管用
      • 我读书多不会骗你:其实在实际开发中多数是不会这么搞地。
        差不多先生_c781:实际开发时怎么弄
        恒宇少年:@我读书多不会骗你 你可以进群跟大家探讨下
      • Remenber_Ray:@Cacheable(cacheNames = "user.service.all")
        请问这里面的all 指的是什么?
        小炉炉:@恒宇少年 你代码中的缓存名字好像不是这个是user.service.detail
        恒宇少年:@Remenber_Ray 缓存的名字
      • maybe燕:请问下没有controller,访问路径是什么呢?
      • 3ffbf6e3ed46:大神你是在哪学的?可以教下学习方法吗!一直感觉自己学的很慢?代码太多 老是记不住 看源代码又有些原理看不懂 不知道如何是好
        yutons:大神,用你的方法将对象写到redis ,但是显示乱码,求解答
        本历年加油:@Me_ed4b 一开始自己动手使用,用了差不多熟练了,才开始搞原理,多用idea debug
        恒宇少年:@Me_ed4b 平时看书比较多一些,再看看官方的文档能学到不少的东西,学了要运用才可以,否则学完你就会忘了

      本文标题:第五十章:SpringBoot2.0新特性 - 岂止至今最简单r

      本文链接:https://www.haomeiwen.com/subject/xcidkftx.html