成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

貓頭鷹的深夜翻譯:為何需要緩存以及如何實(shí)現(xiàn)緩存

FuisonDesign / 3906人閱讀

摘要:由于需要跨進(jìn)程訪問(wèn)網(wǎng)絡(luò)上的高速緩存,因此延遲,故障和對(duì)象序列化會(huì)導(dǎo)致性能下降。應(yīng)用程序高速緩存會(huì)自動(dòng)清除條目以保持其內(nèi)存占用。緩存統(tǒng)計(jì)高速緩存統(tǒng)計(jì)信息可幫助識(shí)別高速緩存的運(yùn)行狀況并提供有關(guān)高速緩存行為和性能的信息。

前言

這篇文章探索了現(xiàn)有的各種JAVA緩存基數(shù),它們對(duì)各種場(chǎng)景下提高應(yīng)用的性能起著重要的作用。

近十年來(lái),信息技術(shù)極高的提升了業(yè)務(wù)流程,它已經(jīng)成為了全球企業(yè)的戰(zhàn)略性方案。它從“可有可無(wú)”演變到現(xiàn)在的“不可或缺”。因此,響應(yīng)時(shí)間變得越發(fā)的重要。數(shù)據(jù)獲取時(shí)間對(duì)用戶體驗(yàn)影響極大,它在所有的商業(yè)應(yīng)用中幾乎都是關(guān)鍵性需求。影響響應(yīng)時(shí)間的因素很多,包括網(wǎng)絡(luò)管道,協(xié)議,硬件,軟件以及網(wǎng)速。龐大的IT基礎(chǔ)設(shè)施和苛刻的系統(tǒng)性能要求嚴(yán)重影響了任何組織的戰(zhàn)略目標(biāo)。

本文旨在強(qiáng)調(diào)通過(guò)Java緩存機(jī)制提升應(yīng)用的性能。

緩存的概念

緩存是指一塊內(nèi)存緩沖區(qū),用來(lái)臨時(shí)存儲(chǔ)經(jīng)常訪問(wèn)的數(shù)據(jù)。因?yàn)閿?shù)據(jù)無(wú)需從原始來(lái)源重新獲取,因此提升了性能。緩存這個(gè)概念應(yīng)用在計(jì)算機(jī)/網(wǎng)絡(luò)產(chǎn)業(yè)的各個(gè)領(lǐng)域,因此根據(jù)不同的用例,有不同的實(shí)現(xiàn)緩存的方法。事實(shí)上,像路由器,交換機(jī),PC這樣的設(shè)備使用緩存來(lái)加速內(nèi)存訪問(wèn)。還有一個(gè)常見(jiàn)的場(chǎng)景,幾乎存在于所有的PC,即瀏覽器緩存最近請(qǐng)求獲取的對(duì)象,這樣就無(wú)需多次獲取同樣的數(shù)據(jù)了。在一個(gè)分布式的JEE應(yīng)用中,客戶端/服務(wù)器端緩存對(duì)于提升性能也起著至關(guān)重要的作用??蛻舳司彺嬗脕?lái)臨時(shí)存儲(chǔ)從服務(wù)器傳來(lái)的靜態(tài)數(shù)據(jù),從而避免不必要的對(duì)服務(wù)器的方位。另一方面,服務(wù)器端的緩存會(huì)將它從別的地方獲取的數(shù)據(jù)存儲(chǔ)在內(nèi)存中。

緩存可以建立在單點(diǎn)/多點(diǎn)JVM或是集群環(huán)境上??梢允褂镁彺鎭?lái)滿足不同伸縮性程度的場(chǎng)景如下。

垂直伸縮

可以通過(guò)升級(jí)單個(gè)機(jī)器,賦予其更多的有效資源(CPU,RAM,HDD,SSD),并且開(kāi)啟緩存來(lái)實(shí)現(xiàn)。但是有個(gè)局限性,緩存升級(jí)的程度是有限的。在下面的用例中,可以通過(guò)增加內(nèi)存并在應(yīng)用層實(shí)現(xiàn)緩存來(lái)提升應(yīng)用的性能。

水平伸縮

它可以通過(guò)添加更多的機(jī)器并在每臺(tái)機(jī)器的應(yīng)用層開(kāi)啟緩存來(lái)實(shí)現(xiàn)。但是它也存在局限,因?yàn)榕c之交互的下游應(yīng)用并沒(méi)有增加額外的機(jī)器。在下面的用例中,通過(guò)給每一個(gè)應(yīng)用添加一個(gè)服務(wù)器/緩存來(lái)提高整體的性能。數(shù)據(jù)庫(kù)可能會(huì)成為性能瓶頸,但是可以通過(guò)在緩存中存儲(chǔ)靜態(tài)/主數(shù)據(jù)來(lái)緩解。

進(jìn)程中緩存

進(jìn)程內(nèi)緩存使對(duì)象可以與應(yīng)用程序存儲(chǔ)在同一實(shí)例中,即本地緩存可供應(yīng)用程序使用,并共享相同的內(nèi)存空間。
考慮進(jìn)程緩存時(shí)的重點(diǎn):

如果應(yīng)用程序僅部署在一個(gè)節(jié)點(diǎn)中,即具有單個(gè)實(shí)例,那么進(jìn)程內(nèi)緩存是存儲(chǔ)經(jīng)常訪問(wèn)的數(shù)據(jù)以及快速訪問(wèn)數(shù)據(jù)的合適選擇。

如果進(jìn)程內(nèi)高速緩存將部署在應(yīng)用程序的多個(gè)實(shí)例中,那么在所有實(shí)例之間保持?jǐn)?shù)據(jù)同步可能是一個(gè)挑戰(zhàn),并且會(huì)導(dǎo)致數(shù)據(jù)不一致。

如果服務(wù)器配置有限,那么這種類型的緩存會(huì)降低所有應(yīng)用程序的性能,因?yàn)樗蚕硐嗤膬?nèi)存和CPU。垃圾收集器經(jīng)常會(huì)被調(diào)用來(lái)清理可能導(dǎo)致性能開(kāi)銷的對(duì)象。如果不能有效管理緩存移除,則可能會(huì)發(fā)生內(nèi)存不足報(bào)錯(cuò)。

內(nèi)存中分布式緩存

分布式緩存(鍵/值對(duì)象)可以在支持從/向數(shù)據(jù)存儲(chǔ)庫(kù)讀取/寫(xiě)入的應(yīng)用程序的外部構(gòu)建。它會(huì)頻繁的從RAM中訪問(wèn)數(shù)據(jù),避免從數(shù)據(jù)源獲取數(shù)據(jù)。這樣的緩存可以部署在集群的多個(gè)節(jié)點(diǎn)中,構(gòu)成單一邏輯視圖。緩存的客戶端使用哈希算法來(lái)得出集群中對(duì)象的位置。

考慮分布式緩存的重點(diǎn):

內(nèi)存分布式緩存對(duì)于中型到大型,在集群中有多個(gè)實(shí)例,并且性能至關(guān)重要的應(yīng)用是最佳的解決方案。數(shù)據(jù)不一致以及共享內(nèi)存不再是性能的焦點(diǎn),因?yàn)椴渴鹪诩褐械姆植际骄彺婵梢哉宫F(xiàn)出單一邏輯狀態(tài)。

由于需要跨進(jìn)程訪問(wèn)網(wǎng)絡(luò)上的高速緩存,因此延遲,故障和對(duì)象序列化會(huì)導(dǎo)致性能下降。

實(shí)現(xiàn)的難度大于進(jìn)程內(nèi)緩存。

內(nèi)存數(shù)據(jù)庫(kù)

這種類型的數(shù)據(jù)庫(kù)也稱為主存數(shù)據(jù)庫(kù)。數(shù)據(jù)存儲(chǔ)在RAM中而不是硬盤(pán)上,以實(shí)現(xiàn)更快的響應(yīng)。數(shù)據(jù)以壓縮格式存儲(chǔ)并且支持SQL。相關(guān)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序可以用來(lái)代替現(xiàn)有的RDBMS。使用內(nèi)存數(shù)據(jù)庫(kù)替換RDBMS可以在不改變應(yīng)用程序?qū)拥那闆r下提高應(yīng)用程序的性能。只有垂直伸縮可用于擴(kuò)展內(nèi)存數(shù)據(jù)庫(kù)。

內(nèi)存數(shù)據(jù)網(wǎng)格

這種分布式緩存解決方案可以快速訪問(wèn)常用數(shù)據(jù)。數(shù)據(jù)可以在多個(gè)節(jié)點(diǎn)上緩存,復(fù)制和分區(qū)。

實(shí)現(xiàn)內(nèi)存數(shù)據(jù)網(wǎng)格可以提高應(yīng)用程序的性能并在不改變RDBMS的情況下擴(kuò)展應(yīng)用程序。

核心功能:

并行計(jì)算內(nèi)存中的數(shù)據(jù)

在內(nèi)存中搜索,聚合和排序數(shù)據(jù)

內(nèi)存中的事務(wù)管理

事件處理

In-memory database vs In-memory data grid
內(nèi)存中數(shù)據(jù)庫(kù)通過(guò)替換和升級(jí)底層RDBMS的基礎(chǔ)上提升性能,它將應(yīng)用和底層數(shù)據(jù)庫(kù)的變更隔離開(kāi)來(lái)。
內(nèi)存中數(shù)據(jù)網(wǎng)格通過(guò)調(diào)整應(yīng)用程序來(lái)提升速度,將應(yīng)用的變更和底層數(shù)據(jù)庫(kù)隔離開(kāi)來(lái)。
緩存用例

在任何一個(gè)企業(yè)級(jí)應(yīng)用中都可以通過(guò)配置商業(yè)或者開(kāi)源的框架來(lái)提升應(yīng)用的性能。下面是幾個(gè)常見(jiàn)的緩存用例。

應(yīng)用緩存

應(yīng)用程序緩存是應(yīng)用程序保存在內(nèi)存中用來(lái)頻繁訪問(wèn)的數(shù)據(jù)的本地緩存。應(yīng)用程序高速緩存會(huì)自動(dòng)清除條目以保持其內(nèi)存占用。

Level 1 (L1) 緩存

這是每個(gè)會(huì)話的默認(rèn)事務(wù)緩存。它可以由任何Java持久性框架(JPA)或?qū)ο箨P(guān)系映射(ORM)工具來(lái)管理。L1緩存存儲(chǔ)屬于特定會(huì)話的實(shí)體對(duì)象,并在會(huì)話關(guān)閉后清除。如果一個(gè)會(huì)話內(nèi)有多個(gè)事務(wù),則所有這些事務(wù)都將被存儲(chǔ)。

Level 2 (L2) 緩存

二級(jí)緩存可以配置為提供自定義緩存,可以保存要緩存的所有實(shí)體的數(shù)據(jù)。它可能與屬性,關(guān)聯(lián)和集合有關(guān)。它在會(huì)話工廠中配置,并且只要會(huì)話工廠可用,它就存在。

二級(jí)緩存可以配置為可在以下場(chǎng)景中共享:

應(yīng)用的會(huì)話

具有相同數(shù)據(jù)庫(kù)的在相同服務(wù)器上的應(yīng)用程序

擁有同一數(shù)據(jù)庫(kù)的在不同服務(wù)器上不同的應(yīng)用程序

L1 / L2緩存的使用流程

標(biāo)準(zhǔn)ORM框架首先會(huì)在L1緩存中查找實(shí)體,然后在L2緩存中查找。L1緩存是查找開(kāi)始的地方。如果找到一個(gè)實(shí)體的緩存,就會(huì)返回該實(shí)體。

如果在L1緩存中沒(méi)有找到,就會(huì)去L2緩存查找

如果在L2緩存中找到,則會(huì)存到L1緩存,并且返回實(shí)體

如果在L1和L2中找不到實(shí)體,則它將從數(shù)據(jù)庫(kù)中提取并存儲(chǔ)在兩個(gè)高速緩存中,然后再返回給調(diào)用方。

當(dāng)任何會(huì)話在實(shí)體上機(jī)型任何修改時(shí),L2緩存驗(yàn)證/刷新自身。

如果數(shù)據(jù)庫(kù)完全由外部進(jìn)程修改,即沒(méi)有應(yīng)用程序會(huì)話,則不能隱式刷新L2高速緩存,除非某些高速緩存刷新策略通過(guò)框架API或某個(gè)自定義API實(shí)現(xiàn)。

下面的通信圖展現(xiàn)了使用L1/L2緩存:

混合高速緩存

混合高速緩存是標(biāo)準(zhǔn)ORM框架提供的高速緩存和開(kāi)源/定制/ JDBC API實(shí)現(xiàn)的組合。應(yīng)用可以使用混合高速緩存來(lái)調(diào)整局限于標(biāo)準(zhǔn)ORM框架的緩存能力。這種緩存用于響應(yīng)時(shí)間至關(guān)重要的任務(wù)關(guān)鍵型應(yīng)用。

緩存設(shè)計(jì)注意事項(xiàng)

緩存設(shè)計(jì)注意事項(xiàng)包括數(shù)據(jù)加載/更新,性能/內(nèi)存大小,緩存移除策略,并發(fā)性和緩存統(tǒng)計(jì)信息。

數(shù)據(jù)加載和更新

將數(shù)據(jù)加載到緩存中是保持所有緩存內(nèi)容一致性的重要設(shè)計(jì)決策。加載數(shù)據(jù)可以考慮以下方法:

使用標(biāo)準(zhǔn)框架(如hibernate,openJPA)提供的默認(rèn)的功能或配置

使用開(kāi)源緩存API(如Google Guava或是COTS的產(chǎn)品如Coherence, Ehcache或 Hazelcast.)實(shí)現(xiàn)鍵值映射。

利用編程自動(dòng)或是顯式插入加載實(shí)體

外部的應(yīng)用可以通過(guò)同步或異步通信

性能/內(nèi)存大小 32/64位

可用內(nèi)存是實(shí)現(xiàn)性能SLA的一個(gè)重要因素,它取決于32/64位JRE,而JRE又依賴于32/64位機(jī)器的CPU架構(gòu)。在32位的機(jī)器中,應(yīng)用程序可用的堆大小大約是1.5G,而在64位機(jī)器中,堆的大小依賴于RAM的大小。

內(nèi)存的高可用性確實(shí)會(huì)在運(yùn)行時(shí)產(chǎn)生成本,并可能產(chǎn)生負(fù)面影響。

由于存儲(chǔ)器布局,64位所需要的堆大小比32位多出30-50%。

保持更多的堆需要更多的GC任務(wù)來(lái)清理可能降低性能的未使用的對(duì)象。通過(guò)微調(diào)GC可以減少由GC導(dǎo)致的暫停運(yùn)行。

緩存移除策略

緩存移除策略使緩存能夠確保緩存的大小不超過(guò)最大限制。為了實(shí)現(xiàn)這一點(diǎn),元素將根據(jù)緩存移除策略從緩存中刪除,它還可以根據(jù)應(yīng)用的需求自定義。緩存解決方案中有各種流行的緩存移除策略。

最近最少使用 (LRU):首先淘汰最長(zhǎng)時(shí)間未被使用的緩存

最不常使用 (LFU):首先淘汰在一段時(shí)間內(nèi)使用次數(shù)最少的緩存

先進(jìn)先出 (FIFO)

并發(fā)

并發(fā)性是企業(yè)應(yīng)用程序中的常見(jiàn)問(wèn)題。它會(huì)引入沖突并且使系統(tǒng)位于不一致的狀態(tài)中。當(dāng)多個(gè)客戶端嘗試在緩存刷新期間同時(shí)更新相同的數(shù)據(jù)對(duì)象時(shí),可能會(huì)發(fā)生這種情況。通常使用鎖來(lái)解決,但是鎖會(huì)影響性能。因此,需要針對(duì)這個(gè)考慮優(yōu)化策略。

緩存統(tǒng)計(jì)

高速緩存統(tǒng)計(jì)信息可幫助識(shí)別高速緩存的運(yùn)行狀況并提供有關(guān)高速緩存行為和性能的信息。通常,以下屬性可用于統(tǒng)計(jì)緩存:

Hit count:找到對(duì)象所需要的查找次數(shù)

Miss Count:沒(méi)有找到對(duì)象所需要的查找次數(shù)

Load success count:成功加載的條目數(shù)

Total load time:加載元素的總時(shí)間

Load exception count:加載條目時(shí)拋出的異常數(shù)

Eviction count:從緩存中移除的條目數(shù)量

總結(jié):各種緩存方案

有各種Java緩存解決方案可供選擇 - 正確的選擇取決于使用案例。以下是一些問(wèn)題和比較,可以幫助找出最具成本效益和可行的緩存解決方案。

你需要一個(gè)輕量級(jí)還是全面的緩存解決方案?

你需要開(kāi)源的,商業(yè)的或框架提供的緩存解決方案?

你需要進(jìn)程中緩存還是分布式緩存?

一致性和延遲要求之間的折衷是什么?

你需要維護(hù)事務(wù)/主數(shù)據(jù)的緩存嗎?

你需要一個(gè)緩存復(fù)制嗎?

性能,可靠性,可伸縮性和可用性如何?

參考資料
In-memory database vs In-memory datagrid
LRU 和 LFU的區(qū)別


想要了解更多開(kāi)發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號(hào)!將會(huì)不定期的發(fā)放福利哦~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/61936.html

相關(guān)文章

  • 頭鷹深夜翻譯:Volatile原子性, 可見(jiàn)性和有序性

    摘要:有可能一個(gè)線程中的動(dòng)作相對(duì)于另一個(gè)線程出現(xiàn)亂序。當(dāng)實(shí)際輸出取決于線程交錯(cuò)的結(jié)果時(shí),這種情況被稱為競(jìng)爭(zhēng)條件。這里的問(wèn)題在于代碼塊不是原子性的,而且實(shí)例的變化對(duì)別的線程不可見(jiàn)。這種不能同時(shí)在多個(gè)線程上執(zhí)行的部分被稱為關(guān)鍵部分。 為什么要額外寫(xiě)一篇文章來(lái)研究volatile呢?是因?yàn)檫@可能是并發(fā)中最令人困惑以及最被誤解的結(jié)構(gòu)。我看過(guò)不少解釋volatile的博客,但是大多數(shù)要么不完整,要么難...

    Lionad-Morotar 評(píng)論0 收藏0
  • 頭鷹深夜翻譯:在JAVA中記錄日志十個(gè)小建議

    摘要:是指可能導(dǎo)致程序終止的非常嚴(yán)重的時(shí)間。具有最高的級(jí)別,旨在關(guān)閉中的日志功能。因此為每一個(gè)消息選擇一個(gè)合適的日志級(jí)別是非常重要的。日志的個(gè)小建議將日志訪日代碼塊它能顯著的減少因?yàn)樽址唇佣鴰?lái)的性能的影響。 前言 首先,這篇文章沒(méi)有進(jìn)行任何的日志功能的詳細(xì)介紹,而是對(duì)日志提出了幾種最佳實(shí)踐。適合對(duì)日志記錄有所了解的同學(xué)閱讀。下面是正文: JAVA日志管理既是一門(mén)科學(xué),又是一門(mén)藝術(shù)。科學(xué)...

    venmos 評(píng)論0 收藏0
  • 頭鷹深夜翻譯:核心JAVA并發(fā)(一)

    摘要:簡(jiǎn)介從創(chuàng)建以來(lái),就支持核心的并發(fā)概念如線程和鎖。這篇文章會(huì)幫助從事多線程編程的開(kāi)發(fā)人員理解核心的并發(fā)概念以及如何使用它們。請(qǐng)求操作系統(tǒng)互斥,并讓操作系統(tǒng)調(diào)度程序處理線程停放和喚醒。 簡(jiǎn)介 從創(chuàng)建以來(lái),JAVA就支持核心的并發(fā)概念如線程和鎖。這篇文章會(huì)幫助從事多線程編程的JAVA開(kāi)發(fā)人員理解核心的并發(fā)概念以及如何使用它們。 (博主將在其中加上自己的理解以及自己想出的例子作為補(bǔ)充) 概念 ...

    Richard_Gao 評(píng)論0 收藏0
  • 頭鷹深夜翻譯:從1000+JS項(xiàng)目中匯總10個(gè)最容易出現(xiàn)錯(cuò)誤(以及如何解決)

    摘要:常出現(xiàn)的錯(cuò)誤前十位為了可讀性,錯(cuò)誤名稱進(jìn)行了一定的簡(jiǎn)寫(xiě)。讓我們深入了解每個(gè)錯(cuò)誤發(fā)生的原因以及解決方法。這個(gè)問(wèn)題很容易解決。當(dāng)未捕獲的錯(cuò)誤跨越違法跨域策略的域邊界時(shí),會(huì)發(fā)生腳本錯(cuò)誤。這是當(dāng)你在中試圖調(diào)用的方法時(shí)出現(xiàn)的錯(cuò)誤。 JavaScript常出現(xiàn)的錯(cuò)誤前十位 showImg(https://segmentfault.com/img/bV3Z1z?w=1116&h=691); 為了可讀...

    eccozhou 評(píng)論0 收藏0
  • 頭鷹深夜翻譯:JDK Vs. JRE Vs. JVM之間區(qū)別

    摘要:什么是為執(zhí)行字節(jié)碼提供一個(gè)運(yùn)行環(huán)境。它的實(shí)現(xiàn)主要包含三個(gè)部分,描述實(shí)現(xiàn)規(guī)格的文檔,具體實(shí)現(xiàn)和滿足要求的計(jì)算機(jī)程序以及實(shí)例具體執(zhí)行字節(jié)碼。該類先被轉(zhuǎn)化為一組字節(jié)碼并放入文件中。字節(jié)碼校驗(yàn)器通過(guò)字節(jié)碼校驗(yàn)器檢查格式并找出非法代碼。 什么是Java Development Kit (JDK)? JDK通常用來(lái)開(kāi)發(fā)Java應(yīng)用和插件。基本上可以認(rèn)為是一個(gè)軟件開(kāi)發(fā)環(huán)境。JDK包含Java Run...

    blair 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<