Spring Boot Cache使用與整合

參考:

  • 史上最全的Spring Boot Cache使用與整合
  • Spring Cache擴展:注解失效時間+主動刷新緩存
    • 項目地址


使用本地Caffeine緩存

引入依賴包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>2.6.2</version>
</dependency>

自定義Caffeine配置

  • CachingConfig.java
package com.vcredit.vmp.checkcenter.config;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.vcredit.vmp.checkcenter.common.properties.CaffeineCacheProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCache;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;import java.time.Duration;
import java.util.*;
/*** 緩存配置* @author kancy*/
@Configuration
@EnableCaching
public class CachingConfig {@AutowiredCaffeineCacheProperties caffeineCacheProperties;/*** 創建基于Caffeine的Cache Manager* @return*/@Bean@Primary@ConditionalOnProperty(prefix = "system.cache.caffeine" , name = "enabled", havingValue = "true")public CacheManager caffeineCacheManager() {SimpleCacheManager cacheManager = new SimpleCacheManager();Map<String, CaffeineCache> cacheMap = new HashMap();// 設置全局配置的本地緩存List<String> globalCacheNames = caffeineCacheProperties.getCacheName();if(globalCacheNames !=null && !globalCacheNames.isEmpty()){addCacheObject(cacheMap, globalCacheNames, caffeineCacheProperties.getExpireAfterWrite(),caffeineCacheProperties.getExpireAfterAccess(), caffeineCacheProperties.getMaximumSize());}// 設置自定義屬性緩存, 可以覆蓋全局緩存List<CaffeineCacheProperties.Config> configs = caffeineCacheProperties.getConfigs();if(configs != null && !configs.isEmpty()){for (CaffeineCacheProperties.Config config : configs) {List<String> cacheNames = config.getCacheName();if (cacheNames == null || cacheNames.isEmpty()){continue;}Duration expireAfterWrite = Optional.ofNullable(config.getExpireAfterWrite()).orElse(caffeineCacheProperties.getExpireAfterWrite());Duration expireAfterAccess = Optional.ofNullable(config.getExpireAfterAccess()).orElse(caffeineCacheProperties.getExpireAfterAccess());Long maximumSize = Optional.ofNullable(config.getMaximumSize()).orElse(caffeineCacheProperties.getMaximumSize());addCacheObject(cacheMap, cacheNames, expireAfterWrite, expireAfterAccess, maximumSize);}}// 加入到緩存管理器進行管理cacheManager.setCaches(cacheMap.values());return cacheManager;}private void addCacheObject(Map<String, CaffeineCache> cacheMap, List<String> cacheNames, Duration expireAfterWrite, Duration expireAfterAccess, Long maximumSize) {for (String cacheName : cacheNames) {// spring.cache.caffeine: maximumSize=500,expireAfterAccess=10s,expireAfterWrite=15sCaffeine<Object, Object> recordStats = Caffeine.newBuilder().recordStats().maximumSize(maximumSize);if(expireAfterAccess != null) recordStats.expireAfterAccess(expireAfterAccess);if(expireAfterWrite != null) recordStats.expireAfterWrite(expireAfterWrite);Cache<Object, Object> cache = recordStats.build();CaffeineCache caffeineCache = new CaffeineCache(cacheName,cache);// 覆蓋添加cacheMap.put(cacheName, caffeineCache);}}
}
  • CaffeineCacheProperties.java
package com.vcredit.vmp.checkcenter.common.properties;import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;import java.time.Duration;
import java.util.List;/*** Caffeine本地緩存自定義配置* @author kancy*/
@Getter
@Setter
@Configuration
@ConfigurationProperties("system.cache.caffeine")
@ConditionalOnProperty(prefix = "system.cache.caffeine" , name = "enabled", havingValue = "true")
public class CaffeineCacheProperties {private List<String> cacheName;private Duration expireAfterWrite;private Duration expireAfterAccess;private Long maximumSize = Long.valueOf(-1);private List<Config> configs;@Getter@Setterpublic static class Config {private List<String> cacheName;Duration expireAfterWrite;Duration expireAfterAccess;Long maximumSize;}
}
  • application.yml
system.cache.caffeine:enabled: true# 全局配置cacheName: cache1,cache2,cache3expireAfterWrite: 60sexpireAfterAccess: 30smaximumSize: 500# 自定義配置,cacheName相同可覆蓋全局configs:- cacheName: checkApplyCacheexpireAfterAccess: 10s- cacheName: userQueryCacheexpireAfterAccess: 15s

使用緩存

@Cacheable(value = { "checkApplyCache" }, key="#req.md5")
public Result check(CheckReq req) {// your code...return Result.ok();
}

轉載于:https://www.cnblogs.com/kancy/p/11162950.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247567.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247567.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247567.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue-cli的打包配置文件

轉載原文: 詳解 vue-cli 的打包配置文件代碼&#xff08;給大家寫寫注釋&#xff09;. 一、vue-cli都做了什么 1、build/dev-server.js 文件 項目node的啟動文件&#xff0c;這里面做了webpack配置和node操作&#xff0c; 2、build/webpack.base.conf.js webpack基本配置文件…

Node.js 部署免費/自動續訂 HTTPS

統計了使用 Chrome 瀏覽器&#xff0c;訪問的站點統計中&#xff0c;HTTPS 使用率的增長情況&#xff1a;而在今年 2 月份&#xff0c;Chrome 團隊也宣布&#xff0c;將在 2018 年 7 月份發布的 Chrome 68 中&#xff0c;將沒有部署 HTTPS 的網站標記為 "不安全"。簡…

GSON 循環引用的對象轉為 JSON 造成棧溢出

對象轉 JSON 可能引發棧溢出的異常&#xff0c;一般是因為對象中的循環引用引起不斷遞歸。 常見的作法就是&#xff1a; 換一種 JSON 的序列化工具&#xff0c;比如 fastjson 默認支持消除對同一對象循環引用transient 修飾屬性顯式排除對象的某些屬性1. java對象引用成環說明 …

一些雜七雜八的前端知識1

一、this指向 this是函數運行時自動生成的一個內部對象&#xff0c;只能在函數內部使用 1. 指向全局變量 純粹的函數調用 2. 作為對象方法的調用 對象調用某個函數&#xff0c;這個函數里面所包含的this也就指向使用這個函數的對象了 3. 函數構造新對象時調用 new 4. a…

最新的vue webpack模板沒有dev-server.js文件,進行后臺數據模擬筆記

最新的vue里dev-server.js被替換成了webpack-dev-conf.js 在模擬后臺數據的時候直接在webpack-dev-conf.js文件中修改 第一步&#xff0c;在const portfinder require(‘portfinder’)后添加//第一步 const express require(express) const app express()//請求server var a…

20080331 - What is a PID, How is it useful when troubleshooting a system

PID Process Identifier, 是一個全局唯一的用來標識進程的整數。在多任務系統中&#xff0c;可用來診斷系統中發生錯誤的進程。 轉載于:https://www.cnblogs.com/likun/archive/2008/03/31/1130458.html

記一次el-input使用的坑

記一次el-input使用的坑 el-input使用不同與原生input&#xff0c;所以在vue中改變綁定的數據時需注意 <el-input v-model"form.schedule" input"validateNumber($event)" />要想在input時改變form.schedule的值來改變輸入框顯示的值&#xff0c;以…

使用pm2啟動Node和Vue項目教程

安裝pm2 $ npm install -g pm2 命令行全局安裝pm2 將pm2加入到命令中去?1234ln -s /usr/local/src/node-v8.9.1-linux-x64/bin/pm2 /usr/local/bin/pm2ln -s /usr/local/src/node-v8.9.1-linux-x64/bin/pm2-dev /usr/local/bin/pm2-devln -s /usr/local/src/node-v8.9.1-lin…

對正則的研究

視頻鏈接地址&#xff08;視頻格式可按需增刪&#xff09; /^https?:\/\/.*?(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4)$/i 圖片鏈接地址&#xff08;圖片格式可按需增刪&#xff09; /^https?:\/\/.*?(gif|png|jpg|jpeg|webp|svg|psd|bmp|tif)$/i 24小時制時間&a…

MVVM原理還你

眾所周知當下是MVVM盛行的時代&#xff0c;從早期的Angular到現在的React和Vue&#xff0c;再從最初的三分天下到現在的兩虎相爭。 無疑不給我們的開發帶來了一種前所未有的新體驗&#xff0c;告別了操作DOM的思維&#xff0c;換上了數據驅動頁面的思想&#xff0c;果然時代的進…

poj1316

1&#xff0e;鏈接地址 https://vjudge.net/problem/POJ-1316 2&#xff0e;問題描述 In 1949 the Indian mathematician D.R. Kaprekar discovered a class of numbers called self-numbers. For any positive integer n, define d(n) to be n plus the sum of the digits of …

CSS頁面布局解決方案大全

前端布局非常重要的一環就是頁面框架的搭建&#xff0c;也是最基礎的一環。在頁面框架的搭建之中&#xff0c;又有居中布局、多列布局以及全局布局&#xff0c;今天我們就來總結總結前端干貨中的CSS布局。 居中布局 水平居中 1&#xff09;使用inline-blocktext-align&#xff…

AES加密算法的學習筆記

AES簡介高級加密標準(AES,Advanced Encryption Standard)為最常見的對稱加密算法(微信小程序加密傳輸就是用這個加密算法的)。 對稱加密算法也就是加密和解密用相同的密鑰&#xff0c;具體的加密流程如下圖&#xff1a; 下面簡單介紹下各個部分的作用與意義&#xff1a; 明文P沒…

為什么要用setTimeout模擬setInterval ?

setInterval有兩個缺點&#xff1a; 使用setInterval時&#xff0c;某些間隔會被跳過&#xff1b;可能多個定時器會連續執行&#xff1b;在前一個定時器執行完前&#xff0c;不會向隊列插入新的定時器&#xff08;解決缺點一&#xff09;保證定時器間隔&#xff08;解決缺點二&…

前端 crypto-js aes 加解密

背景 前段時間公司做項目&#xff0c;該項目涉及到的敏感數據比較多&#xff0c;經過的一波討論之后&#xff0c;決定前后端進行接口加密處理&#xff0c;采用的是 AES BASE64 算法加密~ 網上關于 AES 對稱加密的算法介紹看上一篇&#xff01; 具體實現 其實搞懂了是怎么一回事…

對排序算法的研究

算法是什么&#xff1f;、 算法&#xff08;Algorithm&#xff09; 代表著用系統的方法描述解決問題的策略機制&#xff0c;可以通過一定規范的 輸入&#xff0c;在有限時間內獲得所需要的 輸出。 一個算法的好壞是通過 時間復雜度 與 空間復雜度 來衡量的。 簡單來說&#xff…

js實用算法

判斷文本是否為回文 定義&#xff1a;如果將一個文本翻轉過來&#xff0c;能和原文本完全相等&#xff0c;那么就可以稱之為“回文”。 方法一&#xff08;字符串、數組內置方法&#xff09;123456789101112131415/** 判斷文字是否為回文* param {string|number} val 需要判斷的…

stylus

stylus格式 指將css中{} &#xff1b;去掉即可

隨筆記錄(2019.7.10)

1、ISO/OSI 網絡七層參考模型 物理層 數據鏈路層 網絡層 傳輸層 會話層 表示層 應用層 2、 TCP/IP 網絡四層模型和五層模型 四層模型&#xff1a; 網絡接口層 網絡層 傳輸層 應用層 五層模型&#xff1a; 物理層 數據鏈路層 網絡層 傳輸層 應用層 3、 協議簇 &#xff08;1&a…

轉發:Ajax動態畫EChart圖表

本人由于項目需要&#xff0c;在狀態變化的時候需要動態繪制對應數據的EChart圖表&#xff0c;并且不刷新整個網頁。 所以就用Ajax動態畫EChart圖表&#xff0c;下面是開發過程中遇到的一些坑的總結。 流程&#xff1a;頁面首次加載時展示一幅原始的圖形&#xff0c;若后臺數據…