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