SpringBoot使用快取

lightwing發表於2021-09-09

前言

我們都知道,一個程式的瓶頸通常都在資料庫,很多場景需要獲取相同的資料。比如網站頁面資料等,需要一次次的請求資料庫,導致大部分時間都浪費在資料庫查詢和方法呼叫上,這時就可以利用到快取來緩解這個問題。

本文來介紹SpringBoot來簡單整合快取,使用SpringBoot+JPA+mysql來進行資料庫操作。整合JPA的文章,具體可以參考 。

建立一個專案,pom檔案中加入spring-boot-starter-cache依賴,完整pom如下:


    4.0.0

    com.dalaoyang
    springboot_cache
    0.0.1-SNAPSHOT
    jar

    springboot_cache
    springboot_cache

    
        org.springframework.boot
        spring-boot-starter-parent
        1.5.9.RELEASE
         <!-- lookup parent from repository --&gt
    

    
        UTF-8
        UTF-8
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter-cache
        
        
            org.springframework.boot
            spring-boot-starter-data-jpa
        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-devtools
            runtime
        
        
            mysql
            mysql-connector-java
            runtime
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

配置檔案如下,和整合JPA一樣,沒有做任何修改:

##埠號
server.port=8888



##資料庫配置
##資料庫地址
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false
##資料庫使用者名稱
spring.datasource.username=root
##資料庫密碼
spring.datasource.password=root
##資料庫驅動
spring.datasource.driver-class-name=com.mysql.jdbc.Driver


##validate  載入hibernate時,驗證建立資料庫表結構
##create   每次載入hibernate,重新建立資料庫表結構,這就是導致資料庫表資料丟失的原因。
##create-drop        載入hibernate時建立,退出是刪除表結構
##update                 載入hibernate自動更新資料庫結構
##validate 啟動時驗證表的結構,不會建立表
##none  啟動時不做任何操作
spring.jpa.hibernate.ddl-auto=update

##控制檯列印sql
spring.jpa.show-sql=true

實體類程式碼如下:

package com.dalaoyang.entity;

import javax.persistence.*;

/**
 * @author dalaoyang
 * @Description
 * @project springboot_learn
 * @package com.dalaoyang.entity
 * @email yangyang@dalaoyang.cn
 * @date 2018/5/28
 */
@Entity
public class House {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    @Column(length = 10)
    private String houseName;
    private String houseSize;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getHouseName() {
        return houseName;
    }

    public void setHouseName(String houseName) {
        this.houseName = houseName;
    }

    public String getHouseSize() {
        return houseSize;
    }

    public void setHouseSize(String houseSize) {
        this.houseSize = houseSize;
    }

    public House(String houseName, String houseSize) {
        this.houseName = houseName;
        this.houseSize = houseSize;
    }

    public House(int id,String houseName, String houseSize) {
        this.id = id;
        this.houseName = houseName;
        this.houseSize = houseSize;
    }

    public House() {
    }
}

Repository如下:

package com.dalaoyang.repository;

import com.dalaoyang.entity.House;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * @author dalaoyang
 * @Description
 * @project springboot_learn
 * @package com.dalaoyang.repository
 * @email yangyang@dalaoyang.cn
 * @date 2018/5/28
 */
public interface HouseRepository extends JpaRepository {
}

啟動類上加入@EnableCaching開啟快取,完整程式碼如下:

package com.dalaoyang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
//開啟快取
@EnableCaching
public class SpringbootCacheApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringbootCacheApplication.class, args);
	}
}

還是和以往一樣,使用Controller做測試,先展示一下程式碼:

package com.dalaoyang.controller;

import com.dalaoyang.entity.House;
import com.dalaoyang.repository.HouseRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author dalaoyang
 * @Description
 * @project springboot_learn
 * @package com.dalaoyang.controller
 * @email yangyang@dalaoyang.cn
 * @date 2018/5/28
 */
@RestController
public class HouseController {

    @Autowired
    private HouseRepository houseRepository;

    //別墅&houseSize=1220平方米
    @GetMapping("/saveHouse")
    @CachePut(value = "house", key = "#id")
    public House saveHouse(Integer id,String houseName,String houseSize){
        House house = new House(id,houseName, houseSize);
        houseRepository.save(house);
        return house;
    }

    //
    @GetMapping("/queryHouse")
    @Cacheable(value = "house", key = "#id")
    public House queryHouse(Integer id){
        House house = houseRepository.findOne(id);
        return house;
    }

    //
    @GetMapping("/deleteHouse")
    @CacheEvict(value = "house", key = "#id")
    public String deleteHouse(Integer id){
        houseRepository.delete(id);
        return "success";
    }

    //
    @GetMapping("/deleteCache")
    @CacheEvict(value = "house", allEntries = true)
    public void deleteCache() {
    }
}

解釋測試方法

方法中使用到了@CachePut註解,這個註解直接將返回值放入快取中,通常用於儲存和修改方法中

方法中使用到了@Cacheable註解,這個註解在執行前先檢視快取中是不是已經存在了,如果存在,直接返回。如果不存在,將方法的返回值放入快取。

方法中使用到了@CacheEvict註解,這個註解在執行方法執行成功後會從快取中移除

這個方法的也是使用的@CacheEvict註解,不同的是使用了allEntries熟悉,預設為false,true的時候移除所有快取。

,然後檢視資料庫和控制檯,如下圖:

圖片描述

圖片描述

,檢視頁面資料和控制檯。因為設定了列印執行jpa查詢的話列印sql,看下圖控制檯沒有列印,證明在儲存的時候@CachePut註解已經將其放入了快取中。

圖片描述

圖片描述

然後在次訪問查詢方法,檢視控制檯如下,可以到清空快取後,在訪問就需要查詢資料庫。

圖片描述

,然後在方法查詢方法,檢視控制檯如下,可以到刪除快取後,在訪問也查詢了資料庫。

圖片描述

原始碼下載 :


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3407/viewspace-2804706/,如需轉載,請註明出處,否則將追究法律責任。

相關文章