在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

京東云 ? 來(lái)源:jf_75140285 ? 作者:jf_75140285 ? 2024-11-17 14:24 ? 次閱讀

作者:京東保險(xiǎn) 郭盼

1、簡(jiǎn)介

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

2、Guava緩存簡(jiǎn)介

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

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

Guava的過(guò)期時(shí)間設(shè)置有基于創(chuàng)建時(shí)間和最后一次訪問(wèn)時(shí)間兩種策略.

(1) 基于創(chuàng)建時(shí)間

通過(guò)對(duì)比緩存記錄的插入時(shí)間來(lái)判斷,比如設(shè)置過(guò)期時(shí)間為5分鐘,不管中間有沒(méi)有訪問(wèn),到時(shí)過(guò)期。

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

(2) 基于過(guò)期時(shí)間

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

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

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

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

(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)重時(shí)要先計(jì)算weight的value對(duì)象的字節(jié)數(shù),每1kb字節(jié)作為一個(gè)權(quán)重,對(duì)比限制緩存記錄,我們就能將緩存的總占用限制在100kb左右。

2.3緩存監(jiān)控

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

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

2.4 Guava cache的優(yōu)劣勢(shì)和適用場(chǎng)景

優(yōu)劣勢(shì):Guava cache通過(guò)內(nèi)存處理數(shù)據(jù),具有減少I(mǎi)O請(qǐng)求,讀寫(xiě)性能快的優(yōu)勢(shì),但是受內(nèi)存容量限制,只能處理少量數(shù)據(jù)的讀寫(xiě),還有可能對(duì)本機(jī)內(nèi)存造成壓力,并且在分布式部署中,會(huì)存在不同機(jī)器節(jié)點(diǎn)數(shù)據(jù)不一致的情況,即緩存漂移。

適用場(chǎng)景:讀多寫(xiě)少,對(duì)數(shù)據(jù)一致性要求不高的場(chǎng)景。

3、Caffeine簡(jiǎn)介

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

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呢?主要包含以下三點(diǎn):

3.1、對(duì)比Guava cache的性能主要優(yōu)化項(xiàng)

(1)異步策略

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

wKgaomcyxP6Adt0qAABfE5AgeRg699.png

?

(2)ConcurrentHashMap優(yōu)化

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

?

(3)新型淘汰算法W-TinyLFU

傳統(tǒng)的淘汰算法,如LRU、LFU、FIFO,在實(shí)際的緩存場(chǎng)景中都存在一些弊端,如FIFO算法,如果緩存使用的頻率較高,那么緩存數(shù)據(jù)會(huì)一直處在進(jìn)進(jìn)出出的狀態(tài),間接影響到緩存命中率。LRU算法,在批量刷新緩存數(shù)據(jù)的場(chǎng)景下,可能會(huì)將其他緩存數(shù)據(jù)淘汰掉,從而帶來(lái)緩存擊穿的風(fēng)險(xiǎn)。LFU算法,需要保存緩存記錄的訪問(wèn)次數(shù),帶來(lái)內(nèi)存空間的損耗。

因此,Caffeine引入了W-TinyLFU算法,由窗口緩存、過(guò)濾器、主緩存組成。緩存數(shù)據(jù)剛進(jìn)入時(shí)會(huì)停留在窗口緩存中,這個(gè)部分只占總緩存的1%,當(dāng)被擠出窗口緩存時(shí),會(huì)在過(guò)濾器匯總和主緩存中淘汰的數(shù)據(jù)進(jìn)行比較,如果頻率更高,則進(jìn)入主緩存,否則就被淘汰,主緩存被分為淘汰段和保護(hù)段,兩段都是LRU算法,第一次被訪問(wèn)的元素會(huì)進(jìn)入淘汰段,第二次被訪問(wèn)會(huì)進(jìn)入保護(hù)段,保護(hù)段中被淘汰的元素會(huì)進(jìn)入淘汰段,這種算法實(shí)現(xiàn)了高命中率和低內(nèi)存占用。更詳細(xì)的解釋可以參考論文:https://arxiv.org/pdf/1512.00727.pdf?

wKgaomcyxP-ADcJTAAJCh7bEYmk122.png

3.2、Caffeine的優(yōu)劣勢(shì)和適用場(chǎng)景

優(yōu)勢(shì):對(duì)比Guava cache有更高的緩存性能,劣勢(shì):仍然存在緩存漂移的問(wèn)題;JDK版本過(guò)低無(wú)法使用

適用場(chǎng)景:1、適用場(chǎng)景:讀多寫(xiě)少,對(duì)數(shù)據(jù)一致性要求不高的場(chǎng)景;2、純內(nèi)存緩存,JDK8及更高版本中,追求比Guava cache更高的性能。

4、Ehcache簡(jiǎn)介

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

wKgaomcyxQCAKJKUAADHz0yrAFg116.png

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

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

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

5、不同本地緩存對(duì)比

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

?

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

    關(guān)注

    20

    文章

    2987

    瀏覽量

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

    關(guān)注

    1

    文章

    245

    瀏覽量

    27081
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    385

    瀏覽量

    11357
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

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

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

    如何選擇合適本地緩存

    的 Guava 緩存、在 Guava 上進(jìn)一步傳承的 Caffine 以及自稱(chēng)在 Java 中使用最廣泛的 EhCache,那么我們?cè)撛趺?b class='flag-5'>選擇適合自己應(yīng)用的緩存呢,小編下面會(huì)簡(jiǎn)單介紹,并將以上
    的頭像 發(fā)表于 01-18 11:19 ?1094次閱讀
    如何<b class='flag-5'>選擇</b><b class='flag-5'>合適</b>的<b class='flag-5'>本地</b><b class='flag-5'>緩存</b>?

    157.157、緩存 緩存使用 本地鎖在分布式下的問(wèn)題

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

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

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

    Mybatis緩存之一級(jí)緩存

    本文主要講mybatis的一級(jí)緩存,一級(jí)緩存是SqlSession級(jí)別的緩存。mybatis提供查詢(xún)緩存,用于減輕數(shù)據(jù)壓力,提高數(shù)據(jù)庫(kù)性能。mybaits提供一級(jí)
    發(fā)表于 11-27 20:44 ?1303次閱讀
    Mybatis<b class='flag-5'>緩存</b>之一級(jí)<b class='flag-5'>緩存</b>

    渲染中的幀緩存和深度緩存

    渲染涉及大量的緩存,這里緩存只是一個(gè)簡(jiǎn)單的存有像素?cái)?shù)據(jù)的矩形內(nèi)存塊,最重要緩存是幀緩存和深度緩存
    的頭像 發(fā)表于 05-14 11:44 ?7062次閱讀
    渲染中的幀<b class='flag-5'>緩存</b>和深度<b class='flag-5'>緩存</b>

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

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

    緩存的基本原理 緩存的分類(lèi)

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

    ThingJS平臺(tái)推出3D場(chǎng)景本地緩存技術(shù)

    為提升用戶(hù)訪問(wèn)體驗(yàn),縮短項(xiàng)目加載時(shí)間,ThingJS平臺(tái)推出3D場(chǎng)景本地緩存技術(shù):IndexedDB,也稱(chēng)客戶(hù)端緩存持久化技術(shù)。通俗來(lái)說(shuō),IndexedDB 就是瀏覽器提供的本地數(shù)據(jù)庫(kù)
    發(fā)表于 03-13 11:19 ?1941次閱讀

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

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

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

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

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

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

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

    HTTP緩存頭是一組HTTP響應(yīng)頭,它們控制瀏覽器和中間代理服務(wù)器如何緩存網(wǎng)頁(yè)內(nèi)容。合理使用HTTP緩存頭可以顯著提高網(wǎng)站的加載速度和性能,減少服務(wù)器的負(fù)載。 1. HTTP緩存頭概述
    的頭像 發(fā)表于 12-18 09:41 ?421次閱讀

    nginx中強(qiáng)緩存和協(xié)商緩存介紹

    強(qiáng)緩存直接告訴瀏覽器:在緩存過(guò)期前,無(wú)需與服務(wù)器通信,直接使用本地緩存
    的頭像 發(fā)表于 04-01 16:01 ?315次閱讀
    主站蜘蛛池模板: 亚洲精品在线视频观看 | 亚洲三级黄 | 色爱区综合激情五月综合色 | 久久国产精品免费 | 国产婷婷| 九色中文 | 中文字幕亚洲色图 | 日本黄色短视频 | 欧美屁屁影院 | 一级欧美视频 | 午夜影皖普通区 | 轻点太大了好深好爽h文 | 日韩成人免费一级毛片 | 天天天色 | 一级毛片一级毛片一级级毛片 | 成人免费无毒在线观看网站 | 五月综合激情 | 色欲麻豆国产福利精品 | 色婷婷六月丁香七月婷婷 | 国产人成午夜免费看 | 四虎影永久在线观看网址 | 亚洲一区二区精品视频 | 日本欧美一区二区三区视频 | 在线视频黄| 视频一区日韩 | 亚洲入口无毒网址你懂的 | 狠狠色96视频 | 爱我免费视频观看在线www | 77米奇| 日本欧美一区二区 | 天天舔天天射 | 狠狠操天天操夜夜操 | 直接观看黄网站免费视频 | 欧美日韩国产一区二区三区不卡 | 亚洲第一毛片 | luxu259在线中文字幕 | 男女交性视频免费 | 三级色网站 | 视频在线免费观看 | 新网球王子u17世界杯篇免费观看 | 久久在线精品 |