springboot中JetCache的使用方法小結(jié)
一、背景描述
今天來介紹一下由 Alibaba 開源的一款緩存框架 JetCache。其號稱比 Spring Cache 用起來更加好用,在我使用之后發(fā)現(xiàn)確實(shí)比較好用,步驟也非常簡單。
JetCache 是一個(gè)基于Java 的緩存系統(tǒng)封裝,提供統(tǒng)一的API和注解來簡化緩存的使用。 JetCache 提供了比 SpringCache 更加強(qiáng)大的注解,可以原生的支持 TTL、兩級緩存、分布式自動(dòng)刷新,還提供了 Cache 接口用于手工緩存操作。 當(dāng)前有四個(gè)實(shí)現(xiàn),RedisCache、TairCache(此部分未在github開源)、CaffeineCache(in memory)和一個(gè)簡易的LinkedHashMapCache(in memory),要添加新的實(shí)現(xiàn)也是非常簡單的。
二、JetCache特點(diǎn)與要求
2.1 JetCache的特點(diǎn)
以下簡單描述一下JetCache的特點(diǎn),方便在使用之前做些簡單的了解:
- 通過一致的 Cache API 操作緩存。
- 在方法上面使用注解,就可以實(shí)現(xiàn) TTL 和兩級緩存。
- 使用注釋創(chuàng)建和配置 Cache 實(shí)例。
- 自動(dòng)收集 Cache 實(shí)例和方法緩存的訪問統(tǒng)計(jì)信息。
- key 生成和 value 序列化的策略可以定制。
- 分布式緩存自動(dòng)刷新和分布式鎖定。(2.2)
- 使用 Cache API 進(jìn)行異步訪問。(2.2版本以上,redis客戶端)
- 支持 Spring Boot。
2.2 JetCache的要求
- JetCache需要JDK1.8、Spring Framework4.0.8以上版本。
- Spring Boot為可選,需要1.1.9以上版本。
- 如果不使用注解(僅使用jetcache-core),Spring Framework也是可選的,此時(shí)使用方式與Guava/Caffeine cache類似。
三、使用步驟
以下案例分別為使用 spring boot 的項(xiàng)目,另外一個(gè)是未使用 spring boot 的項(xiàng)目:
3.1 spring boot 項(xiàng)目
使用步驟以 spring boot 項(xiàng)目為例:
3.1.1 引入依賴
現(xiàn)在目前最新的版本是 2.7.0.M1,以后還會繼續(xù)更新,如果想使用最新版本的可以去 maven 的中央倉庫下載哈
<!-- jet cache-->
<dependency>
<groupId>com.alicp.jetcache</groupId>
<artifactId>jetcache-starter-redis</artifactId>
<version>2.7.0.M1</version>
</dependency>3.1.2 application.yml配置
先來張圖記錄一下配置,當(dāng)然也可以直接從圖下面的配置里粘貼,哈哈

如果想直接復(fù)制粘貼的話,從下面的文本框中 cv 一下(記得修改redis的地址和用戶名密碼哈)即可。
jetcache:
statIntervalMinutes: 15
areaInCacheName: false
local:
default:
type: linkedhashmap
keyConvertor: fastjson
limit: 1000
remote:
default:
type: redis
keyConvertor: fastjson
valueEncoder: java
valueDecoder: java
poolConfig:
minIdle: 5
maxIdle: 20
maxTotal: 50
database: 16 # 連接工廠使用的數(shù)據(jù)庫索引
host: xxx # 此處需要修改哈
port: xxx # 此處需要修改哈
password: xxx # 此處需要修改哈3.1.3 啟動(dòng)類注解
@EnableMethodCache(basePackages = "com.iot.back.message")

3.1.4 方法上添加注解
expire表示返回值User對象,將在3600秒后過期,JetCache默認(rèn)使用所有入?yún)⑸删彺娴膋ey。

3.2 未使用 Spring boot 的項(xiàng)目
以下是未使用 SpringBoot 的配置方式,如果沒有使用spring boot,可以按下面的方式配置(這里使用jedis客戶端連接redis為例)。
3.2.1 引入依賴
<dependency>
<groupId>com.alicp.jetcache</groupId>
<artifactId>jetcache-anno</artifactId>
<version>2.6.4</version>
</dependency>
<dependency>
<groupId>com.alicp.jetcache</groupId>
<artifactId>jetcache-redis</artifactId>
<version>2.6.4</version>
</dependency>3.2.2 編寫配置類
配置了這個(gè)JetCacheConfig類以后,可以使用@CreateCache和@Cached注解。
package com.company.mypackage;
import java.util.HashMap;
import java.util.Map;
import com.alicp.jetcache.anno.CacheConsts;
import com.alicp.jetcache.anno.config.EnableCreateCacheAnnotation;
import com.alicp.jetcache.anno.config.EnableMethodCache;
import com.alicp.jetcache.anno.support.GlobalCacheConfig;
import com.alicp.jetcache.anno.support.SpringConfigProvider;
import com.alicp.jetcache.embedded.EmbeddedCacheBuilder;
import com.alicp.jetcache.embedded.LinkedHashMapCacheBuilder;
import com.alicp.jetcache.redis.RedisCacheBuilder;
import com.alicp.jetcache.support.FastjsonKeyConvertor;
import com.alicp.jetcache.support.JavaValueDecoder;
import com.alicp.jetcache.support.JavaValueEncoder;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.util.Pool;
@Configuration
@EnableMethodCache(basePackages = "com.company.mypackage")
@EnableCreateCacheAnnotation
public class JetCacheConfig {
@Bean
public Pool<Jedis> pool(){
GenericObjectPoolConfig pc = new GenericObjectPoolConfig();
pc.setMinIdle(2);
pc.setMaxIdle(10);
pc.setMaxTotal(10);
return new JedisPool(pc, "localhost", 6379);
}
@Bean
public SpringConfigProvider springConfigProvider() {
return new SpringConfigProvider();
}
@Bean
public GlobalCacheConfig config(Pool<Jedis> pool){
// public GlobalCacheConfig config(SpringConfigProvider configProvider, Pool<Jedis> pool){ // for jetcache 2.5
Map localBuilders = new HashMap();
EmbeddedCacheBuilder localBuilder = LinkedHashMapCacheBuilder
.createLinkedHashMapCacheBuilder()
.keyConvertor(FastjsonKeyConvertor.INSTANCE);
localBuilders.put(CacheConsts.DEFAULT_AREA, localBuilder);
Map remoteBuilders = new HashMap();
RedisCacheBuilder remoteCacheBuilder = RedisCacheBuilder.createRedisCacheBuilder()
.keyConvertor(FastjsonKeyConvertor.INSTANCE)
.valueEncoder(JavaValueEncoder.INSTANCE)
.valueDecoder(JavaValueDecoder.INSTANCE)
.jedisPool(pool);
remoteBuilders.put(CacheConsts.DEFAULT_AREA, remoteCacheBuilder);
GlobalCacheConfig globalCacheConfig = new GlobalCacheConfig();
// globalCacheConfig.setConfigProvider(configProvider); // for jetcache 2.5
globalCacheConfig.setLocalCacheBuilders(localBuilders);
globalCacheConfig.setRemoteCacheBuilders(remoteBuilders);
globalCacheConfig.setStatIntervalMinutes(15);
globalCacheConfig.setAreaInCacheName(false);
return globalCacheConfig;
}
}
3.3 屬性表
關(guān)于配置文件和注解里的每個(gè)字段含義詳情請移步另一篇文章,特別詳細(xì)的說明解釋JetCache的配置說明和注解屬性說明
@Cached注解和@CreateCache的屬性非常類似,但是多幾個(gè):
| 屬性 | 默認(rèn)值 | 說明 |
|---|---|---|
| area | “default” | 如果在配置中配置了多個(gè)緩存area,在這里指定使用哪個(gè)area |
| name | 未定義 | 指定緩存的唯一名稱,不是必須的,如果沒有指定,會使用類名+方法名。name會被用于遠(yuǎn)程緩存的key前綴。另外在統(tǒng)計(jì)中,一個(gè)簡短有意義的名字會提高可讀性。 |
| key | 未定義 | 使用SpEL指定key,如果沒有指定會根據(jù)所有參數(shù)自動(dòng)生成。 |
| expire | 未定義 | 超時(shí)時(shí)間。如果注解上沒有定義,會使用全局配置,如果此時(shí)全局配置也沒有定義,則為無窮大 |
| timeUnit | TimeUnit.SECONDS | 指定expire的單位 |
| cacheType | CacheType.REMOTE | 緩存的類型,包括CacheType.REMOTE、CacheType.LOCAL、CacheType.BOTH。如果定義為BOTH,會使用LOCAL和REMOTE組合成兩級緩存 |
| localLimit | 未定義 | 如果cacheType為LOCAL或BOTH,這個(gè)參數(shù)指定本地緩存的最大元素?cái)?shù)量,以控制內(nèi)存占用。如果注解上沒有定義,會使用全局配置,如果此時(shí)全局配置也沒有定義,則為100 |
| localExpire | 未定義 | 僅當(dāng)cacheType為BOTH時(shí)適用,為內(nèi)存中的Cache指定一個(gè)不一樣的超時(shí)時(shí)間,通常應(yīng)該小于expire |
| serialPolicy | 未定義 | 指定遠(yuǎn)程緩存的序列化方式。可選值為SerialPolicy.JAVA和SerialPolicy.KRYO。如果注解上沒有定義,會使用全局配置,如果此時(shí)全局配置也沒有定義,則為SerialPolicy.JAVA |
| keyConvertor | 未定義 | 指定KEY的轉(zhuǎn)換方式,用于將復(fù)雜的KEY類型轉(zhuǎn)換為緩存實(shí)現(xiàn)可以接受的類型,當(dāng)前支持KeyConvertor.FASTJSON和KeyConvertor.NONE。NONE表示不轉(zhuǎn)換,F(xiàn)ASTJSON可以將復(fù)雜對象KEY轉(zhuǎn)換成String。如果注解上沒有定義,會使用全局配置。 |
| enabled | true | 是否激活緩存。例如某個(gè)dao方法上加緩存注解,由于某些調(diào)用場景下不能有緩存,所以可以設(shè)置enabled為false,正常調(diào)用不會使用緩存,在需要的地方可使用CacheContext.enableCache在回調(diào)中激活緩存,緩存激活的標(biāo)記在ThreadLocal上,該標(biāo)記被設(shè)置后,所有enable=false的緩存都被激活 |
| cacheNullValue | false | 當(dāng)方法返回值為null的時(shí)候是否要緩存 |
| condition | 未定義 | 使用SpEL指定條件,如果表達(dá)式返回true的時(shí)候才去緩存中查詢 |
| postCondition | 未定義 | 使用SpEL指定條件,如果表達(dá)式返回true的時(shí)候才更新緩存,該評估在方法執(zhí)行后進(jìn)行,因此可以訪問到#result |
四、依賴哪個(gè)Jar?
- jetcache-anno-api:定義jetcache的注解和常量,不傳遞依賴。如果你想把Cached注解加到接口上,又不希望你的接口jar傳遞太多依賴,可以讓接口jar依賴jetcache-anno-api。
- jetcache-core:核心api,完全通過編程來配置操作Cache,不依賴Spring。兩個(gè)內(nèi)存中的緩存實(shí)現(xiàn)LinkedHashMapCache和CaffeineCache也由它提供。
- jetcache-anno:基于Spring提供@Cached和@CreateCache注解支持。
- jetcache-redis:使用jedis提供Redis支持。
- jetcache-redis-lettuce(需要JetCache2.3以上版本):使用lettuce提供Redis支持,實(shí)現(xiàn)了JetCache異步訪問緩存的的接口。
- jetcache-starter-redis:Spring Boot方式的Starter,基于Jedis。
- jetcache-starter-redis-lettuce(需要JetCache2.3以上版本):Spring Boot方式的Starter,基于Lettuce。
參考文檔:《JetCache官方文檔》
到此這篇關(guān)于springboot中JetCache的使用方法小結(jié)的文章就介紹到這了,更多相關(guān)springboot JetCache使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MapStruct實(shí)體轉(zhuǎn)換及List轉(zhuǎn)換的方法講解
今天小編就為大家分享一篇關(guān)于MapStruct實(shí)體轉(zhuǎn)換及List轉(zhuǎn)換的方法講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
Java中List轉(zhuǎn)Map的幾種具體實(shí)現(xiàn)方式和特點(diǎn)
這篇文章主要介紹了幾種常用的List轉(zhuǎn)Map的方式,包括使用for循環(huán)遍歷、Java8StreamAPI、ApacheCommonsCollections和GoogleGuava,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01
Java開發(fā)者必看:IoTDB原生接口SessionPool?的高效使用與避坑指南
本文是一份關(guān)于Apache?IoTDB原生Java接口中SessionPool的詳盡開發(fā)指南,深入講解連接池的核心概念、初始化步驟、數(shù)據(jù)寫入(包括高效的?Tablet?模式與SQL操作實(shí)戰(zhàn),并附帶了全量接口參數(shù)說明表格與專家級的最佳實(shí)踐,幫助開發(fā)者徹底掌握?IoTDB?在并發(fā)場景下的高性能開發(fā)技巧2026-04-04
java將數(shù)據(jù)寫入內(nèi)存,磁盤的方法
下面小編就為大家分享一篇java將數(shù)據(jù)寫入內(nèi)存,磁盤的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
使用GraalVM如何將SpringBoot項(xiàng)目打包成exe
本文介紹了如何使用GraalVM和Maven將Spring Boot項(xiàng)目打包成可執(zhí)行文件的步驟,并詳細(xì)解釋了在打包過程中遇到的常見錯(cuò)誤及其解決方法2024-12-12
java實(shí)用小技巧之判斷l(xiāng)ist是否有重復(fù)項(xiàng)簡單例子
這篇文章主要給大家介紹了關(guān)于java實(shí)用小技巧之判斷l(xiāng)ist是否有重復(fù)項(xiàng)的相關(guān)資料,在開發(fā)工作中我們有時(shí)需要去判斷List集合中是否含有重復(fù)的元素,需要的朋友可以參考下2023-10-10
詳解Java中l(wèi)ist,set,map的遍歷與增強(qiáng)for循環(huán)
這篇文章主要介紹了詳解Java中l(wèi)ist,set,map的遍歷與增強(qiáng)for循環(huán)的相關(guān)資料,需要的朋友可以參考下2017-02-02
Jackson庫進(jìn)行JSON?序列化時(shí)遇到了無限遞歸(Infinite?Recursion)的問題及解決方案
使用Jackson庫進(jìn)行JSON序列化時(shí)遇到了無限遞歸(Infinite?Recursion)問題,這是因?yàn)閮蓚€(gè)實(shí)體類ComPointQuotaEntity和?ComPointEntity之間存在雙向關(guān)聯(lián)point和pointQuota相互引用,本文給大家介紹解決方案,感興趣的朋友一起看看吧2025-03-03

