第五十章:SpringBoot2.0新特性 – 豈止至今最簡單redis快取整合

恆宇少年發表於2019-03-04

自從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配套原始碼地址:gitee.com/hengboy/spr…
SpringCloud配套原始碼地址:gitee.com/hengboy/spr…
SpringBoot相關係列文章請訪問:目錄:SpringBoot學習目錄
QueryDSL相關係列文章請訪問:QueryDSL通用查詢框架學習目錄
SpringDataJPA相關係列文章請訪問:目錄:SpringDataJPA學習目錄,感謝閱讀!
歡迎加入QQ技術交流群,共同進步。

QQ技術交流群
微信掃碼關注 - 專注分享

相關文章