衡阳派盒市场营销有限公司

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

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

如何選擇合適的本地緩存?

OSC開源社區(qū) ? 來源:OSCHINA 社區(qū) ? 2024-01-18 11:19 ? 次閱讀

作者:京東云開發(fā)者-京東保險郭盼

1、簡介

小編最近在使用系統(tǒng)的時候,發(fā)現(xiàn)盡管應(yīng)用已經(jīng)使用了 redis 緩存提高查詢效率,但是仍然有進(jìn)一步優(yōu)化的空間,于是想到了比分布式緩存性能更好的本地緩存,因此對領(lǐng)域內(nèi)常用的本地緩存進(jìn)行了一番調(diào)研,有早期的 Guava 緩存、在 Guava 上進(jìn)一步傳承的 Caffine 以及自稱在 Java 中使用最廣泛的 EhCache,那么我們該怎么選擇適合自己應(yīng)用的緩存呢,小編下面會簡單介紹,并將以上緩存進(jìn)行一個對比,希望幫助大家選擇最適合自己系統(tǒng)的本地緩存。

2、Guava 緩存簡介

Guava cache 是 Google 開發(fā)的 Guava 工具包中一套完善的 JVM 本地緩存框架,底層實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)類似于 ConcurrentHashMap,但是進(jìn)行了更多的能力拓展,包括緩存過期時間設(shè)置、緩存容量設(shè)置、多種淘汰策略、緩存監(jiān)控等,下面簡單介紹下這些功能及其使用方式。

2.1、緩存過期時間設(shè)置

Guava 的過期時間設(shè)置有基于創(chuàng)建時間和最后一次訪問時間兩種策略. (1) 基于創(chuàng)建時間 通過對比緩存記錄的插入時間來判斷,比如設(shè)置過期時間為 5 分鐘,不管中間有沒有訪問,到時過期。

public Cache createCache() {    
    return CacheBuilder.newBuilder()
    .expireAfterWrite(5L, TimeUnit.MINUTES)
    .build();
}

(2) 基于過期時間

通過對比最近最后一次的訪問時間,比如設(shè)置 5 分鐘,每次訪問之后都會刷新過期時間為 5 分鐘,只有持續(xù) 5 分鐘沒有被訪問到才會過期。

public Cache createCache() {    
    return CacheBuilder.newBuilder()
    .expireAfterAccess(5L, TimeUnit.MINUTES)
    .build();
}

2.2、緩存容量和淘汰策略設(shè)置

Guava cache 是內(nèi)存型緩存,有內(nèi)存溢出風(fēng)險,因此需要設(shè)置緩存的最大存儲上限,通過緩存的條數(shù)或每條緩存的權(quán)重來判斷是否達(dá)到了設(shè)定閾值,當(dāng)緩存的數(shù)據(jù)量達(dá)到設(shè)定閾值之后,Guava cache 支持使用 FIFO 和 LRU 的策略對緩存記錄采取淘汰的措施。

(1)限制緩存記錄條數(shù)

public Cache createCache() {    
    return CacheBuilder.newBuilder()
    .maximumSize(100L)
    .build();
}

(2)限制緩存記錄權(quán)重

public Cache createCache() {    
    return CacheBuilder.newBuilder()
    .maximumWeight(100L)
    .weigher((key, value) -> (int) Math.ceil(instrumentation.getObjectSize(value) / 1024L))       
    .build();
}
使用限制緩存記錄權(quán)重時要先計算 weight 的 value 對象的字節(jié)數(shù),每 1kb 字節(jié)作為一個權(quán)重,對比限制緩存記錄,我們就能將緩存的總占用限制在 100kb 左右。

2.3 緩存監(jiān)控

緩存記錄的加載和命中情況是評價緩存處理能力的重要指標(biāo),Guava cache 提供了 stat 統(tǒng)計日志對這兩個指標(biāo)進(jìn)行了統(tǒng)計,我們只需要在創(chuàng)建緩存容器的時候加上 recordStats 就可以開啟統(tǒng)計。

public Cache createCache() {    
    return CacheBuilder.newBuilder()
    .recordStats()
    .build();
}

2.4 Guava cache 的優(yōu)劣勢和適用場景

優(yōu)劣勢:Guava cache 通過內(nèi)存處理數(shù)據(jù),具有減少 IO 請求,讀寫性能快的優(yōu)勢,但是受內(nèi)存容量限制,只能處理少量數(shù)據(jù)的讀寫,還有可能對本機(jī)內(nèi)存造成壓力,并且在分布式部署中,會存在不同機(jī)器節(jié)點數(shù)據(jù)不一致的情況,即緩存漂移。 適用場景:讀多寫少,對數(shù)據(jù)一致性要求不高的場景。

3、Caffeine 簡介

Caffeine 同樣是 Google 開發(fā)的,是在 Guava cache 的基礎(chǔ)上改良而來的,底層設(shè)計思路、功能和使用方式與 Guava 非常類似,但是各方面的性能都要遠(yuǎn)遠(yuǎn)超過前者,可以看做是 Guava cache 的升級版,因此,之前使用過 Guava cache,也能夠很快的上手 Caffeine,下面是 Caffeine 和 Guava cache 的緩存創(chuàng)建對比,基本可以無門檻過渡。

public Cache createCache() {
    return Caffeine.newBuilder()
        .initialCapacity(1000)
        .maximumSize(100L)
        .expireAfterWrite(5L, TimeUnit.MINUTES)

        .recordStats()
        .build();
}


public Cache createCache() {    
    return CacheBuilder.newBuilder()
    .initialCapacity(1000)
    .maximumSize(100L)
    .expireAfterWrite(5L, TimeUnit.MINUTES)
    .recordStats()
    .build();
}
那么 Caffeine 底層又做了哪些優(yōu)化,才能讓其性能高于 Guava cache 呢?主要包含以下三點:

3.1、對比 Guava cache 的性能主要優(yōu)化項

(1)異步策略 Guava cache 在讀操作中可能會觸發(fā)淘汰數(shù)據(jù)的清理操作,雖然自身也做了一些優(yōu)化來減少讀的時候的清理操作,但是一旦觸發(fā),就會降低查詢效率,對緩存性能產(chǎn)生影響。而在 Caffeine 支持異步操作,采用異步處理的策略,查詢請求在觸發(fā)淘汰數(shù)據(jù)的清理操作后,會將清理數(shù)據(jù)的任務(wù)添加到獨(dú)立的線程池中進(jìn)行異步操作,不會阻塞查詢請求,提高了查詢性能。

dcf4e92a-b524-11ee-8b88-92fbcf53809c.png

(2)ConcurrentHashMap 優(yōu)化

Caffeine 底層都是通過 ConcurrentHashMap 來進(jìn)行數(shù)據(jù)的存儲,因此隨著 Java8 中對 ConcurrentHashMap 的調(diào)整,數(shù)組 + 鏈表的結(jié)構(gòu)升級為數(shù)組 + 鏈表 + 紅黑樹的結(jié)構(gòu)以及分段鎖升級為 syschronized+CAS,降低了鎖的粒度,減少了鎖的競爭,這兩個優(yōu)化顯著提高了 Caffeine 在讀多寫少場景下的查詢性能。

(3)新型淘汰算法


W-TinyLFU 傳統(tǒng)的淘汰算法,如 LRU、LFU、FIFO,在實際的緩存場景中都存在一些弊端,如 FIFO 算法,如果緩存使用的頻率較高,那么緩存數(shù)據(jù)會一直處在進(jìn)進(jìn)出出的狀態(tài),間接影響到緩存命中率。

LRU 算法,在批量刷新緩存數(shù)據(jù)的場景下,可能會將其他緩存數(shù)據(jù)淘汰掉,從而帶來緩存擊穿的風(fēng)險。

LFU 算法,需要保存緩存記錄的訪問次數(shù),帶來內(nèi)存空間的損耗。

因此,Caffeine 引入了 W-TinyLFU 算法,由窗口緩存、過濾器、主緩存組成。緩存數(shù)據(jù)剛進(jìn)入時會停留在窗口緩存中,這個部分只占總緩存的 1%,當(dāng)被擠出窗口緩存時,會在過濾器匯總和主緩存中淘汰的數(shù)據(jù)進(jìn)行比較,如果頻率更高,則進(jìn)入主緩存,否則就被淘汰,主緩存被分為淘汰段和保護(hù)段,兩段都是 LRU 算法,第一次被訪問的元素會進(jìn)入淘汰段,第二次被訪問會進(jìn)入保護(hù)段,保護(hù)段中被淘汰的元素會進(jìn)入淘汰段,這種算法實現(xiàn)了高命中率和低內(nèi)存占用。

dcff5b44-b524-11ee-8b88-92fbcf53809c.png

3.2、Caffeine 的優(yōu)劣勢和適用場景

優(yōu)勢:對比 Guava cache 有更高的緩存性能,劣勢:仍然存在緩存漂移的問題;JDK 版本過低無法使用 適用場景:1、適用場景:讀多寫少,對數(shù)據(jù)一致性要求不高的場景;2、純內(nèi)存緩存,JDK8 及更高版本中,追求比 Guava cache 更高的性能。

4、Ehcache 簡介

Guava cache 和 Caffeine 都是 JVM 緩存,會受到內(nèi)存大小的制約,最新的 Ehcache 采用堆內(nèi)緩存 + 堆外緩存 + 磁盤的方式,打破了這一制約。堆內(nèi)緩存就是被 JVM 管理的那一部分緩存,而堆外緩存,就是在內(nèi)存中另外在開辟一塊不被 JVM 管理的部分。堆外緩存這部分既可以享受內(nèi)存的高速讀寫能力,而且又避免的 JVM 頻繁的 GC,缺點是需要自行清理數(shù)據(jù)。

dd13edca-b524-11ee-8b88-92fbcf53809c.png

下面是 Ehcache 緩存的創(chuàng)建,指定了堆內(nèi)、堆外緩存和磁盤緩存的大小。

ResourcePoolsBuilder.newResourcePoolsBuilder()
    .heap(20, MemoryUnit.MB)
    .offheap(10, MemoryUnit.MB)
    .disk(5, MemoryUnit.GB);


為了解決緩存漂移的問題,Ehcache 支持通過集群的方式,實現(xiàn)了分布式節(jié)點之間的數(shù)據(jù)互通。關(guān)于 Ehcache 的集群策略,后續(xù)文章再詳細(xì)闡述。

5、不同本地緩存對比

框架 命中率 速度 回收算法 使用難度 集群 適用場景
Guava cache 第三 LRU、LFU、FIFO 不支持 讀多寫少,允許少量緩存偏移
Caffeine 第一 W-TinyLFU 不支持 讀多寫少,允許少量緩存偏移,能用 Caffeine 就別用 Guava cache
Ehcache 第二 LRU、LFU、FIFO 支持 分布式系統(tǒng)中對數(shù)據(jù)一致性要求高

審核編輯:湯梓紅

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

    關(guān)注

    8

    文章

    3055

    瀏覽量

    74327
  • 緩存
    +關(guān)注

    關(guān)注

    1

    文章

    241

    瀏覽量

    26757
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    158

    瀏覽量

    12259

原文標(biāo)題:緩存之美 —— 如何選擇合適的本地緩存?

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    高并發(fā)系統(tǒng)中的緩存 緩存系統(tǒng)存在的三大問題

    緩存在計算機(jī)系統(tǒng)是無處不在,在CPU層面有L1-L3的Cache,在Linux中有TLB加速虛擬地址和物理地址的轉(zhuǎn)換,在瀏覽器有本地緩存、手機(jī)有本地
    的頭像 發(fā)表于 07-15 11:03 ?4274次閱讀

    本地緩存的技術(shù)實踐

    一、摘要 說到緩存,面試官基本上會繞不開以下幾個話題! 項目中哪些地方用到了緩存?為什么要使用緩存?怎么使用它的?引入緩存后會帶來哪些問題? 這些問題,基本上是互聯(lián)網(wǎng)公司面試時必問的一
    的頭像 發(fā)表于 09-30 15:29 ?719次閱讀
    <b class='flag-5'>本地</b><b class='flag-5'>緩存</b>的技術(shù)實踐

    157.157、緩存 緩存使用 本地鎖在分布式下的問題

    緩存
    充八萬
    發(fā)布于 :2023年07月18日 04:44:59

    刻錄機(jī)緩存容量多大才合適呢?

    刻錄機(jī)緩存容量多大才合適呢?   多大緩存合適呢? 刻錄機(jī)在刻錄過程中,包括激光刻錄頭在內(nèi)的刻錄系統(tǒng)的工作是連續(xù)的,它
    發(fā)表于 12-26 10:06 ?4138次閱讀

    如何選擇合適的射頻模塊?

    如何選擇合適的射頻模塊?
    發(fā)表于 01-14 12:01 ?17次下載

    內(nèi)容中心網(wǎng)絡(luò)中基于用戶偏好的協(xié)作緩存策略

    用戶本地偏好度指標(biāo),實現(xiàn)緩存內(nèi)容的選擇;然后,對需要緩存內(nèi)容執(zhí)行差異化緩存策略,全局活躍的內(nèi)容則緩存
    發(fā)表于 12-19 15:23 ?4次下載
    內(nèi)容中心網(wǎng)絡(luò)中基于用戶偏好的協(xié)作<b class='flag-5'>緩存</b>策略

    緩存的基本原理 緩存的分類

    緩存的主要手段有:瀏覽器緩存、CDN、反向代理、本地緩存、分布式緩存、數(shù)據(jù)庫緩存
    發(fā)表于 06-13 12:04 ?4828次閱讀

    ThingJS平臺推出3D場景本地緩存技術(shù)

    為提升用戶訪問體驗,縮短項目加載時間,ThingJS平臺推出3D場景本地緩存技術(shù):IndexedDB,也稱客戶端緩存持久化技術(shù)。通俗來說,IndexedDB 就是瀏覽器提供的本地數(shù)據(jù)庫
    發(fā)表于 03-13 11:19 ?1838次閱讀

    如何為衛(wèi)星應(yīng)用選擇合適的LDO

    如何為衛(wèi)星應(yīng)用選擇合適的LDO
    發(fā)表于 10-28 11:59 ?0次下載
    如何為衛(wèi)星應(yīng)用<b class='flag-5'>選擇</b><b class='flag-5'>合適</b>的LDO

    聊聊本地緩存和分布式緩存

    本地緩存 :應(yīng)用中的緩存組件,緩存組件和應(yīng)用在同一進(jìn)程中,緩存的讀寫非常快,沒有網(wǎng)絡(luò)開銷。但各應(yīng)用或集群的各節(jié)點都需要維護(hù)自己的單獨(dú)
    發(fā)表于 06-11 15:12 ?856次閱讀
    聊聊<b class='flag-5'>本地</b><b class='flag-5'>緩存</b>和分布式<b class='flag-5'>緩存</b>

    如何在 Linux 上查看本地 DNS 緩存

    ? 刷新本地 DNS 緩存可以解決 HTTP 錯誤并保護(hù)您免受 DNS 欺騙。以下是在 Linux 上執(zhí)行此操作的方法。 當(dāng)您使用域名訪問網(wǎng)站時,您的系統(tǒng)會向 DNS 服務(wù)器發(fā)送請求以獲取該域
    的頭像 發(fā)表于 06-26 10:52 ?3418次閱讀
    如何在 Linux 上查看<b class='flag-5'>本地</b> DNS <b class='flag-5'>緩存</b>

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

    就Java而言,其常用的緩存解決方案有很多,例如數(shù)據(jù)庫緩存框架EhCache,分布式緩存Memcached等,這些緩存方案實際上都是為了提升吞吐效率,避免持久層壓力過大。
    的頭像 發(fā)表于 07-29 11:21 ?1915次閱讀
    Ehcache!這才是Java<b class='flag-5'>本地</b><b class='flag-5'>緩存</b>之王!

    怎樣選擇合適的MOSFET

    怎樣選擇合適的MOSFET
    的頭像 發(fā)表于 10-01 08:01 ?335次閱讀
    怎樣<b class='flag-5'>選擇</b><b class='flag-5'>合適</b>的MOSFET

    緩存之美——如何選擇合適本地緩存

    Guava cache是Google開發(fā)的Guava工具包中一套完善的JVM本地緩存框架,底層實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)類似于ConcurrentHashMap,但是進(jìn)行了更多的能力拓展,包括緩存過期時間設(shè)置、
    的頭像 發(fā)表于 11-17 14:24 ?417次閱讀
    <b class='flag-5'>緩存</b>之美——如何<b class='flag-5'>選擇</b><b class='flag-5'>合適</b>的<b class='flag-5'>本地</b><b class='flag-5'>緩存</b>?

    HTTP緩存頭的使用 本地緩存與遠(yuǎn)程緩存的區(qū)別

    HTTP緩存頭是一組HTTP響應(yīng)頭,它們控制瀏覽器和中間代理服務(wù)器如何緩存網(wǎng)頁內(nèi)容。合理使用HTTP緩存頭可以顯著提高網(wǎng)站的加載速度和性能,減少服務(wù)器的負(fù)載。 1. HTTP緩存頭概述
    的頭像 發(fā)表于 12-18 09:41 ?175次閱讀
    世界德州扑克大赛| 百家乐官网娱乐全讯网| 尊龙百家乐官网娱乐平台| 百家乐手机版| 云鼎娱乐城| 温州市百家乐官网鞋业| 全讯网百家乐的玩法技巧和规则| 爱拼网| 传奇百家乐官网的玩法技巧和规则| 嘉禾百家乐的玩法技巧和规则| 百家乐官网天天赢钱| 利来百家乐官网的玩法技巧和规则| 永利高娱乐| 988百家乐官网娱乐| 芝加哥百家乐的玩法技巧和规则 | 二代百家乐官网破解| 百家乐娱乐场开户注册| 百家乐官网娱乐城彩金| 娱乐城百家乐怎么样| 瑞博网站| 百家乐现场网络| 现金博彩网| 肯博百家乐游戏| 海王星娱乐网| 赌百家乐的高手| 百家乐平台| 百家乐赌王有哪些| 皇冠网小说微博| 百家乐的代理办法| 炉霍县| 百家乐分析网| 电子百家乐官网博彩正网| 百家乐游戏唯一官网站| 真钱百家乐官网游戏排行| 百家乐官网AG| 大发888游戏平台稳定大发888| 百家乐官网套路| 大发888赌场的微博| 太阳百家乐官网网址| 东乡族自治县| 百家乐庄闲庄庄闲|