最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java高性能本地緩存框架Caffeine的實(shí)現(xiàn)

 更新時間:2022年02月28日 09:16:33   作者:Java知識圖譜  
本文主要介紹了Java高性能本地緩存框架Caffeine的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、序言

Caffeine是一個進(jìn)程內(nèi)部緩存框架,使用了Java 8最新的[StampedLock]樂觀鎖技術(shù),極大提高緩存并發(fā)吞吐量,一個高性能的 Java 緩存庫,被稱為最快緩存。

二、緩存簡介

(一)緩存對比

從橫向?qū)ΤS玫木彺孢M(jìn)行對比,有助于加深對緩存的理解,有助于提高技術(shù)選型的合理性。下面對比三種常用緩存:Redis、EhCache、Caffeine。

1、序列化

緩存序列化原因
Redis必須實(shí)現(xiàn)序列化進(jìn)程間數(shù)據(jù)傳輸,因此必須實(shí)現(xiàn)序列化。大多數(shù)情況下涉及內(nèi)網(wǎng)網(wǎng)絡(luò)傳輸;作為緩存數(shù)據(jù)庫使用,持久化是標(biāo)配。
EhCache不一定需要實(shí)現(xiàn)序列化當(dāng)緩存配置不持久化到磁盤時,無需實(shí)現(xiàn)序列化接口。使用時,如果不確定是否需要持久化到磁盤,建議統(tǒng)一實(shí)現(xiàn)序列化接口。
Caffeine不需要實(shí)現(xiàn)序列化Map對象的改進(jìn)型接口,不涉及任何形式的網(wǎng)絡(luò)傳輸和持久化,因此完全不需要實(shí)現(xiàn)序列化接口。

2、進(jìn)程關(guān)系

緩存進(jìn)程關(guān)系備注
Redis與業(yè)務(wù)進(jìn)程獨(dú)立,由操作系統(tǒng)獨(dú)立管理,業(yè)務(wù)系統(tǒng)重啟對緩存服務(wù)無影響Redis服務(wù)與業(yè)務(wù)服務(wù)獨(dú)立,互相影響較小
EhCache附著于業(yè)務(wù)進(jìn)程,業(yè)務(wù)系統(tǒng)重啟,存儲與內(nèi)存部分的緩存數(shù)據(jù)丟失;存儲與硬盤部分的數(shù)據(jù)繼續(xù)存在緩存配置存在兩種模式:一種是純內(nèi)存型,一種是可持久化到磁盤
Caffeine附著于業(yè)務(wù)進(jìn)程,業(yè)務(wù)系統(tǒng)重啟,緩存數(shù)據(jù)全部丟失純內(nèi)存型

內(nèi)存型緩存的理解:緩存都是使用內(nèi)存作為存儲媒介的,各種緩存服務(wù)的區(qū)別如下:Caffeine是內(nèi)存型緩存是指緩存與調(diào)用者屬于同一個應(yīng)用,準(zhǔn)確的說屬于同一個JVM;Redis是指另外一個獨(dú)立進(jìn)程的內(nèi)存型,緩存數(shù)據(jù)存儲在Redis數(shù)據(jù)庫的內(nèi)存中,而不是在調(diào)用服務(wù)所屬的內(nèi)存中。

(二)本地緩存

本地緩存與分布式緩存對應(yīng),緩存進(jìn)程和應(yīng)用進(jìn)程同屬于一個JVM,數(shù)據(jù)的讀、寫在一個進(jìn)程內(nèi)完成。本地緩存沒有網(wǎng)絡(luò)開銷,訪問速度很快。

Caffeine是基于Guava Cache增強(qiáng)的新一代緩存技術(shù),緩存性能極其出色。

1、Map

JDK內(nèi)置的Map可作為緩存的一種實(shí)現(xiàn)方式,然而嚴(yán)格意義來講,其不能算作緩存的范疇。原因如下:一是其存儲的數(shù)據(jù)不能主動過期;二是無任何緩存淘汰策略。

三、SpringCache

Caffeine作為Spring體系中內(nèi)置的緩存之一,Spring Cache同樣提供調(diào)用接口支持。

(一)需求分析

1、CacheManager

Caffeine屬于進(jìn)程內(nèi)部緩存框架,不需要配置多數(shù)據(jù)源,因此一個CacheManager即可滿足需求。如果應(yīng)用中僅使用Caffeine作為唯一的緩存框架,那么通過注解使用時無需顯式指明。

2、CacheName

任何一類緩存,不同業(yè)務(wù)模塊間緩存過期時間以及緩存淘汰策略幾乎不相同,因此應(yīng)該支持多CacheName,并且應(yīng)該具有不同配置。過期時間是不同CacheName間緩存配置的重要區(qū)別。

3、Key

內(nèi)存型緩存,無可視化界面,因此首要滿足鍵值的唯一性,鍵值唯一是正確使用業(yè)務(wù)緩存的基礎(chǔ)保證。

(二)序列化

Caffeine緩存不涉及任何序列化,因此目標(biāo)緩存對象不需要實(shí)現(xiàn)Serializable接口。若涉及多級緩存或者多種緩存共用,其它需要網(wǎng)絡(luò)傳輸或者持久化的緩存需要序列化,Caffeine盡管也使用實(shí)現(xiàn)序列化的實(shí)體類,但是不做序列化操作。

不需要序列化,降低了緩存使用難度。

(三)集成

1、引入依賴

如果無特別要求,使用較新SpringBoot的內(nèi)置版本即可。

<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
</dependency>

2、全局配置

全局配置中指定使用caffeine緩存管理。

spring:
  cache:
    type: caffeine

3、緩存管理器

配置緩存管理器:多CacheName配置。

public interface CacheNameTimeConstant {
    String CACHE_DEFAULT = "CACHE_DEFAULT";
    String CACHE_10SECS = "CACHE_10SECS";
    String CACHE_60SECS = "CACHE_60SECS";
}

同一個CacheManager配置多個CacheName,此處僅配置過期時間的差異,其余配置可自由增加。

@Bean
public CacheManager caffeineCacheManager() {
    SimpleCacheManager cacheManager = new SimpleCacheManager();
    List<CaffeineCache> caches = new ArrayList<>();
    caches.add(new CaffeineCache(CacheNameTimeConstant.CACHE_5SECS, 
            Caffeine.newBuilder().expireAfterWrite(5, TimeUnit.SECONDS).build()));
    caches.add(new CaffeineCache(CacheNameTimeConstant.CACHE_10SECS, 
            Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build()));
    caches.add(new CaffeineCache(CacheNameTimeConstant.CACHE_30SECS, 
            Caffeine.newBuilder().expireAfterWrite(30, TimeUnit.SECONDS).build()));
    cacheManager.setCaches(caches);
    return cacheManager;
}

四、小結(jié)

Java領(lǐng)域可用的緩存框架非常多,Caffeine不屬于分布式緩存,但不影響其在本地緩存場景出色的表現(xiàn)。開發(fā)者在進(jìn)行緩存架構(gòu)設(shè)計時需要綜合考慮各類緩存的優(yōu)缺點(diǎn),依據(jù)具體場景選配相應(yīng)緩存。

到此這篇關(guān)于Java高性能本地緩存框架Caffeine的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java Caffeine內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot-Starter造輪子之自動鎖組件lock-starter實(shí)現(xiàn)

    Springboot-Starter造輪子之自動鎖組件lock-starter實(shí)現(xiàn)

    這篇文章主要為大家介紹了Springboot-Starter造輪子之自動鎖組件lock-starter實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Java實(shí)現(xiàn)合并多個PDF的示例代碼

    Java實(shí)現(xiàn)合并多個PDF的示例代碼

    這篇文章主要介紹了通過Java實(shí)現(xiàn)合并多個PDF,并將合并后的新PDF存儲到文件夾下,文中的示例代碼簡潔易懂,感興趣的可以跟隨小編一起試一試
    2022-01-01
  • java二叉查找樹的實(shí)現(xiàn)代碼

    java二叉查找樹的實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了java二叉查找樹的實(shí)現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • SpringCloud Feign傳遞HttpServletRequest對象流程

    SpringCloud Feign傳遞HttpServletRequest對象流程

    HttpServletRequest接口的對象代表客戶端的請求,當(dāng)客戶端通過HTTP協(xié)議訪問Tomcat服務(wù)器時,HTTP請求中的所有信息都封裝在HttpServletRequest接口的對象中,這篇文章介紹了Feign傳遞HttpServletRequest對象的流程,感興趣的同學(xué)可以參考下文
    2023-05-05
  • IntelliJ?IDEA?2022.2.3最新激活圖文教程(親測有用永久激活)

    IntelliJ?IDEA?2022.2.3最新激活圖文教程(親測有用永久激活)

    今天給大家分享一個?IDEA?2022.2.3?的激活破解教程,全文通過文字+圖片的方式講解,手把手教你如何激活破解?IDEA,?只需要幾分鐘即可搞定,對idea2022.2.3激活碼感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • Java之Springcloud Feign組件詳解

    Java之Springcloud Feign組件詳解

    這篇文章主要介紹了Java之Springcloud Feign組件詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 史上最難的一道Java面試題

    史上最難的一道Java面試題

    本文給大家分享一道史上最難的一道Java面試題,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-03-03
  • 解決IDEA錯誤 Cause: java.sql.SQLException: The server time zone value的問題

    解決IDEA錯誤 Cause: java.sql.SQLException: The server time zone

    這篇文章主要介紹了解決IDEA錯誤 Cause: java.sql.SQLException: The server time zone value的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot異步實(shí)現(xiàn)的8種方式

    SpringBoot異步實(shí)現(xiàn)的8種方式

    異步執(zhí)行對于開發(fā)者來說并不陌生,在實(shí)際的開發(fā)過程中,很多場景多會使用到異步,本文主要介紹了SpringBoot異步實(shí)現(xiàn)的8種方式,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Java多線程Thread , Future , Callable , FutureTask的使用

    Java多線程Thread , Future , Callable ,

    本文主要介紹了Java多線程Thread , Future , Callable , FutureTask的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評論

建阳市| 永平县| 虞城县| 聂拉木县| 阳信县| 肇庆市| 大关县| 屏东市| 屏东市| 贵德县| 启东市| 竹北市| 布尔津县| 甘洛县| 大港区| 西乡县| 江源县| 安顺市| 麦盖提县| 萍乡市| 晋江市| 潜江市| 团风县| 渭源县| 河曲县| 清苑县| 安新县| 松潘县| 襄垣县| 云阳县| 万载县| 北票市| 浪卡子县| 铜陵市| 丰镇市| 米林县| 静安区| 滦平县| 崇义县| 天峻县| 柳林县|