<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

基于java開發的緩存框架jetcache簡介

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

0. 引言

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

1. jetcache簡介

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

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

2. jetcache使用

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

如果是非springboot項目可以參考官網說明配置

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地址和線程數

jetcache:
#統計間隔,0表示不統計,開啟后定期在控制臺輸出緩存信息
statIntervalMinutes:15
#是否把cacheName作為遠程緩存key前綴
areaInCacheName:false
#本地緩存配置
local:
default:#default表示全部生效,也可以指定某個cacheName
#本地緩存類型,其他可選:caffeine/linkedhashmap
type:linkedhashmap
keyConvertor:fastjson
#遠程緩存配置
remote:
default:#default表示全部生效,也可以指定某個cacheName
type:redis
#key轉換器方式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

更詳細的參數配置

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){
//直接新建用戶,模擬從數據庫獲取數據
Useruser=newUser();
user.setId(id);
user.setName("用戶remote"+id);
user.setAge(23);
user.setSex(1);
System.out.println("第一次獲取數據,未走緩存:"+id);
returnuser;
}

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

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

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

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

}

這里要注意實體類User一定要實現序列化,即聲明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("第一次獲取數據,未走緩存:"+id);
returnuser;
}

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

@PostMapping("deleteUser")
publicBooleandeleteUser(Longid){
//TODO從數據庫刪除
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)
//本地緩存更新后,將在所有的節點中刪除緩存,以保持強一致性
.syncLocal(false)
.build();
userCache=cacheManager.getOrCreateCache(qc);
}

@Bean
publicCachegetUserCache(){
returnuserCache;
}
}

(3)調用代碼

@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("第一次獲取數據,未走緩存:"+id);
returnuser;
}

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

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

}

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

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

注意,如果啟動出現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,這個方法是從本地緩存獲取的,現在只有遠程緩存上有數據,我們調用發現緩存數據還是拿到了,這說明當我們在配置文件中配置了本地緩存和遠程緩存后,方式一中本地緩存和遠程緩存會自動相互調用

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

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)

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

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

3.3 方式三測試

1、調用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

審核編輯:湯梓紅

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

    關注

    19

    文章

    2909

    瀏覽量

    103203
  • 緩存
    +關注

    關注

    1

    文章

    221

    瀏覽量

    26469
  • 開源
    +關注

    關注

    3

    文章

    3026

    瀏覽量

    41779
  • spring
    +關注

    關注

    0

    文章

    333

    瀏覽量

    14191
  • Redis
    +關注

    關注

    0

    文章

    365

    瀏覽量

    10541

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

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

收藏 人收藏

    評論

    相關推薦

    java框架學習-Webwork2開發

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

    【南京】誠聘JAVA開發工程師

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

    英創主板JAVA應用開發簡介

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

    java開源工具包-Jodd框架

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

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

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

    JS應用開發框架組件

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

    鴻蒙應用開發的JS UI框架如何實現高德地圖的訪問?

    鴻蒙應用,現在分為Java UI框架和Ark UI框架,其中JS UI開發框架Ark UI框架
    發表于 04-28 11:44

    基于AOP的智能Web緩存框架

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

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

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

    Java Web的開發前奏詳細資料免費下載

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

    你想選擇哪一種Java框架

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

    基于Java的接口快速開發框架

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

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

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

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

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

    基于springboot和vue框架Java

    本文將詳細介紹基于Spring Boot和Vue框架進行Java應用開發的實踐。首先,將介紹Spring Boot和Vue框架的基本概念及其優點。然后,將詳細介紹如何搭建Spring
    的頭像 發表于 12-03 15:15 ?626次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>