溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

大數(shù)據(jù)場景下熱點數(shù)據(jù)的讀/寫優(yōu)化方案

發(fā)布時間:2022-01-18 10:47:14 來源:億速云 閱讀:145 作者:柒染 欄目:大數(shù)據(jù)

這篇文章的內(nèi)容主要圍繞大數(shù)據(jù)場景下熱點數(shù)據(jù)的讀/寫優(yōu)化方案進行講述,文章內(nèi)容清晰易懂,條理清晰,非常適合新手學(xué)習(xí),值得大家去閱讀。感興趣的朋友可以跟隨小編一起閱讀吧。希望大家通過這篇文章有所收獲!

敢于跨出第一步,往往是成功的開始。

大數(shù)據(jù)場景下熱點數(shù)據(jù)的讀/寫優(yōu)化方案

一、緩存技術(shù)簡介

1、緩存是指將被頻繁訪問的熱點數(shù)據(jù)存儲在距離計算最近的地方,以方便系統(tǒng)快速做出響應(yīng)。
eg:  靜態(tài)資源可緩存到CDN(Content Delivery NetWork,內(nèi)容分發(fā)網(wǎng)絡(luò),即離電信運營商最近的機房)上。  也可以緩存到反向代理服務(wù)器,與CDN不同的是,反向代理服務(wù)器屬于企業(yè)內(nèi)部機房,它擋在應(yīng)用服務(wù)器的前端。
2、緩存分本地緩存和分布式緩存,比如:  Ehcache、MemCache及Redis
3、緩存主要解決以下問題:
緩解應(yīng)用系統(tǒng)或關(guān)系型數(shù)據(jù)庫的負(fù)載壓力
提升系統(tǒng)的吞吐量
4、本地緩存:  會共享同一個JVM進程內(nèi)的heap空間,從Ehcache3.x以后提供off-heap(堆外內(nèi)存),堆外內(nèi)存可以減少GC次數(shù)或降低暫停時間,可以擴展和使用更大的內(nèi)存空間。
5、分布式緩存:  由于本地緩存的容量有限,無法實現(xiàn)橫向擴展,因此從本地緩存架構(gòu)演變到分布式緩存架構(gòu)是必經(jīng)之路。  常見分布式緩存有Redis、MemCache

二、實際應(yīng)用場景

1、基于Redis集群多寫多讀方案,保障多寫時的數(shù)據(jù)一致性可以借助Zookeeper
2、LocalCache結(jié)合Redis集群的多級Cache方案

三、擴展,深度了解JVM堆內(nèi)內(nèi)存和堆外內(nèi)存(轉(zhuǎn)載)

1、什么是堆內(nèi)內(nèi)存
Java 虛擬機在執(zhí)行Java程序的過程中會把它在主存中管理的內(nèi)存部分劃分成多個區(qū)域,每個區(qū)域存放不同類型的數(shù)據(jù)。  下圖所示為java虛擬機運行的時候,主要的內(nèi)存分區(qū):

大數(shù)據(jù)場景下熱點數(shù)據(jù)的讀/寫優(yōu)化方案

在這些分區(qū)中,占用內(nèi)存空間最大的一部分叫做“堆(heap)”,也就是我們所說的堆內(nèi)內(nèi)存(on-heap memory)。  java虛擬機中的“堆”主要是存放所有對象的實例。  這一塊區(qū)域在java虛擬機啟動的時候被創(chuàng)建,被所有的線程所共享,同時也是垃圾收集器的主要工作區(qū)域,因此這一部分區(qū)域除了被叫做“堆內(nèi)內(nèi)存”以外,也被叫做“GC堆”(Garbage Collected Heap)。  
1.1 堆內(nèi)內(nèi)存的垃圾回收
堆內(nèi)內(nèi)存是java垃圾收集器的主要工作區(qū)域,為了提高垃圾回收的效率,在堆內(nèi)內(nèi)存的內(nèi)部又劃分出了新生代、老年代和永久代。  在新生代內(nèi)存中又按照8:1:1的比例(java虛擬機默認(rèn)分配比例為8:1:1,這個比例也可以自定義)劃分出了Eden, Survivor1, Survivor2三個區(qū)域。
在執(zhí)行垃圾回收算法的時候,不同的回收算法會對內(nèi)存區(qū)域造成不一樣的影響。  但是大部分的回收算法會造成堆內(nèi)內(nèi)存空間在物理上的不連續(xù)性。  下面以最基本的垃圾回收算法“標(biāo)記 - 清除算法”為例:

大數(shù)據(jù)場景下熱點數(shù)據(jù)的讀/寫優(yōu)化方案

可以看到,內(nèi)存區(qū)域在經(jīng)過垃圾回收之后,產(chǎn)生大量不連續(xù)的內(nèi)存空間。  因此,java虛擬機中的堆內(nèi)內(nèi)存區(qū)域,只是邏輯上的連續(xù),并不能保證物理上的連續(xù)性。   所以,操作系統(tǒng)并不能直接得到堆內(nèi)內(nèi)存區(qū)域所存儲的數(shù)據(jù)在主存中的正確地址。  在一些特定的時間點,Java虛擬機會進行一次徹底的垃圾回收(full gc)。  徹底回收時,垃圾收集器會對所有分配的堆內(nèi)內(nèi)存進行完整的掃描,在掃描期間,絕大部分正在運行的java線程都會被暫時停止。  這意味著:  這樣一次垃圾收集對Java應(yīng)用造成的影響,跟堆內(nèi)內(nèi)存所存儲的數(shù)據(jù)的多少是成正比的,過大的堆內(nèi)內(nèi)存會影響Java應(yīng)用的性能。  
 

2. 堆外內(nèi)存(off-heap memory)

2.1 堆外內(nèi)存的產(chǎn)生
為了解決堆內(nèi)內(nèi)存過大帶來的長時間的GC停頓的問題,以及操作系統(tǒng)對堆內(nèi)內(nèi)存不可知的問題,java虛擬機開辟出了堆外內(nèi)存(off-heap memory)。  堆外內(nèi)存意味著把一些對象的實例分配在Java虛擬機堆內(nèi)內(nèi)存以外的內(nèi)存區(qū)域,這些內(nèi)存直接受操作系統(tǒng)(而不是虛擬機)管理。  這樣做的結(jié)果就是能保持一個較小的堆,以減少垃圾收集對應(yīng)用的影響。  同時因為這部分區(qū)域直接受操作系統(tǒng)的管理,別的進程和設(shè)備(例如GPU)可以直接通過操作系統(tǒng)對其進行訪問,減少了從虛擬機中復(fù)制內(nèi)存數(shù)據(jù)的過程。
2.2 堆外內(nèi)存的分配
java 在NIO 包中提供了ByteBuffer類,對堆外內(nèi)存進行訪問。  下圖為NIO包中ByteBuffer的層次繼承關(guān)系

大數(shù)據(jù)場景下熱點數(shù)據(jù)的讀/寫優(yōu)化方案

使用下面的方式,可以直接開辟指定大小的對外內(nèi)存:
import sun.nio.ch.DirectBuffer;
import java.nio.ByteBuffer;
public class TestDirectByteBuffer {
public static void main(String[] args) throws Exception {
while (true) {
ByteBuffer buffer = ByteBuffer.allocateDirect(10 * 1024 * 1024);
}
}
}
這樣我們就開辟出了一塊大小為10M的堆外內(nèi)存。

3. 堆外內(nèi)存的優(yōu)缺點以及與堆內(nèi)內(nèi)存聯(lián)系

3.1堆外內(nèi)存的優(yōu)缺點:
優(yōu)點 :
可以很方便的自主開辟很大的內(nèi)存空間,對大內(nèi)存的伸縮性很好
減少垃圾回收帶來的系統(tǒng)停頓時間
直接受操作系統(tǒng)控制,可以直接被其他進程和設(shè)備訪問,減少了原本從虛擬機復(fù)制的過程
特別適合那些分配次數(shù)少,讀寫操作很頻繁的場景
缺點 :
容易出現(xiàn)內(nèi)存泄漏,并且很難排查
堆外內(nèi)存的數(shù)據(jù)結(jié)構(gòu)不直觀,當(dāng)存儲結(jié)構(gòu)復(fù)雜的對象時,會浪費大量的時間對其進行串行化。
3.2 堆內(nèi)內(nèi)存與堆外內(nèi)存的聯(lián)系:
雖然堆外內(nèi)存本身不受垃圾回收算法的管轄,但是因為其是由ByteBuffer所創(chuàng)造出來的,因此這個buffer自身作為一個實例化的對象,其自身的信息(例如堆外內(nèi)存在主存中的起始地址等信息)必須存儲在堆內(nèi)內(nèi)存中,具體情況如下圖所示。

大數(shù)據(jù)場景下熱點數(shù)據(jù)的讀/寫優(yōu)化方案

當(dāng)在堆內(nèi)內(nèi)存中存放的buffer對象實例被垃圾回收算法回收掉的時候,這個buffer對應(yīng)的堆外內(nèi)存區(qū)域同時也就被釋放掉了。

感謝你的閱讀,相信你對“大數(shù)據(jù)場景下熱點數(shù)據(jù)的讀/寫優(yōu)化方案”這一問題有一定的了解,快去動手實踐吧,如果想了解更多相關(guān)知識點,可以關(guān)注億速云網(wǎng)站!小編會繼續(xù)為大家?guī)砀玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI