1. 程式人生 > >SpringBoot Maven環境下實現cache快取

SpringBoot Maven環境下實現cache快取

一 前期準備

1.SpringBoot + maven
2.本文使用分散式快取 即以redis作為快取容器

二 專案依賴

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

備註:依次為redis支援,web支援,測試支援。

三 專案目錄結構


1 配置檔案application

#========== 伺服器 配置資訊===========#
#伺服器埠對映
server.port=8099
#服務專案名
server.servlet.path=/SpringBoot-cache


#==========cache 配置資訊===========#
#快取儲存時間 單位ms
spring.cache.redis.time-to-live=10000
#快取類別 可以不設定系統自動識別
spring.cache.type=redis


#==========redis 配置資訊===========#

#(單機redis)資料庫ip
spring.redis.host=127.0.0.1
#(單機redis)資料庫埠
spring.redis.port= 6379
#資料庫指定索引
spring.redis.database= 1
#資料庫密碼
spring.redis.password=
#超時時間
spring.redis.timeout= 5000
#連線池最大連線數,負值表示不限制
spring.redis.jedis.pool.max-active= 1000
#連線池中最大空閒連線
spring.redis.jedis.pool.max-idle= 10
#連線池中最小空閒連線
spring.redis.jedis.pool.min-idle= 2
#連線池最大阻塞等待時間,負值表示不限制
spring.redis.jedis.pool.max-wait= -1


備註:由於使用redis作為快取容器,需要redis配置。spring-cache能自動識別快取類別,redis採用快取時效性管理快取。

也可以自定義快取策略進行快取演算法快取演算法

2 快取配置 CacheConfig

package com.zyj.cache;

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Configuration;

import java.lang.reflect.Method;

/**
*@Description: 快取配置檔案
*@Author: zyj 2018/5/26 18:04
*/
@Configuration
@EnableCaching /**啟用快取**/
public class CacheConfig extends CachingConfigurerSupport {

    /**
    *@Description: 重寫主鍵生成策略
    *@Author: zyj 2018/5/26 18:15
    */
    @Override
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object o, Method method, Object... objects){
                //TODO 結合object和method上面的註解資訊 進行快取註解設計
                StringBuilder sb = new StringBuilder();
                sb.append("KEY--");
                sb.append(o.getClass().getName());
                sb.append(method.getName());
                for (Object obj : objects) {
                    sb.append(obj.toString());
                }
                System.out.println(sb.toString());
                return sb.toString();
            }
        };
    }

}

備註:若不自定義快取主鍵自定義,則不需要繼承和重寫方法,僅需要@EnableCache

3.快取使用 CacheTestService

package com.zyj.service;

import com.zyj.bean.CacheTestBean;
import com.zyj.cache.CacheConfig;
import io.netty.util.internal.StringUtil;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
*@Description: 快取測試服務
*@Author: zyj 2018/5/26 18:32
*/
@Service
public class CacheTestService {
    /**模擬資料庫進行儲存**/
    public  Map<String,CacheTestBean> list = new HashMap<String,CacheTestBean>();


    /**
    *@Description: 新增到map
    *@Author: zyj 2018/5/26 18:43
    */
    @CachePut(value = "cacheTestBean", key="#cacheTestBean.key",condition = "#cacheTestBean.name != null ")
    public CacheTestBean add(CacheTestBean cacheTestBean){
        if(null!=cacheTestBean
                &&!StringUtil.isNullOrEmpty(cacheTestBean.getKey())
                &&!list.containsKey(cacheTestBean.getKey())){
            /**設定建立時間**/
            cacheTestBean.setCreatTime(new Date());
            System.out.println("新增到記憶體:"+cacheTestBean);
            return list.put(cacheTestBean.getKey(),cacheTestBean);
        }
        return new CacheTestBean();
    }

    /**
     *@Description: 獲取map
     *@Author: zyj 2018/5/26 18:43
     */
    @Cacheable(value = "cacheTestBean",key="#key", condition = "#key != null ")
    public CacheTestBean get(String key){
        if(!StringUtil.isNullOrEmpty(key)&&list.containsKey(key)){
            CacheTestBean current=list.get(key);
            /**設定更新時間**/
            current.setUpdateTime(new Date());
            list.put(key,current);
            System.out.println("讀取記憶體:"+current);
            return current;
        }
        return new CacheTestBean();
    }

    /**
     *@Description: 刪除map
     *@Author: zyj 2018/5/26 18:43
     */
    @CacheEvict(value = "cacheTestBean",key="#key",condition = "#key != null ")
    public CacheTestBean del(String key){
        if(!StringUtil.isNullOrEmpty(key)&&list.containsKey(key)){
            System.out.println("刪除記憶體:"+key);
            return list.remove(key);
        }
        return new CacheTestBean();
    }
}

備註:使用map代替資料庫查詢,不影響快取使用。

@Cacheable

最常用的註解,會把被註解方法的返回值快取。工作原理是:首先在快取中查詢,如果沒有執行方法並快取結果,然後返回資料。此註解的快取名必須指定,和cacheManager中的caches中的某一個Cache的name值相對應。可以使用value或cacheNames指定。
如果沒有指定key屬性,spring會使用預設的主鍵生成器產生主鍵。也可以自定義主鍵,在key中可以使用SpEL表示式。
value (也可使用 cacheNames) : 可看做名稱空間,表示存到哪個快取裡了。
key : 表示名稱空間下快取唯一key,使用Spring Expression Language(簡稱SpEL,詳見參考文獻[5])生成。

condition : 表示在哪種情況下才快取結果(對應的還有unless,哪種情況不快取),同樣使用SpEL

@CacheEvict 

該註解負責從快取中顯式移除資料,通常快取資料都有有效期,當過期時資料也會被移除。
value (也可使用 cacheNames) : 同Cacheable註解,可看做名稱空間。表示刪除哪個名稱空間中的快取 
allEntries: 標記是否刪除名稱空間下所有快取,預設為false
condition : 表示在哪種情況下才快取結果(對應的還有unless,哪種情況不快取),同樣使用SpEL
key: 同Cacheable註解,代表需要刪除的名稱空間下唯一的快取key。
beforeInvocation:在方法呼叫前還是呼叫後完成移除操作。true/false



@CachePut 

先執行方法,然後將返回值放回快取。可以用作快取的更新,可用於後臺儲存配置時及時重新整理快取。
value: 同上
key: 同上
condition(unless): 同上


4.快取測試

CacheTestBean

package com.zyj.bean;

import java.io.Serializable;
import java.util.Date;

/**
*@Description: 快取測試實體
*@Author: zyj 2018/5/26 18:28
*/
public class CacheTestBean implements Serializable{

    /**鍵**/
    String key;
    /**值**/
    String name;
    /**建立時間**/
    Date creatTime;
    /**更新時間**/
    Date updateTime;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreatTime() {
        return creatTime;
    }

    public void setCreatTime(Date creatTime) {
        this.creatTime = creatTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }


    @Override
    public String toString() {
        return "CacheTestBean{" +
                "key='" + key + '\'' +
                ", name='" + name + '\'' +
                ", creatTime=" + creatTime +
                ", updateTime=" + updateTime +
                '}';
    }
}

CacheTestController

package com.zyj.controller;

import com.zyj.bean.CacheTestBean;
import com.zyj.service.CacheTestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import sun.misc.Cache;

/**
*@Description: 快取測試控制器
*@Author: zyj 2018/5/26 18:51
*/
@RestController
@RequestMapping("/Cache")
public class CacheTestController {

    @Autowired
    CacheTestService cacheTestService;


    /**
    *@Description: 測試快取
    *@param cacheTestBean
    *@return com.zyj.bean.CacheTestBean
    *@Author: zyj 2018/5/26 22:47
    */
    @RequestMapping("/add")
    public CacheTestBean testAdd(CacheTestBean cacheTestBean){
        return cacheTestService.add(cacheTestBean);
    }


    /**
     *@Description: 測試獲取快取
     *@param key
     *@return com.zyj.bean.CacheTestBean
     *@Author: zyj 2018/5/26 22:47
     */
    @RequestMapping("/get")
    public CacheTestBean testGet(String key){
        CacheTestBean current=cacheTestService.get(key);
        System.out.println("獲得資料"+current);
        return current;
    }


    /**
     *@Description: 測試刪除快取
     *@param key
     *@return com.zyj.bean.CacheTestBean
     *@Author: zyj 2018/5/26 22:47
     */
    @RequestMapping("/del")
    public CacheTestBean testDel(String key){
        return cacheTestService.del(key);
    }

}

5.測試結果

存取資料,將進入資料已經快取當中 命名格式以 快取服務註釋一致



讀取資料  快取已有則讀取快取資料  快取失效後讀取記憶體資料並再次快取


備註:若不定義快取key的規則,則使用CacheConfig中主鍵生成規則,親測有效

祝你成功!

相關推薦

SpringBoot Maven環境實現cache快取

一 前期準備1.SpringBoot + maven2.本文使用分散式快取 即以redis作為快取容器二 專案依賴<dependency> <groupId>org.springframework.boot</groupId>

SpringBoot+Mybatis環境如何用Redis做Mybatis的二級快取

mybatis的一級快取和二級快取? 一級快取是SqlSession級別的快取。在操作資料庫時需要構造 sqlSession物件,在物件中有一個(記憶體區域)資料結構(HashMap)用於儲存快取資料。不同的sqlSession之間的快取資料區域(HashMap)是互相不影響的。  

springboot環境實現讀寫分離

本文講述springboot環境下構造讀寫分離的框架; 讀寫分離 有哪些好處呢,相信不用多講,大家能夠花時間看這篇文章,那麼就很清楚它的應用場景了,下面我們開始直接進入正題; 讀寫分離其實就是在底層替換資料來源即可,針對一主一從的情況下資料來源切換比較簡單,那麼在一主多從的

SSM+Maven環境上傳檔案到資料庫指定欄位中例項(已實現)

package com.qjc.controller; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import javax.annotation.Resource

Swift環境實現UILabel居上 居中 居對齊

label 復制 圖例 limit ret requested art urn int 首先在Xcode中新建.h文件,將下面代碼復制進去 // // myUILabel.h // // // Created by yexiaozi_007 on 3/4/13

如何在生產環境實現每天自動備份mysql數據庫

mysql mysql備份 自動備份mysql mysql數據庫備份 甘兵 1、描述 我相信很多朋友在工作都都會有這種需求,老板或領導讓你每天都要備份mysql數據庫,你該如何實現呢,是每天到一定的時間在服務器上敲一遍mysql的備份命令,還是想寫個腳本,定時定點的自動備份呢?我相信

Mac環境實現alias重命名命令(永久生效)

第三方 file img lane 太多的 ios 文件中 成功 蒲公英 Mac環境下實現alias重命名命令 iOS Dev在使用Xcode完成代碼編寫後,可能需要上傳至第三方分發應用給測試人員進行相關測試,比如蒲公英、FIR. 效率較高的上傳方式是借助於Fastlane

在windows環境實現開機延遲啟動tomcat

jdk 延遲 JD not tar rec def rtu fin 如果說我們的服務器斷電了 開機之後還需要手動開下服務 還需要遠程連接上 然後一個一個開啟 是不是很麻煩 我們可以寫一個bat腳本 然後設置開機5分鐘之後啟動tomcat 首先配置環境變量:

交換機環境實現同vlan不能互通卻都能訪問服務器的兩種方法

trunk和hrbrid的驗證網絡拓撲圖:一、通過hybrid實現可以實現同VLAN不通,卻都可以訪問服務器。思路:PC機識別不了VLAN所帶的標簽,所以PC5想要接收VLAN4所發的數據,就應該在LSW8中的GE 0/0/1的接口設置取掉VLAN4和VLAN2的標簽, 同理,PC6也要取掉VLAN4和VLA

python環境實現OrangePi Zero寄存器訪問及GPIO控制

adc map函數 操作 pack 模式 更改 truct 不可 共享   最近入手OrangePi Zero一塊,程序上需要使用板子上自帶的LED燈,在網上一查,不得不說OPi的支持跟樹莓派無法相比。自己摸索了一下,實現簡單的GPIO控制方法,作者的Zero安裝的是Arm

關於maven環境使用pom.xml引入包名.lastUpdate包的解決辦法

文件 date clip 下使用 console -o maven pom i-o 今天在導入POI-OOXML的時候老師缺失xmlbeans包,而且刷新pom文件總是生成一個lastupdate文件,大小為1KB,終於找到解決辦法。 1.首先刪除想要的jar包所在文件夾

Linux環境實現多臺kvm虛擬機器之間組成amp架構連線

規劃圖 一、安裝kvm 1、環境準備 安裝之前,需要lscpu看flag是否包含svm或者vmx,該標誌表示cpu是否支援硬體虛擬化,而且需要64位架構,命令:lscpu | egrep 'vmx|lv|svm' 如果用的是vmware,需要開啟 開機後再檢視,模組已經裝入(Cent

在 Ubuntu 環境實現插入滑鼠自動關閉觸控板

Ubuntu 以及其他衍生版本,如 Linux Mint 等等都可以用官方的 PPA 來安裝“觸控板指示”應用程式。開啟一個終端,執行以下命令: sudo add-apt-repository ppa:atareao/atareao sudo apt update sudo apt install t

Linux環境實現LVS-NAT模型和LVS-DR模型

一、實現LVS-NAT模型 1、LVS主機yum -y install ipvsadm 防火牆關閉,RS1、RS2安裝httpd,新增index.html,路由器新增到達172.20.0.123的路由表 2、各主機配置 RS1 並存在 RS2 並同時有 router,開

Linux環境實現MariaDB資料庫的三種備份和還原

一、tar工具的使用  1、備份 (1)停止服務,3306埠關閉 (2)看下配置檔案有沒有關鍵日誌存放於其它目錄的,檢查/etc/my.cnf,再檢查下/etc/my.cnf.d/下有沒有配置檔案放置其他地方,有的話也需要一起拷貝歸檔 (3)建立備份目錄,歸檔 (4)開啟服

SpringBoot學習筆記08——解決Cache快取同類中呼叫失敗問題

問題描述 今天遇到了一個問題,使用快取的情況下,如果在快取服務類方法中呼叫快取的方法會呼叫失敗,就是this.快取方法名,這樣使用就不會從快取中獲取資料,而是直接呼叫快取方法,錯誤示例程式碼如下: package com.youyou.address.service; import org

如何在生產環境實現每天自動備份mysql資料庫

www.syncnavigator.cn SyncNavigator 做資料同步時所支援的資料庫型別: 支援sqlserver 2000-2014所有版本,全相容,和MYsql 4.x 、MYsql 5.x 、MYsql 6.x版本。 來源資料庫和目標資料庫可以版本不同,比如:來源資料庫

Linux環境實現keepalive支援的LVS高可用性和NGINX的單主模型雙主模型高可用

實驗:實現高可用的LVS-DR模型  1、準備兩臺RS伺服器 2、將兩臺lVS安裝httpd或nginx,用來做sorry server 3、定義RS伺服器 在後端伺服器RS1寫配置指令碼 執行指令碼後,ifconfig 之後指令碼傳給RS2,執行此指令碼,同樣存在l

Linux環境清理Tomcat快取

Linux環境下清理Tomcat快取 2017年11月17日 17:01:52 六塊腹肌的攻城獅 閱讀數:3870 一、問題說明 轉載自:https://www.cnblogs.com/shihaiming/p/5896283.html       Li

在SSM環境實現省市區3級聯查

          下面我們就以程式碼的形式來說一下這個省市區3級聯查是如何實現的。 一.Spring的核心配置檔案            我們知道Spring的核心配置檔案applicationContext通常放在src目錄下,下面就是applicationConte