0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

基于java開發(fā)的緩存框架jetcache簡介

馬哥Linux運維 ? 來源:稀土掘金技術(shù)社區(qū) ? 2023-09-07 10:36 ? 次閱讀

0. 引言

在實際應用中,并不是單一的使用本地緩存或者redis,更多是組合使用來滿足不同的業(yè)務場景,于是如何優(yōu)雅的組合本地緩存和遠程緩存就成了我們要研究的問題,而這一點,阿里開源的jetcache組件幫我們實現(xiàn)了

1. jetcache簡介

jetcache是阿里開源的基于java開發(fā)的緩存框架,支持多種緩存類型:本地緩存、分布式緩存、多級緩存。能夠滿足不同業(yè)務場景的緩存需求。

jetcache具有上手簡單、性能高效、拓展性強的特點。支持緩存預熱 、緩存key前綴等功能。結(jié)合spring-cache使用,可以實現(xiàn)十分優(yōu)雅的緩存類型切換

2. jetcache使用

1、引入依賴,這里我們使用sringboot項目框架,同時使用redis作為遠程緩存。于是我們引入jetcache-starter-redis依賴,這里我的springboot版本為2.6.13

如果是非springboot項目可以參考官網(wǎng)說明配置

8f7e9880-4cb5-11ee-a25d-92fbcf53809c.png


com.alicp.jetcache
jetcache-starter-redis
2.7.0


 

redis.clients
jedis
4.3.1

對應的版本說明如下:springboot與jetcache版本關系

8fa17d64-4cb5-11ee-a25d-92fbcf53809c.png

2、修改配置文件,配置redis地址和線程數(shù)

jetcache:
#統(tǒng)計間隔,0表示不統(tǒng)計,開啟后定期在控制臺輸出緩存信息
statIntervalMinutes:15
#是否把cacheName作為遠程緩存key前綴
areaInCacheName:false
#本地緩存配置
local:
default:#default表示全部生效,也可以指定某個cacheName
#本地緩存類型,其他可選:caffeine/linkedhashmap
type:linkedhashmap
keyConvertor:fastjson
#遠程緩存配置
remote:
default:#default表示全部生效,也可以指定某個cacheName
type:redis
#key轉(zhuǎn)換器方式n
keyConvertor:fastjson
broadcastChannel:projectA
#redis序列化方式
valueEncoder:java
valueDecoder:java
#redis線程池
poolConfig:
minIdle:5
maxIdle:20
maxTotal:50
#redis地址與端口
host:127.0.0.1
port:6379

更詳細的參數(shù)配置

8fb5b57c-4cb5-11ee-a25d-92fbcf53809c.png

3、啟動類添加注解@EnableCreateCacheAnnotation,開啟緩存,添加@EnableMethodCache(basePackages = "com.example.jetcachedemo")注解,配置緩存方法掃描路徑

4、使用緩存可以通過三種方式:

方式一(推薦)AOP模式:通過@Cached,@CacheUpdate,@CacheInvalidate注解

@RestController
@RequestMapping("user")
publicclassUserController{

@GetMapping("getRemote")
@Cached(name="userCache:",key="#id",expire=3600,timeUnit=TimeUnit.SECONDS,cacheType=CacheType.REMOTE)
publicUsergetRemote(Longid){
//直接新建用戶,模擬從數(shù)據(jù)庫獲取數(shù)據(jù)
Useruser=newUser();
user.setId(id);
user.setName("用戶remote"+id);
user.setAge(23);
user.setSex(1);
System.out.println("第一次獲取數(shù)據(jù),未走緩存:"+id);
returnuser;
}

@GetMapping("getLocal")
@Cached(name="userCache:",key="#id",expire=3600,timeUnit=TimeUnit.SECONDS,cacheType=CacheType.LOCAL)
publicUsergetLocal(Longid){
//直接新建用戶,模擬從數(shù)據(jù)庫獲取數(shù)據(jù)
Useruser=newUser();
user.setId(id);
user.setName("用戶local"+id);
user.setAge(23);
user.setSex(1);
System.out.println("第一次獲取數(shù)據(jù),未走緩存:"+id);
returnuser;
}

@GetMapping("getBoth")
@Cached(name="userCache:",key="#id",expire=3600,timeUnit=TimeUnit.SECONDS,cacheType=CacheType.BOTH)
publicUsergetBoth(Longid){
//直接新建用戶,模擬從數(shù)據(jù)庫獲取數(shù)據(jù)
Useruser=newUser();
user.setId(id);
user.setName("用戶both"+id);
user.setAge(23);
user.setSex(1);
System.out.println("第一次獲取數(shù)據(jù),未走緩存:"+id);
returnuser;
}

@PostMapping("updateUser")
@CacheUpdate(name="userCache:",key="#user.id",value="#user")
publicBooleanupdateUser(@RequestBodyUseruser){
//TODO更新數(shù)據(jù)庫
returntrue;
}

@PostMapping("deleteUser")
@CacheInvalidate(name="userCache:",key="#id")
publicBooleandeleteUser(Longid){
//TODO從數(shù)據(jù)庫刪除
returntrue;
}

}

這里要注意實體類User一定要實現(xiàn)序列化,即聲明Serializable

@Data
publicclassUserimplementsSerializable{

privateLongid;
privateStringname;
privateIntegerage;
privateIntegersex;
}

方式二 API模式:通過@CreateCache,注:在jetcache 2.7 版本CreateCache注解已廢棄,不推薦使用

@RestController
@RequestMapping("user2")
publicclassUser2Controller{

@CreateCache(name="userCache:",expire=3600,timeUnit=TimeUnit.SECONDS,cacheType=CacheType.BOTH)
privateCacheuserCache;

@GetMapping("get")
publicUserget(Longid){
if(userCache.get(id)!=null){
return(User)userCache.get(id);
}
Useruser=newUser();
user.setId(id);
user.setName("用戶both"+id);
user.setAge(23);
user.setSex(1);
userCache.put(id,user);
System.out.println("第一次獲取數(shù)據(jù),未走緩存:"+id);
returnuser;
}

@PostMapping("updateUser")
publicBooleanupdateUser(@RequestBodyUseruser){
//TODO更新數(shù)據(jù)庫
userCache.put(user.getId(),user);
returntrue;
}

@PostMapping("deleteUser")
publicBooleandeleteUser(Longid){
//TODO從數(shù)據(jù)庫刪除
userCache.remove(id);
returntrue;
}

}

方式三 高級API模式:通過CacheManager,2.7 版本才可使用

(1)添加依賴


com.alibaba
fastjson
2.0.25

(2)書寫配置類

@Configuration
publicclassJetcacheConfig{

@Autowired
privateCacheManagercacheManager;
privateCacheuserCache;

@PostConstruct
publicvoidinit(){
QuickConfigqc=QuickConfig.newBuilder("userCache:")
.expire(Duration.ofSeconds(3600))
.cacheType(CacheType.BOTH)
//本地緩存更新后,將在所有的節(jié)點中刪除緩存,以保持強一致性
.syncLocal(false)
.build();
userCache=cacheManager.getOrCreateCache(qc);
}

@Bean
publicCachegetUserCache(){
returnuserCache;
}
}

(3)調(diào)用代碼

@RestController
@RequestMapping("user3")
publicclassUser3Controller{

@Autowired
JetcacheConfigjetcacheConfig;
@Autowired
privateCacheuserCache;

@GetMapping("get")
publicUserget(Longid){
if(userCache.get(id)!=null){
return(User)userCache.get(id);
}
Useruser=newUser();
user.setId(id);
user.setName("用戶both"+id);
user.setAge(23);
user.setSex(1);
userCache.put(id,user);
System.out.println("第一次獲取數(shù)據(jù),未走緩存:"+id);
returnuser;
}

@PostMapping("updateUser")
publicBooleanupdateUser(@RequestBodyUseruser){
//TODO更新數(shù)據(jù)庫
userCache.put(user.getId(),user);
returntrue;
}

@PostMapping("deleteUser")
publicBooleandeleteUser(Longid){
//TODO從數(shù)據(jù)庫刪除
userCache.remove(id);
returntrue;
}

}

多級緩存的形式,會先從本地緩存獲取數(shù)據(jù),本地獲取不到會從遠程緩存獲取

5、啟動redis,啟動演示項目

注意,如果啟動出現(xiàn)NoClassDefFoundError: redis/clients/util/Pool或NoClassDefFoundError: redis/clients/jedis/UnifiedJedis報錯,說明springboot與jetcache版本不一致,對應關系可參考上述第一步中的說明 同時如果使用的是jetcache2.7.x版本,因為該版本中有jedis包的依賴,需要額外添加如下依賴,或者將jetcache版本將至2.6.5以下


redis.clients
jedis
4.3.1

3. 測試

3.1 方式一測試

1、訪問localhost:8088/user/getRemote?id=1

8ff5ed0e-4cb5-11ee-a25d-92fbcf53809c.png

因為配置的是遠程緩存,在redis中也能看到對應的key

902b0dd6-4cb5-11ee-a25d-92fbcf53809c.png

2、訪問localhost:8088/user/getLocal?id=1,這個方法是從本地緩存獲取的,現(xiàn)在只有遠程緩存上有數(shù)據(jù),我們調(diào)用發(fā)現(xiàn)緩存數(shù)據(jù)還是拿到了,這說明當我們在配置文件中配置了本地緩存和遠程緩存后,方式一中本地緩存和遠程緩存會自動相互調(diào)用

比如本地緩存有這個key,redis中沒有,通過遠程緩存方式訪問時,會先從redis獲取,如果沒有會自動獲取本地緩存,但是數(shù)據(jù)還是存儲在本地緩存,并不會同步到redis上,這樣更加靈活的實現(xiàn)了多級緩存架構(gòu)

904d52ce-4cb5-11ee-a25d-92fbcf53809c.png

3.2 方式二測試

1、再測試下CreateCache的形式:localhost:8088/user2/get?id=4

9080d630-4cb5-11ee-a25d-92fbcf53809c.png

正常獲取了,并且redis中也有了對應的值

90bbb124-4cb5-11ee-a25d-92fbcf53809c.png

而當我們把緩存方式更改為LOCAL后,再訪問localhost:8088/user2/get?id=5

@CreateCache(name="userCache:",expire=3600,timeUnit=TimeUnit.SECONDS,cacheType=CacheType.LOCAL)

會發(fā)現(xiàn)redis中就沒有對應緩存了,只在本地緩存存在,說明我們指定本地緩存的形式成功了

90d745e2-4cb5-11ee-a25d-92fbcf53809c.png

3.3 方式三測試

1、調(diào)用localhost:8088/user3/get?id=11

90f0f37a-4cb5-11ee-a25d-92fbcf53809c.png

redis中緩存設置成功!

9105ecda-4cb5-11ee-a25d-92fbcf53809c.png

4. 常見報錯

1、 ClassNotFoundException: com.alibaba.fastjson.JSON 解決:添加依賴


com.alibaba
fastjson
2.0.25

2、NoClassDefFoundError: redis/clients/jedis/UnifiedJedis 解決: 添加依賴


redis.clients
jedis
4.3.1

或者將jetcache版本降低至2.6.5以下

演示源碼

https://gitee.com/wuhanxue/wu_study/tree/master/demo/jetcache-demo

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2967

    瀏覽量

    104758
  • 緩存
    +關注

    關注

    1

    文章

    240

    瀏覽量

    26679
  • 開源
    +關注

    關注

    3

    文章

    3349

    瀏覽量

    42500
  • spring
    +關注

    關注

    0

    文章

    340

    瀏覽量

    14344
  • Redis
    +關注

    關注

    0

    文章

    375

    瀏覽量

    10878

原文標題:jetcache:阿里這款多級緩存框架一定要掌握

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    java框架學習-Webwork2開發(fā)

    提供易于理解和維護的工具及開發(fā)框架,現(xiàn)在把我們java私塾做企業(yè)培訓和日常教學用的webwork的資料共享出來,大家一起學習。第一部分 Webwork2簡介WebWork是由OpenS
    發(fā)表于 09-29 14:15

    【南京】誠聘JAVA開發(fā)工程師

    獵頭推薦職位:JAVA開發(fā)工程師工作職責:1. 了解互聯(lián)網(wǎng)的技術(shù)發(fā)展、評估外部技術(shù)與解決方案;2. 能對系統(tǒng)進行性能優(yōu)化,保證系統(tǒng)穩(wěn)定、快速、安全運行;3. 能獨自設計核心模塊并完成代碼編寫
    發(fā)表于 07-05 14:45

    英創(chuàng)主板JAVA應用開發(fā)簡介

    遇到問題,請參閱下載文檔:《英創(chuàng)主板JAVA應用開發(fā)簡介》中的“7、常見問題Q&A”。如果不能解決問題,請通過電話或者郵件聯(lián)系我們。
    發(fā)表于 10-20 13:13

    java開源工具包-Jodd框架

    Jodd是一個Java工具包和微型框架,Jodd 工具包含一些實用的工具類和小型框架,增強了 JDK 提供很多強大的功能,可以幫助實現(xiàn)日常的開發(fā)任務,讓代碼更可靠;而Jodd
    發(fā)表于 03-19 16:13

    阿里巴巴開源的通用緩存訪問框架JetCache介紹

    摘要: JetCache是由阿里巴巴開源的通用緩存訪問框架,如果你對Spring Cache很熟悉的話,請一定花一點時間了解一下JetCache,它更好用。
    發(fā)表于 04-24 16:09

    JS應用開發(fā)框架組件

    JS應用開發(fā)框架組件簡介目錄接口使用相關倉簡介JS應用開發(fā)框架,是OpenHarmony為
    發(fā)表于 04-23 18:05

    基于AOP的智能Web緩存框架

    通過引入面向方面編程技術(shù),提出一種新的智能Web緩存框架。描述該框架的組成結(jié)構(gòu)與工作原理,對緩存設計時需要解決的透明性、一致性、替換算法和預取策略等主要問題進行討
    發(fā)表于 04-11 09:04 ?4次下載

    Java 使用Redis緩存工具的詳細解說

    本文是關于Java 使用Redis緩存工具的詳細解說。詳細步驟請看下文
    的頭像 發(fā)表于 02-09 14:10 ?7887次閱讀
    <b class='flag-5'>Java</b> 使用Redis<b class='flag-5'>緩存</b>工具的詳細解說

    Java Web的開發(fā)前奏詳細資料免費下載

    本文檔的詳細介紹的是Java Web的開發(fā)前奏詳細資料免費下載主要內(nèi)容包括了:1、Java Web開發(fā)簡介,2、HTML、JavaScrip
    發(fā)表于 02-21 10:37 ?18次下載
    <b class='flag-5'>Java</b> Web的<b class='flag-5'>開發(fā)</b>前奏詳細資料免費下載

    你想選擇哪一種Java框架

    對于學Java的人來說,學習和了解框架是必修的。
    發(fā)表于 08-09 15:47 ?1287次閱讀

    基于Java的接口快速開發(fā)框架

    作者丨編碼磚家 來源丨h(huán)ttp://adkx.net/w5m4s Part1簡介 magic-api 是一個基于Java的接口快速開發(fā)框架,編寫接口將通過magic-api提供的UI界
    的頭像 發(fā)表于 09-10 09:36 ?3727次閱讀

    基于Java的接口快速開發(fā)框架——magic-api

    magic-api 是一個基于Java的接口快速開發(fā)框架,編寫接口將通過magic-api提供的UI界面完成,自動映射為HTTP接口,無需定義Controller、Service、Dao、Mapper、XML、VO等
    發(fā)表于 07-19 11:42 ?916次閱讀
    基于<b class='flag-5'>Java</b>的接口快速<b class='flag-5'>開發(fā)</b><b class='flag-5'>框架</b>——magic-api

    Ehcache!這才是Java本地緩存之王!

    Java而言,其常用的緩存解決方案有很多,例如數(shù)據(jù)庫緩存框架EhCache,分布式緩存Memcached等,這些
    的頭像 發(fā)表于 07-29 11:21 ?1804次閱讀
    Ehcache!這才是<b class='flag-5'>Java</b>本地<b class='flag-5'>緩存</b>之王!

    基于springboot和vue框架Java

    本文將詳細介紹基于Spring Boot和Vue框架進行Java應用開發(fā)的實踐。首先,將介紹Spring Boot和Vue框架的基本概念及其優(yōu)點。然后,將詳細介紹如何搭建Spring
    的頭像 發(fā)表于 12-03 15:15 ?1035次閱讀

    SSM框架Java開發(fā)中的應用 如何使用SSM進行web開發(fā)

    SSM框架,即Spring、SpringMVC和MyBatis的整合,是Java Web開發(fā)中常用的技術(shù)棧。它通過分層架構(gòu),實現(xiàn)了視圖、控制、業(yè)務邏輯和數(shù)據(jù)訪問的分離,提高了代碼的可維護性和可擴展性
    的頭像 發(fā)表于 12-16 17:28 ?473次閱讀