當前位置:首頁 » 文件管理 » 緩存池技術

緩存池技術

發布時間: 2023-08-19 06:10:22

㈠ 什麼是緩沖為什麼要引入緩沖

緩沖是為了協調吞吐速度相差很大的設備之間的數據傳送。

引入緩沖的主要原因,可歸結為以下幾點:

1、改善CPU與I/O設備間速度不匹配的矛盾

2. 可以減少對 CPU的中斷頻率,放寬對中斷響應時間的限制

3. 提高 CPU和 I/O設備之間的並行性

常見的緩沖技術有:單緩沖,雙緩沖老前,循環緩沖,緩沖池。其中,廣泛流行使用公用緩沖池。

(1)緩存池技術擴展閱讀

根據系統設置的緩沖器的個數,可把緩沖技術分為:

1、單緩沖:在設備和處理機之間設置一個緩沖器。設備相處理機交換數據時,先把被交換數據寫迅銀入緩沖器,然後,需要數據的設備或處理機從緩沖器取定數據。

2、雙緩沖:解決兩台外設、列印帆和終端之間的並行操作問題的辦法是設置雙緩沖。有了兩個緩沖器之後,CPU可把輸出到列印機的數據放入其中一個緩沖器(區)、讓列印機慢慢列印;然後,它又可以從另一個為終端設置的緩沖器(區)中讀取所需要的輸入數據。

3、多緩沖:是把多個緩沖區連接起來組成兩部分,一部分專門用於侍昌清輸入,另一部分專門用於輸出的緩沖結構。

4、緩沖池:把多個緩沖區連接起來統一管理,既可用於輸入又可用於輸出的緩沖結構。

㈡ golang sync.pool對象復用 並發原理 緩存池

在go http每一次go serve(l)都會構建Request數據結構。在大量數據請求或高並發的場景中,頻繁創建銷毀對象,會導致GC壓力。解決辦法之一就是使用對象復用技術。在http協議層之下,使用對象復用技術創建Request數據結構。在http協議層之上,可以使用對象復用技術創建(w,*r,ctx)數據結構。這樣即可以回快TCP層讀包之後的解析速度,也可也加快請求處理的速度。

先上一個測試:

結論是這樣的:

貌似使用池化,性能弱爆了???這似乎與net/http使用sync.pool池化Request來優化性能的選擇相違背。這同時也說明了一個問題,好的東西,如果濫用反而造成了性能成倍的下降。在看過pool原理之後,結合實例,將給出正確的使用方法,並給出預期的效果。

sync.Pool是一個 協程安全 臨時對象池 。數據結構如下:

local 成員的真實類型是一個 poolLocal 數組,localSize 是數組長度。這涉及到Pool實現,pool為每個P分配了一個對象,P數量設置為runtime.GOMAXPROCS(0)。在並發讀寫時,goroutine綁定的P有對象,先用自己的,沒有去偷其它P的。go語言將數據分散在了各個真正運行的P中,降低了鎖競爭,提高了並發能力。

不要習慣性地誤認為New是一個關鍵字,這里的New是Pool的一個欄位,也是一個閉包名稱。其API:

如果不指定New欄位,對象池為空時會返回nil,而不是一個新構建的對象。Get()到的對象是隨機的。

原生sync.Pool的問題是,Pool中的對象會被GC清理掉,這使得sync.Pool只適合做簡單地對象池,不適合作連接池。

pool創建時不能指定大小,沒有數量限制。pool中對象會被GC清掉,只存在於兩次GC之間。實現是pool的init方法注冊了一個poolCleanup()函數,這個方法在GC之前執行,清空pool中的所有緩存對象。

為使多協程使用同一個POOL。最基本的想法就是每個協程,加鎖去操作共享的POOL,這顯然是低效的。而進一步改進,類似於ConcurrentHashMap(JDK7)的分Segment,提高其並發性可以一定程度性緩解。

注意到pool中的對象是無差異性的,加鎖或者分段加鎖都不是較好的做法。go的做法是為每一個綁定協程的P都分配一個子池。每個子池又分為私有池和共享列表。共享列表是分別存放在各個P之上的共享區域,而不是各個P共享的一塊內存。協程拿自己P里的子池對象不需要加鎖,拿共享列表中的就需要加鎖了。

Get對象過程:

Put過程:

如何解決Get最壞情況遍歷所有P才獲取得對象呢:

方法1止前sync.pool並沒有這樣的設置。方法2由於goroutine被分配到哪個P由調度器調度不可控,無法確保其平衡。

由於不可控的GC導致生命周期過短,且池大小不可控,因而不適合作連接池。僅適用於增加對象重用機率,減少GC負擔。2

執行結果:

單線程情況下,遍歷其它無元素的P,長時間加鎖性能低下。啟用協程改善。

結果:

測試場景在goroutines遠大於GOMAXPROCS情況下,與非池化性能差異巨大。

測試結果

可以看到同樣使用*sync.pool,較大池大小的命中率較高,性能遠高於空池。

結論:pool在一定的使用條件下提高並發性能,條件1是協程數遠大於GOMAXPROCS,條件2是池中對象遠大於GOMAXPROCS。歸結成一個原因就是使對象在各個P中均勻分布。

池pool和緩存cache的區別。池的意思是,池內對象是可以互換的,不關心具體值,甚至不需要區分是新建的還是從池中拿出的。緩存指的是KV映射,緩存里的值互不相同,清除機制更為復雜。緩存清除演算法如LRU、LIRS緩存演算法。

池空間回收的幾種方式。一些是GC前回收,一些是基於時鍾或弱引用回收。最終確定在GC時回收Pool內對象,即不迴避GC。用java的GC解釋弱引用。GC的四種引用:強引用、弱引用、軟引用、虛引用。虛引用即沒有引用,弱引用GC但有空間則保留,軟引用GC即清除。ThreadLocal的值為弱引用的例子。

regexp 包為了保證並發時使用同一個正則,而維護了一組狀態機。

fmt包做字串拼接,從sync.pool拿[]byte對象。避免頻繁構建再GC效率高很多。

㈢ 談談RecyclerView中的緩存

Android深入理解RecyclerView的緩存機制

RecyclerView在項目中的使用已經很普遍了,可以說是項目中最高頻使用的一個控制項了。除了布局靈活性、豐富的動畫,RecyclerView還有優秀的緩存機制,本文嘗試通過源碼深入了解一下RecyclerView中的緩存機制。

RecyclerView做性能優化要說復雜也復雜,比如說布局優化,緩存,預載入等等。其優化的點很多,在這些看似獨立的點之間,其實存在一個樞紐:Adapter。因為所有的ViewHolder的創建和內容的綁定都需要經過Adaper的兩個函數onCreateViewHolder和onBindViewHolder。

因此我們性能優化的本質就是要減少這兩個函數的調用時間和調用的次數。如果我們想對RecyclerView做性能優化,必須清楚的了解到我們的每一步操作背後,onCreateViewHolder和onBindViewHolder調用了多少次。因此,了解RecyclerView的緩存機制是RecyclerView性能優化的基礎。

為了理解緩存的應用場景,本文首先會簡單介紹一下RecyclerView的繪制原理,然後再分析其緩存實現原理。

RecyclerView滑動時會觸發onTouchEvent#onMove,回收及復用ViewHolder在這里就會開始。我們知道設置RecyclerView時需要設置LayoutManager,LayoutManager負責RecyclerView的布局,包含對ItemView的獲取與復用。以LinearLayoutManager為例,當RecyclerView重新布局時會依次執行下面幾個方法:

上述的整個調用鏈:onLayoutChildren()->fill()->layoutChunk()->next()->getViewForPosition(),getViewForPosition()即是是從RecyclerView的回收機制實現類Recycler中獲取合適的View,下面主要就來從看這個Recycler#getViewForPosition()的實現。

上述邏輯用流程圖表示:

RecyclerView在Recyler裡面實現ViewHolder的緩存,Recycler裡面的實現緩存的主要包含以下5個對象:

public final class Recycler {

final ArrayList mAttachedScrap = new ArrayList<>();

ArrayList mChangedScrap = null;

RecyclerView在設計的時候講上述5個緩存對象分為了3級。每次創建ViewHolder的時候,會按照優先順序依次查詢緩存創建ViewHolder。每次講ViewHolder緩存到Recycler緩存的時候,也會按照優先順序依次緩存進去。三級緩存分別是:

使用自定義ViewCacheExtension後,view離屏後再回來不會走onBindViewHolder()方法。

holder.setIsRecyclable(false),這樣的話每次都會走onCreateViewHolder()和onBindViewHolder()方法

1.提前初始化viewHolder,放到緩存池中

viewPool.putRecycledView(adapter.onCreateViewHolder(recyclerView, 1))

2.提前初始化view,在onCreateViewHolder的時候去取view

3.自定義ViewCacheExtension

4.適當的增加cacheSize

4.公用緩存池,比如多個viewPager+fragment場景使用,或者全局單利緩存池,感覺用戶不大。

有2中做法有值

第一種

第二種

不會,因為prefetch(GapWorker中的一個方法)之後mViewCacheMax會變成mRequestedCacheMax + extraCache

有2種方式可以讓緩存失效

第一種

recyclerView.setItemViewCacheSize(-1)

第二種

recyclerView.setItemViewCacheSize(0)

layoutManager.isItemPrefetchEnabled = false

設置不緩存後,來回滑動讓view進入屏幕離開屏幕,viewHolder的item時會多次走onBindViewHolder()方法。

㈣ 什麼是緩沖池

一般是污水處理過程中用的,正常應該是用來減緩水流或者是過度,實際上幹啥的都有

㈤ 緩存技術 緩沖池技術 基本原理是什麼(計算機操作系統)

就是計算機會想現有載入的一些東西保存在內存裡面,下次使用起來就快多了!

㈥ RecyclerView緩存原理及優化方向

Android新增的Recyclerview主要用於代替ListView。Recyclerview可擴展性強。

RecyclerView做性能優化要說復雜也復雜,比如說布局優化,緩存,預載入等等。

其優化的點很多,在這些看似獨立的點之間,其實存在一個樞紐:Adapter。

因為所有的ViewHolder的創建和內容的綁定都需要經過Adaper的兩個函數 onCreateViewHolder和onBindViewHolder 。

因此我們性能優化的本質就是要 **減少這兩個函數的調用時間和調用的次數** 。

如果我們想對RecyclerView做性能優化,必須清楚的了解到我們的每一步操作背後,onCreateViewHolder和onBindViewHolder調用了多少次。

因此,了解RecyclerView的緩存機制是RecyclerView性能優化的基礎。

為了簡化問題,繪制原理介紹提供以下假設:

(1)類的職責介紹
LayoutManager:接管RecyclerView的Measure,Layout,Draw的過程

Recycler:緩存池

Adapter:ViewHolder的生成器和內容綁定器。

(2)繪制過程簡介

RecyclerView緩存基本上是通過三個內部類管理的, Recycler 、 RecycledViewPool 和 ViewCacheExtension 。
Recycler
用於管理已經廢棄或者與RecyclerView分離的ViewHolder,為了方便理解這個類,整理了下面的資料,內部類的成員變數和他們的含義:

RecycledViewPool
RecycledViewPool類是用來緩存Item用,是一個ViewHolder的緩存池,如果多個RecyclerView之間用 setRecycledViewPool(RecycledViewPool) 設置同一個RecycledViewPool,他們就可以共享Item。
其實RecycledViewPool的內部維護了一個Map,裡面以不同的viewType為Key存儲了各自對應的ViewHolder集合。可以通過提供的方法來修改內部緩存的Viewholder。
ViewCacheExtension
開發者可自定義的一層緩存,是虛擬類ViewCacheExtension的一個實例,開發者可實現方法getViewForPositionAndType(Recycler recycler, int position, int type)來實現自己的緩存。

屏幕內緩存指在屏幕中顯示的ViewHolder,這些ViewHolder會緩存在mAttachedScrap、mChangedScrap中 :

當列表滑動出了屏幕時,ViewHolder會被緩存在 mCachedViews ,其大小由mViewCacheMax決定,默認DEFAULT_CACHE_SIZE為2,可通過Recyclerview.setItemViewCacheSize()動態設置。

可以自己實現ViewCacheExtension類實現自定義緩存,可通過Recyclerview.setViewCacheExtension()設置。

ViewHolder在首先會緩存在 mCachedViews 中,當超過了個數(比如默認為2), 就會添加到 RecycledViewPool 中。
在有限的mCachedViews中如果存不下ViewHolder時,就會把ViewHolder存入RecyclerViewPool中。
* 按照Type來查找ViewHolder
* 每個Type默認最多緩存5個

RecycledViewPool 會根據每個ViewType把ViewHolder分別存儲在不同的列表中,每個ViewType最多緩存DEFAULT_MAX_SCRAP = 5 個ViewHolder,如果RecycledViewPool沒有被多個RecycledView共享,對於線性布局,每個ViewType最多隻有一個緩存,如果是網格有多少行就緩存多少個。

Recyclerview在獲取ViewHolder時按四級緩存的順序查找,如果沒找到就創建。其中只有RecycledViewPool找到時才會調用 bindViewHolder,其它緩存不會重新bindViewHolder 。

通過了解RecyclerView的四級緩存,我們可以知道,RecyclerView最多可以緩存 N(屏幕最多可顯示的item數) + 2 (屏幕外的緩存) + 5*M (M代表M個ViewType,緩存池的緩存),只有RecycledViewPool找到時才會重新調用 bindViewHolder。

RecyclerView在Recyler裡面實現ViewHolder的緩存,Recycler裡面的實現緩存的主要包含以下5個對象:

RecyclerView在設計的時候講上述5個緩存對象分為了3級。
每次創建ViewHolder的時候,會按照優先順序依次查詢緩存創建ViewHolder 。
三級緩存分別是:

RecyclerView緩存原理,有圖有真相
關於Recyclerview的緩存機制的理解

㈦ java怎麼實現map 緩存技術

/**
*緩存池
*@authorxiaoquan
*@create2015年3月13日上午10:32:13
*@see
*/
publicclassCachePool{
;//緩存池唯一實例
privatestaticMap<String,Object>cacheItems;//緩存Map

privateCachePool(){
cacheItems=newHashMap<String,Object>();
}
/**
*得到唯一實例
*@return
*/
(){
if(instance==null){
instance=newCachePool();
}
returninstance;
}
/**
*清除所有Item緩存
*/
(){
cacheItems.clear();
}
/**
*獲取緩存實體
*@paramname
*@return
*/
(Stringname){
if(!cacheItems.containsKey(name)){
returnnull;
}
CacheItemcacheItem=(CacheItem)cacheItems.get(name);
if(cacheItem.isExpired()){
returnnull;
}
returncacheItem.getEntity();
}
/**
*存放緩存信息
*@paramname
*@paramobj
*@paramexpires
*/
(Stringname,Objectobj,longexpires){
if(!cacheItems.containsKey(name)){
cacheItems.put(name,newCacheItem(obj,expires));
}
CacheItemcacheItem=(CacheItem)cacheItems.get(name);
cacheItem.setCreateTime(newDate());
cacheItem.setEntity(obj);
cacheItem.setExpireTime(expires);
}
(Stringname,Objectobj){
putCacheItem(name,obj,-1);
}

/**
*移除緩存數據
*@paramname
*/
(Stringname){
if(!cacheItems.containsKey(name)){
return;
}
cacheItems.remove(name);
}

/**
*獲取緩存數據的數量
*@return
*/
publicintgetSize(){
returncacheItems.size();
}
}
publicclassCacheItem{
privateDatecreateTime=newDate();//創建緩存的時間
privatelongexpireTime=1;//緩存期滿的時間
privateObjectentity;//緩存的實體

publicCacheItem(Objectobj,longexpires){
this.entity=obj;
this.expireTime=expires;
}

publicbooleanisExpired(){
return(expireTime!=-1&&newDate().getTime()-createTime.getTime()>expireTime);
}
/**
*省略getter、setter方法
*/
}

熱點內容
壓縮軟體流程 發布:2025-03-10 22:00:43 瀏覽:299
安卓哪個國家的品牌好 發布:2025-03-10 21:53:16 瀏覽:11
ftp字元集錦 發布:2025-03-10 21:37:00 瀏覽:76
如何提取腳本按鍵 發布:2025-03-10 21:29:04 瀏覽:220
遼寧省dns伺服器怎麼填物理機 發布:2025-03-10 21:25:05 瀏覽:787
雲計算機伺服器區別 發布:2025-03-10 21:10:21 瀏覽:235
古代錦衣衛需要哪些配置 發布:2025-03-10 21:06:17 瀏覽:618
ps樣式在的文件夾 發布:2025-03-10 20:50:07 瀏覽:614
圖像壓縮編碼演算法 發布:2025-03-10 20:48:23 瀏覽:386
墮落解壓縮碼 發布:2025-03-10 20:46:55 瀏覽:626