當前位置:首頁 » 硬碟大全 » 二級緩存怎麼保存
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

二級緩存怎麼保存

發布時間: 2022-05-16 12:36:44

❶ mybatis 二級緩存怎麼使用

深入了解MyBatis二級緩存
一、創建Cache的完整過程
我們從sqlSessionFactoryBuilder解析mybatis-config.xml配置文件開始:
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

然後是:
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());

看parser.parse()方法:
parseConfiguration(parser.evalNode("/configuration"));

看處理Mapper.xml文件的位置:
mapperElement(root.evalNode("mappers"));

看處理Mapper.xml的XMLMapperBuilder:
XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration,
resource, configuration.getSqlFragments());
mapperParser.parse();

繼續看parse方法:
configurationElement(parser.evalNode("/mapper"));

到這里:
String namespace = context.getStringAttribute("namespace");
if (namespace.equals("")) {
throw new BuilderException("Mapper's namespace cannot be empty");
}
builderAssistant.setCurrentNamespace(namespace);
cacheRefElement(context.evalNode("cache-ref"));
cacheElement(context.evalNode("cache"));

從這里看到namespace就是xml中<mapper>元素的屬性。然後下面是先後處理的cache-ref和cache,後面的cache會覆蓋前面的cache-ref,但是如果一開始cache-ref沒有找到引用的cache,他就不會被覆蓋,會一直到最後處理完成為止,最後如果存在cache,反而會被cache-ref覆蓋。這里是不是看著有點暈、有點亂?所以千萬別同時配置這兩個,實際上也很少有人會這么做。
看看MyBatis如何處理<cache/>:
private void cacheElement(XNode context) throws Exception {
if (context != null) {
String type = context.getStringAttribute("type", "PERPETUAL");
Class<? extends Cache> typeClass = typeAliasRegistry.resolveAlias(type);
String eviction = context.getStringAttribute("eviction", "LRU");
Class<? extends Cache> evictionClass = typeAliasRegistry.resolveAlias(eviction);
Long flushInterval = context.getLongAttribute("flushInterval");
Integer size = context.getIntAttribute("size");
boolean readWrite = !context.getBooleanAttribute("readOnly", false);
boolean blocking = context.getBooleanAttribute("blocking", false);
Properties props = context.getChildrenAsProperties();
builderAssistant.useNewCache(typeClass, evictionClass,
flushInterval, size, readWrite, blocking, props);
}
}

從源碼可以看到MyBatis讀取了那些屬性,而且很容易可以到這些屬性的默認值。
創建Java的cache對象方法為builderAssistant.useNewCache,我們看看這段代碼:
public Cache useNewCache(Class<? extends Cache> typeClass,
Class<? extends Cache> evictionClass,
Long flushInterval,
Integer size,
boolean readWrite,
boolean blocking,
Properties props) {
typeClass = valueOrDefault(typeClass, PerpetualCache.class);
evictionClass = valueOrDefault(evictionClass, LruCache.class);
Cache cache = new CacheBuilder(currentNamespace)
.implementation(typeClass)
.addDecorator(evictionClass)
.clearInterval(flushInterval)
.size(size)
.readWrite(readWrite)
.blocking(blocking)
.properties(props)
.build();
configuration.addCache(cache);
currentCache = cache;
return cache;
}

從調用該方法的地方,我們可以看到並沒有使用返回值cache,在後面的過程中創建MappedStatement的時候使用了currentCache。
二、使用Cache過程
在系統中,使用Cache的地方在CachingExecutor中:
@Override
public <E> List<E> query(
MappedStatement ms, Object parameterObject,
RowBounds rowBounds, ResultHandler resultHandler,
CacheKey key, BoundSql boundSql) throws SQLException {
Cache cache = ms.getCache();

獲取cache後,先判斷是否有二級緩存。
只有通過<cache/>,<cache-ref/>或@CacheNamespace,@CacheNamespaceRef標記使用緩存的Mapper.xml或Mapper介面(同一個namespace,不能同時使用)才會有二級緩存。
if (cache != null) {

如果cache存在,那麼會根據sql配置(<insert>,<select>,<update>,<delete>的flushCache屬性來確定是否清空緩存。
flushCacheIfRequired(ms);

然後根據xml配置的屬性useCache來判斷是否使用緩存(resultHandler一般使用的默認值,很少會null)。
if (ms.isUseCache() && resultHandler == null) {

確保方法沒有Out類型的參數,mybatis不支持存儲過程的緩存,所以如果是存儲過程,這里就會報錯。
ensureNoOutParams(ms, parameterObject, boundSql);

沒有問題後,就會從cache中根據key來取值:
@SuppressWarnings("unchecked")
List<E> list = (List<E>) tcm.getObject(cache, key);

如果沒有緩存,就會執行查詢,並且將查詢結果放到緩存中。
if (list == null) {
list = delegate.<E>query(ms, parameterObject,
rowBounds, resultHandler, key, boundSql);
tcm.putObject(cache, key, list); // issue #578 and #116
}

返回結果
return list;
}
}

沒有緩存時,直接執行查詢
return delegate.<E>query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
}

在上面的代碼中tcm.putObject(cache, key, list);這句代碼是緩存了結果。但是實際上直到sqlsession關閉,MyBatis才以序列化的形式保存到了一個Map(默認的緩存配置)中。

三、Cache使用時的注意事項
1. 只能在【只有單表操作】的表上使用緩存
不只是要保證這個表在整個系統中只有單表操作,而且和該表有關的全部操作必須全部在一個namespace下。
2. 在可以保證查詢遠遠大於insert,update,delete操作的情況下使用緩存
這一點不需要多說,所有人都應該清楚。記住,這一點需要保證在1的前提下才可以!

四、避免使用二級緩存
可能會有很多人不理解這里,二級緩存帶來的好處遠遠比不上他所隱藏的危害。
緩存是以namespace為單位的,不同namespace下的操作互不影響。
insert,update,delete操作會清空所在namespace下的全部緩存。
通常使用MyBatis Generator生成的代碼中,都是各個表獨立的,每個表都有自己的namespace。
為什麼避免使用二級緩存
在符合【Cache使用時的注意事項】的要求時,並沒有什麼危害。
其他情況就會有很多危害了。
針對一個表的某些操作不在他獨立的namespace下進行。
例如在UserMapper.xml中有大多數針對user表的操作。但是在一個XXXMapper.xml中,還有針對user單表的操作。
這會導致user在兩個命名空間下的數據不一致。如果在UserMapper.xml中做了刷新緩存的操作,在XXXMapper.xml中緩存仍然有效,如果有針對user的單表查詢,使用緩存的結果可能會不正確。
更危險的情況是在XXXMapper.xml做了insert,update,delete操作時,會導致UserMapper.xml中的各種操作充滿未知和風險。
有關這樣單表的操作可能不常見。但是你也許想到了一種常見的情況。
多表操作一定不能使用緩存
為什麼不能?
首先不管多表操作寫到那個namespace下,都會存在某個表不在這個namespace下的情況。
例如兩個表:role和user_role,如果我想查詢出某個用戶的全部角色role,就一定會涉及到多表的操作。
<select id="selectUserRoles" resultType="UserRoleVO">
select * from user_role a,role b where a.roleid = b.roleid and a.userid = #{userid}
</select>123123

像上面這個查詢,你會寫到那個xml中呢??
不管是寫到RoleMapper.xml還是UserRoleMapper.xml,或者是一個獨立的XxxMapper.xml中。如果使用了二級緩存,都會導致上面這個查詢結果可能不正確。
如果你正好修改了這個用戶的角色,上面這個查詢使用緩存的時候結果就是錯的。
這點應該很容易理解。
在我看來,就以MyBatis目前的緩存方式來看是無解的。多表操作根本不能緩存。
如果你讓他們都使用同一個namespace(通過<cache-ref>)來避免臟數據,那就失去了緩存的意義。
看到這里,實際上就是說,二級緩存不能用。整篇文章介紹這么多也沒什麼用了。

五、挽救二級緩存?
想更高效率的使用二級緩存是解決不了了。
但是解決多表操作避免臟數據還是有法解決的。解決思路就是通過攔截器判斷執行的sql涉及到那些表(可以用jsqlparser解析),然後把相關表的緩存自動清空。但是這種方式對緩存的使用效率是很低的。
設計這樣一個插件是相當復雜的,既然我沒想著去實現,就不廢話了。
最後還是建議,放棄二級緩存,在業務層使用可控制的緩存代替更好。

❷ 什麼是二級緩存二級緩存是用作什麼

CPU緩存(Cache Memory)位於CPU與內存之間的臨時存儲器,它的容量比內存小但交換速度快。在緩存中的數據是內存中的一小部分,但這一小部分是短時間內CPU即將訪問的,當CPU調用大量數據時,就可避開內存直接從緩存中調用,從而加快讀取速度。由此可見,在CPU中加入緩存是一種高效的解決方案,這樣整個內存儲器(緩存+內存)就變成了既有緩存的高速度,又有內存的大容量的存儲系統了。緩存對CPU的性能影響很大,主要是因為CPU的數據交換順序和CPU與緩存間的帶寬引起的。
緩存的工作原理是當CPU要讀取一個數據時,首先從緩存中查找,如果找到就立即讀取並送給CPU處理;如果沒有找到,就用相對慢的速度從內存中讀取並送給CPU處理,同時把這個數據所在的數據塊調入緩存中,可以使得以後對整塊數據的讀取都從緩存中進行,不必再調用內存。

正是這樣的讀取機制使CPU讀取緩存的命中率非常高(大多數CPU可達90%左右),也就是說CPU下一次要讀取的數據90%都在緩存中,只有大約10%需要從內存讀取。這大大節省了CPU直接讀取內存的時間,也使CPU讀取數據時基本無需等待。總的來說,CPU讀取數據的順序是先緩存後內存。

最早先的CPU緩存是個整體的,而且容量很低,英特爾公司從Pentium時代開始把緩存進行了分類。當時集成在CPU內核中的緩存已不足以滿足CPU的需求,而製造工藝上的限制又不能大幅度提高緩存的容量。因此出現了集成在與CPU同一塊電路板上或主板上的緩存,此時就把 CPU內核集成的緩存稱為一級緩存,而外部的稱為二級緩存。一級緩存中還分數據緩存(Data Cache,D-Cache)和指令緩存(Instruction Cache,I-Cache)。二者分別用來存放數據和執行這些數據的指令,而且兩者可以同時被CPU訪問,減少了爭用Cache所造成的沖突,提高了處理器效能。英特爾公司在推出Pentium 4處理器時,用新增的一種一級追蹤緩存替代指令緩存,容量為12KμOps,表示能存儲12K條微指令。

隨著CPU製造工藝的發展,二級緩存也能輕易的集成在CPU內核中,容量也在逐年提升。現在再用集成在CPU內部與否來定義一、二級緩存,已不確切。而且隨著二級緩存被集成入CPU內核中,以往二級緩存與CPU大差距分頻的情況也被改變,此時其以相同於主頻的速度工作,可以為CPU提供更高的傳輸速度。

二級緩存是CPU性能表現的關鍵之一,在CPU核心不變化的情況下,增加二級緩存容量能使性能大幅度提高。而同一核心的CPU高低端之分往往也是在二級緩存上有差異,由此可見二級緩存對於CPU的重要性。

CPU在緩存中找到有用的數據被稱為命中,當緩存中沒有CPU所需的數據時(這時稱為未命中),CPU才訪問內存。從理論上講,在一顆擁有二級緩存的CPU中,讀取一級緩存的命中率為80%。也就是說CPU一級緩存中找到的有用數據占數據總量的80%,剩下的20%從二級緩存中讀取。由於不能准確預測將要執行的數據,讀取二級緩存的命中率也在80%左右(從二級緩存讀到有用的數據占總數據的16%)。那麼還有的數據就不得不從內存調用,但這已經是一個相當小的比例了。目前的較高端的CPU中,還會帶有三級緩存,它是為讀取二級緩存後未命中的數據設計的—種緩存,在擁有三級緩存的CPU中,只有約5%的數據需要從內存中調用,這進一步提高了CPU的效率。

為了保證CPU訪問時有較高的命中率,緩存中的內容應該按一定的演算法替換。一種較常用的演算法是「最近最少使用演算法」(LRU演算法),它是將最近一段時間內最少被訪問過的行淘汰出局。因此需要為每行設置一個計數器,LRU演算法是把命中行的計數器清零,其他各行計數器加1。當需要替換時淘汰行計數器計數值最大的數據行出局。這是一種高效、科學的演算法,其計數器清零過程可以把一些頻繁調用後再不需要的數據淘汰出緩存,提高緩存的利用率。

CPU產品中,一級緩存的容量基本在4KB到64KB之間,二級緩存的容量則分為128KB、256KB、512KB、1MB、2MB等。一級緩存容量各產品之間相差不大,而二級緩存容量則是提高CPU性能的關鍵。二級緩存容量的提升是由CPU製造工藝所決定的,容量增大必然導致CPU內部晶體管數的增加,要在有限的CPU面積上集成更大的緩存,對製造工藝的要求也就越高
回答者:wang_wjun - 經理 四級 5-26 22:11
簡單的跟你你說吧,影響CPU速度的重要也就是二級緩存,二級緩存越大,速度越快.
回答者:藍色X旋風 - 見習魔法師 二級 5-26 22:12
CPU緩存(Cache Memory)位於CPU與內存之間的臨時存儲器,它的容量比內存小但交換速度快。在緩存中的數據是內存中的一小部分,但這一小部分是短時間內CPU即將訪問的,當CPU調用大量數據時,就可避開內存直接從緩存中調用,從而加快讀取速度。由此可見,在CPU中加入緩存是一種高效的解決方案,這樣整個內存儲器(緩存+內存)就變成了既有緩存的高速度,又有內存的大容量的存儲系統了。緩存對CPU的性能影響很大,主要是因為CPU的數據交換順序和CPU與緩存間的帶寬引起的。

緩存的工作原理是當CPU要讀取一個數據時,首先從緩存中查找,如果找到就立即讀取並送給CPU處理;如果沒有找到,就用相對慢的速度從內存中讀取並送給CPU處理,同時把這個數據所在的數據塊調入緩存中,可以使得以後對整塊數據的讀取都從緩存中進行,不必再調用內存。

正是這樣的讀取機制使CPU讀取緩存的命中率非常高(大多數CPU可達90%左右),也就是說CPU下一次要讀取的數據90%都在緩存中,只有大約10%需要從內存讀取。這大大節省了CPU直接讀取內存的時間,也使CPU讀取數據時基本無需等待。總的來說,CPU讀取數據的順序是先緩存後內存。

最早先的CPU緩存是個整體的,而且容量很低,英特爾公司從Pentium時代開始把緩存進行了分類。當時集成在CPU內核中的緩存已不足以滿足CPU的需求,而製造工藝上的限制又不能大幅度提高緩存的容量。因此出現了集成在與CPU同一塊電路板上或主板上的緩存,此時就把 CPU內核集成的緩存稱為一級緩存,而外部的稱為二級緩存。一級緩存中還分數據緩存(Data Cache,D-Cache)和指令緩存(Instruction Cache,I-Cache)。二者分別用來存放數據和執行這些數據的指令,而且兩者可以同時被CPU訪問,減少了爭用Cache所造成的沖突,提高了處理器效能。英特爾公司在推出Pentium 4處理器時,用新增的一種一級追蹤緩存替代指令緩存,容量為12KμOps,表示能存儲12K條微指令。

隨著CPU製造工藝的發展,二級緩存也能輕易的集成在CPU內核中,容量也在逐年提升。現在再用集成在CPU內部與否來定義一、二級緩存,已不確切。而且隨著二級緩存被集成入CPU內核中,以往二級緩存與CPU大差距分頻的情況也被改變,此時其以相同於主頻的速度工作,可以為CPU提供更高的傳輸速度。

二級緩存是CPU性能表現的關鍵之一,在CPU核心不變化的情況下,增加二級緩存容量能使性能大幅度提高。而同一核心的CPU高低端之分往往也是在二級緩存上有差異,由此可見二級緩存對於CPU的重要性。

CPU在緩存中找到有用的數據被稱為命中,當緩存中沒有CPU所需的數據時(這時稱為未命中),CPU才訪問內存。從理論上講,在一顆擁有二級緩存的CPU中,讀取一級緩存的命中率為80%。也就是說CPU一級緩存中找到的有用數據占數據總量的80%,剩下的20%從二級緩存中讀取。由於不能准確預測將要執行的數據,讀取二級緩存的命中率也在80%左右(從二級緩存讀到有用的數據占總數據的16%)。那麼還有的數據就不得不從內存調用,但這已經是一個相當小的比例了。目前的較高端的CPU中,還會帶有三級緩存,它是為讀取二級緩存後未命中的數據設計的—種緩存,在擁有三級緩存的CPU中,只有約5%的數據需要從內存中調用,這進一步提高了CPU的效率。

為了保證CPU訪問時有較高的命中率,緩存中的內容應該按一定的演算法替換。一種較常用的演算法是「最近最少使用演算法」(LRU演算法),它是將最近一段時間內最少被訪問過的行淘汰出局。因此需要為每行設置一個計數器,LRU演算法是把命中行的計數器清零,其他各行計數器加1。當需要替換時淘汰行計數器計數值最大的數據行出局。這是一種高效、科學的演算法,其計數器清零過程可以把一些頻繁調用後再不需要的數據淘汰出緩存,提高緩存的利用率。

CPU產品中,一級緩存的容量基本在4KB到64KB之間,二級緩存的容量則分為128KB、256KB、512KB、1MB、2MB等。一級緩存容量各產品之間相差不大,而二級緩存容量則是提高CPU性能的關鍵。二級緩存容量的提升是由CPU製造工藝所決定的,容量增大必然導致CPU內部晶體管數的增加,要在有限的CPU面積上集成更大的緩存,對製造工藝的要求也就越高。
回答者:jiesoft - 助理 二級 5-26 22:12
評定一顆CPU的性能,除了看主頻以外,緩存也非常重要,什麼是緩存?簡單的說:因為CPU的速度很快了,其它硬體如內存、硬碟的速度跟不上,CPU讀取數據時就要等待,而設置緩存能預先把CPU要讀取的數據放在緩存中,緩存的速度很快,這樣就顯著提高了CPU的運行效率。那麼緩存容量越大,CPU的執行效率也就越好,由於現在的CPU速度越來越快,為了發揮性能,又有了一級緩存和二級緩存。

你一定知道奔騰和賽揚吧,它們往往GHz是一樣的,但為什麼一個那麼貴,另一個那麼便宜?因為奔騰的綜合性能要比賽揚好很多!為什麼好很多?關鍵就是它們的一級緩存和二級緩存相差了很多!

我想,說到這里,你應該明白了吧,看CPU的性能,既要看它的主頻,又要看它的緩存。
回答者:houbin3651 - 狀元 十四級 5-26 22:13
CPU緩存(Cache Memory)位於CPU與內存之間的臨時存儲器,它的容量比內存小但交換速度快。在緩存中的數據是內存中的一小部分,但這一小部分是短時間內CPU即將訪問的,當CPU調用大量數據時,就可避開內存直接從緩存中調用,從而加快讀取速度。由此可見,在CPU中加入緩存是一種高效的解決方案,這樣整個內存儲器(緩存+內存)就變成了既有緩存的高速度,又有內存的大容量的存儲系統了。緩存對CPU的性能影響很大,主要是因為CPU的數據交換順序和CPU與緩存間的帶寬引起的。

緩存的工作原理是當CPU要讀取一個數據時,首先從緩存中查找,如果找到就立即讀取並送給CPU處理;如果沒有找到,就用相對慢的速度從內存中讀取並送給CPU處理,同時把這個數據所在的數據塊調入緩存中,可以使得以後對整塊數據的讀取都從緩存中進行,不必再調用內存。

正是這樣的讀取機制使CPU讀取緩存的命中率非常高(大多數CPU可達90%左右),也就是說CPU下一次要讀取的數據90%都在緩存中,只有大約10%需要從內存讀取。這大大節省了CPU直接讀取內存的時間,也使CPU讀取數據時基本無需等待。總的來說,CPU讀取數據的順序是先緩存後內存。

最早先的CPU緩存是個整體的,而且容量很低,英特爾公司從Pentium時代開始把緩存進行了分類。當時集成在CPU內核中的緩存已不足以滿足CPU的需求,而製造工藝上的限制又不能大幅度提高緩存的容量。因此出現了集成在與CPU同一塊電路板上或主板上的緩存,此時就把 CPU內核集成的緩存稱為一級緩存,而外部的稱為二級緩存。一級緩存中還分數據緩存(Data Cache,D-Cache)和指令緩存(Instruction Cache,I-Cache)。二者分別用來存放數據和執行這些數據的指令,而且兩者可以同時被CPU訪問,減少了爭用Cache所造成的沖突,提高了處理器效能。英特爾公司在推出Pentium 4處理器時,用新增的一種一級追蹤緩存替代指令緩存,容量為12KμOps,表示能存儲12K條微指令。

隨著CPU製造工藝的發展,二級緩存也能輕易的集成在CPU內核中,容量也在逐年提升。現在再用集成在CPU內部與否來定義一、二級緩存,已不確切。而且隨著二級緩存被集成入CPU內核中,以往二級緩存與CPU大差距分頻的情況也被改變,此時其以相同於主頻的速度工作,可以為CPU提供更高的傳輸速度。

二級緩存是CPU性能表現的關鍵之一,在CPU核心不變化的情況下,增加二級緩存容量能使性能大幅度提高。而同一核心的CPU高低端之分往往也是在二級緩存上有差異,由此可見二級緩存對於CPU的重要性。

CPU在緩存中找到有用的數據被稱為命中,當緩存中沒有CPU所需的數據時(這時稱為未命中),CPU才訪問內存。從理論上講,在一顆擁有二級緩存的CPU中,讀取一級緩存的命中率為80%。也就是說CPU一級緩存中找到的有用數據占數據總量的80%,剩下的20%從二級緩存中讀取。由於不能准確預測將要執行的數據,讀取二級緩存的命中率也在80%左右(從二級緩存讀到有用的數據占總數據的16%)。那麼還有的數據就不得不從內存調用,但這已經是一個相當小的比例了。目前的較高端的CPU中,還會帶有三級緩存,它是為讀取二級緩存後未命中的數據設計的—種緩存,在擁有三級緩存的CPU中,只有約5%的數據需要從內存中調用,這進一步提高了CPU的效率。

為了保證CPU訪問時有較高的命中率,緩存中的內容應該按一定的演算法替換。一種較常用的演算法是「最近最少使用演算法」(LRU演算法),它是將最近一段時間內最少被訪問過的行淘汰出局。因此需要為每行設置一個計數器,LRU演算法是把命中行的計數器清零,其他各行計數器加1。當需要替換時淘汰行計數器計數值最大的數據行出局。這是一種高效、科學的演算法,其計數器清零過程可以把一些頻繁調用後再不需要的數據淘汰出緩存,提高緩存的利用率。

CPU產品中,一級緩存的容量基本在4KB到64KB之間,二級緩存的容量則分為128KB、256KB、512KB、1MB、2MB等。一級緩存容量各產品之間相差不大,而二級緩存容量則是提高CPU性能的關鍵。二級緩存容量的提升是由CPU製造工藝所決定的,容量增大必然導致CPU內部晶體管數的增加,要在有限的CPU面積上集成更大的緩存,對製造工藝的要求也就越高。

雙核心CPU的二級緩存比較特殊,和以前的單核心CPU相比,最重要的就是兩個內核的緩存所保存的數據要保持一致,否則就會出現錯誤,為了解決這個問題不同的CPU使用了不同的辦法:

Intel雙核心處理器的二級緩存
目前Intel的雙核心CPU主要有Pentium D、Pentium EE、Core Duo三種,其中Pentium D、Pentium EE的二級緩存方式完全相同。Pentium D和Pentium EE的二級緩存都是CPU內部兩個內核具有互相獨立的二級緩存,其中,8xx系列的Smithfield核心CPU為每核心1MB,而9xx系列的Presler核心CPU為每核心2MB。這種CPU內部的兩個內核之間的緩存數據同步是依靠位於主板北橋晶元上的仲裁單元通過前端匯流排在兩個核心之間傳輸來實現的,所以其數據延遲問題比較嚴重,性能並不盡如人意。
Core Duo使用的核心為Yonah,它的二級緩存則是兩個核心共享2MB的二級緩存,共享式的二級緩存配合Intel的「Smart cache」共享緩存技術,實現了真正意義上的緩存數據同步,大幅度降低了數據延遲,減少了對前端匯流排的佔用,性能表現不錯,是目前雙核心處理器上最先進的二級緩存架構。今後Intel的雙核心處理器的二級緩存都會採用這種兩個內核共享二級緩存的「Smart cache」共享緩存技術。

AMD雙核心處理器的二級緩存
Athlon 64 X2 CPU的核心主要有Manchester和Toledo兩種,他們的二級緩存都是CPU內部兩個內核具有互相獨立的二級緩存,其中,Manchester核心為每核心512KB,而Toledo核心為每核心1MB。處理器內部的兩個內核之間的緩存數據同步是依靠CPU內置的System Request Interface(系統請求介面,SRI)控制,傳輸在CPU內部即可實現。這樣一來,不但CPU資源佔用很小,而且不必佔用內存匯流排資源,數據延遲也比Intel的Smithfield核心和Presler核心大為減少,協作效率明顯勝過這兩種核心。不過,由於這種方式仍然是兩個內核的緩存相互獨立,從架構上來看也明顯不如以Yonah核心為代表的Intel的共享緩存技術Smart Cache。

補充一點:緩存太大會加長定址時間,所以太大反而會影響速度

內存的速度遠遠跟不上CPU的速度,現在一、二級緩存都是在內存和CPU之間,內存就像一個倉庫,一個速度比較慢的倉庫,而CPU就是一個速度很快的執行者,如果沒有了一、二級緩存,CPU就只能在內存的速度上運行,而有了一、二級緩存的話,就不同了,它可以先到內存「倉庫」中,預先讀去CPU想要的數據,這樣通過這兩級緩存,CPU和內存就可以有一個很好的協調了,有些高級的CPU甚至有三級緩存!!!

❸ 什麼是hibernate中的二級緩存

第一級別的緩存是Session級別的緩存,是屬於事務范圍的緩存,由Hibernate管理,一般無需進行干預。第二級別的緩存是SessionFactory級別的緩存,是屬於進程范圍的緩存。


二級緩存也分為了兩種

內置緩存:Hibernate自帶的,不可卸載,通常在Hibernate的初始化階段,Hibernate會把映射元數據和預定義的SQL語句放置到SessionFactory的緩存中。該內置緩存是只讀的。

外置緩存:通常說的二級緩存也就是外置緩存,在默認情況下SessionFactory不會啟用這個緩存插件,外置緩存中的數據是資料庫數據的復制,外置緩存的物理介質可以是內存或者硬碟。

hibernate二級緩存的結構


2.並發訪問策略

transactional

(事務型)

僅在受管理的環境中適用

提供Repeatable Read事務隔離級別

適用經常被讀,很少修改的數據

可以防止臟讀和不可重復讀的並發問題

緩存支持事務,發生異常的時候,緩存也能夠回滾

read-write

(讀寫型)

提供Read Committed事務隔離級別

在非集群的環境中適用

適用經常被讀,很少修改的數據

可以防止臟讀

更新緩存的時候會鎖定緩存中的數據

nonstrict-read-write

(非嚴格讀寫型)

適用極少被修改,偶爾允許臟讀的數據(兩個事務同時修改數據的情況很少見)

不保證緩存和資料庫中數據的一致性

為緩存數據設置很短的過期時間,從而盡量避免臟讀

不鎖定緩存中的數據

read-only

(只讀型)

適用從來不會被修改的數據(如參考數據)

在此模式下,如果對數據進行更新操作,會有異常

事務隔離級別低,並發性能高

在集群環境中也能完美運作

分析:通過上述表格分析如下

適合放入二級緩存中數據

很少被修改

不是很重要的數據,允許出現偶爾的並發問題

不適合放入二級緩存中的數據

經常被修改

財務數據,絕對不允許出現並發問題

與其他應用數據共享的數據


❹ 一級緩存和二級緩存是什麼意思

一級緩存(Level
1
Cache)簡稱L1
Cache,位於CPU內核的旁邊,是與CPU結合最為緊密的CPU緩存,也是歷史上最早出現的CPU緩存。由於一級緩存的技術難度和製造成本最高,提高容量所帶來的技術難度增加和成本增加非常大,所帶來的性能提升卻不明顯,性價比很低,而且現有的一級緩存的命中率已經很高,所以一級緩存是所有緩存中容量最小的,比二級緩存要小得多。
一般來說,一級緩存可以分為一級數據緩存(Data
Cache,D-Cache)和一級指令緩存(Instruction
Cache,I-Cache)。二者分別用來存放數據以及對執行這些數據的指令進行即時解碼,而且兩者可以同時被CPU訪問,減少了爭用Cache所造成的沖突,提高了處理器效能。目前大多數CPU的一級數據緩存和一級指令緩存具有相同的容量,例如AMD的Athlon
XP就具有64KB的一級數據緩存和64KB的一級指令緩存,其一級緩存就以64KB+64KB來表示,其餘的CPU的一級緩存表示方法以此類推。
二級緩存是CPU性能表現的關鍵之一,在CPU核心不變化的情況下,增加二級緩存容量能使性能大幅度提高。而同一核心的CPU高低端之分往往也是在二級緩存上有差異,由此可見二級緩存對於CPU的重要性。

❺ CPU一級二級緩存保存在哪個文件中

CPU的二級緩存是默認開啟的,所謂的在注冊表中修改相應的secondlevelcache鍵值來打開二級緩存是不對的,那隻是一個映射,如果不開啟二級緩存,電腦的性能會很受影響. Windows XP系統中,默認狀態下CPU二級緩存並未打開。為了提高系統性能,我們可以通過修改注冊表,或使用「Windows優化大師」等軟體來開啟它。 運行注冊表編輯器,展開HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management分支,雙擊右側窗口中的「SecondLevelDataCace」,然後在彈出的窗口中直接填入當前計算機所使用的CPU的二級緩存容量即可。 賽揚處理器的二級緩存為128KB,應將其值設置為80(16進制,下同)。PⅡ、PⅢ、P4均為512KB二級緩存,應設置為200;PⅢE(EB)、P4 Willamette只有256KB二級緩存,應設置為100;AMD Duron只有64KB二級緩存,應設置為40;K6-3擁有256KB二級緩存;Athlon擁有512KB二級緩存;Athlon XP擁有256KB二級緩存;Athlon XP(Barton核心)擁有512KB二級緩存。 使用Windows優化大師也可以正確設置CPU的二級緩存:啟動Windows優化大師,選擇「系統性能優化」,在「文件系統優化」中,最上面就是關於CPU二級緩存的設置項。拖動滑塊到相應的位置後,保存設置並重新啟動計算機即可。

❻ 二級緩存是什麼意思它和緩存有什麼區別

二級緩存容量
CPU緩存(Cache Memory)是位於CPU與內存之間的臨時存儲器,它的容量比內存小但交換速度快。在緩存中的數據是內存中的一小部分,但這一小部分是短時間內CPU即將訪問的,當CPU調用大量數據時,就可避開內存直接從緩存中調用,從而加快讀取速度。由此可見,在CPU中加入緩存是一種高效的解決方案,這樣整個內存儲器(緩存+內存)就變成了既有緩存的高速度,又有內存的大容量的存儲系統了。緩存對CPU的性能影響很大,主要是因為CPU的數據交換順序和CPU與緩存間的帶寬引起的。

緩存的工作原理是當CPU要讀取一個數據時,首先從緩存中查找,如果找到就立即讀取並送給CPU處理;如果沒有找到,就用相對慢的速度從內存中讀取並送給CPU處理,同時把這個數據所在的數據塊調入緩存中,可以使得以後對整塊數據的讀取都從緩存中進行,不必再調用內存。

正是這樣的讀取機制使CPU讀取緩存的命中率非常高(大多數CPU可達90%左右),也就是說CPU下一次要讀取的數據90%都在緩存中,只有大約10%需要從內存讀取。這大大節省了CPU直接讀取內存的時間,也使CPU讀取數據時基本無需等待。總的來說,CPU讀取數據的順序是先緩存後內存。

最早先的CPU緩存是個整體的,而且容量很低,英特爾公司從Pentium時代開始把緩存進行了分類。當時集成在CPU內核中的緩存已不足以滿足CPU的需求,而製造工藝上的限制又不能大幅度提高緩存的容量。因此出現了集成在與CPU同一塊電路板上或主板上的緩存,此時就把 CPU內核集成的緩存稱為一級緩存,而外部的稱為二級緩存。一級緩存中還分數據緩存(Data Cache,D-Cache)和指令緩存(Instruction Cache,I-Cache)。二者分別用來存放數據和執行這些數據的指令,而且兩者可以同時被CPU訪問,減少了爭用Cache所造成的沖突,提高了處理器效能。英特爾公司在推出Pentium 4處理器時,用新增的一種一級追蹤緩存替代指令緩存,容量為12KμOps,表示能存儲12K條微指令。

隨著CPU製造工藝的發展,二級緩存也能輕易的集成在CPU內核中,容量也在逐年提升。現在再用集成在CPU內部與否來定義一、二級緩存,已不確切。而且隨著二級緩存被集成入CPU內核中,以往二級緩存與CPU大差距分頻的情況也被改變,此時其以相同於主頻的速度工作,可以為CPU提供更高的傳輸速度。

二級緩存是CPU性能表現的關鍵之一,在CPU核心不變化的情況下,增加二級緩存容量能使性能大幅度提高。而同一核心的CPU高低端之分往往也是在二級緩存上有差異,由此可見二級緩存對於CPU的重要性。

CPU在緩存中找到有用的數據被稱為命中,當緩存中沒有CPU所需的數據時(這時稱為未命中),CPU才訪問內存。從理論上講,在一顆擁有二級緩存的CPU中,讀取一級緩存的命中率為80%。也就是說CPU一級緩存中找到的有用數據占數據總量的80%,剩下的20%從二級緩存中讀取。由於不能准確預測將要執行的數據,讀取二級緩存的命中率也在80%左右(從二級緩存讀到有用的數據占總數據的16%)。那麼還有的數據就不得不從內存調用,但這已經是一個相當小的比例了。目前的較高端的CPU中,還會帶有三級緩存,它是為讀取二級緩存後未命中的數據設計的—種緩存,在擁有三級緩存的CPU中,只有約5%的數據需要從內存中調用,這進一步提高了CPU的效率。

為了保證CPU訪問時有較高的命中率,緩存中的內容應該按一定的演算法替換。一種較常用的演算法是「最近最少使用演算法」(LRU演算法),它是將最近一段時間內最少被訪問過的行淘汰出局。因此需要為每行設置一個計數器,LRU演算法是把命中行的計數器清零,其他各行計數器加1。當需要替換時淘汰行計數器計數值最大的數據行出局。這是一種高效、科學的演算法,其計數器清零過程可以把一些頻繁調用後再不需要的數據淘汰出緩存,提高緩存的利用率。

CPU產品中,一級緩存的容量基本在4KB到64KB之間,二級緩存的容量則分為128KB、256KB、512KB、1MB、2MB等。一級緩存容量各產品之間相差不大,而二級緩存容量則是提高CPU性能的關鍵。二級緩存容量的提升是由CPU製造工藝所決定的,容量增大必然導致CPU內部晶體管數的增加,要在有限的CPU面積上集成更大的緩存,對製造工藝的要求也就越高。

雙核心CPU的二級緩存比較特殊,和以前的單核心CPU相比,最重要的就是兩個內核的緩存所保存的數據要保持一致,否則就會出現錯誤,為了解決這個問題不同的CPU使用了不同的辦法:

Intel雙核心處理器的二級緩存
目前Intel的雙核心CPU主要有Pentium D、Pentium EE、Core Duo三種,其中Pentium D、Pentium EE的二級緩存方式完全相同。Pentium D和Pentium EE的二級緩存都是CPU內部兩個內核具有互相獨立的二級緩存,其中,8xx系列的Smithfield核心CPU為每核心1MB,而9xx系列的Presler核心CPU為每核心2MB。這種CPU內部的兩個內核之間的緩存數據同步是依靠位於主板北橋晶元上的仲裁單元通過前端匯流排在兩個核心之間傳輸來實現的,所以其數據延遲問題比較嚴重,性能並不盡如人意。
Core Duo使用的核心為Yonah,它的二級緩存則是兩個核心共享2MB的二級緩存,共享式的二級緩存配合Intel的「Smart cache」共享緩存技術,實現了真正意義上的緩存數據同步,大幅度降低了數據延遲,減少了對前端匯流排的佔用,性能表現不錯,是目前雙核心處理器上最先進的二級緩存架構。今後Intel的雙核心處理器的二級緩存都會採用這種兩個內核共享二級緩存的「Smart cache」共享緩存技術。

AMD雙核心處理器的二級緩存
Athlon 64 X2 CPU的核心主要有Manchester和Toledo兩種,他們的二級緩存都是CPU內部兩個內核具有互相獨立的二級緩存,其中,Manchester核心為每核心512KB,而Toledo核心為每核心1MB。處理器內部的兩個內核之間的緩存數據同步是依靠CPU內置的System Request Interface(系統請求介面,SRI)控制,傳輸在CPU內部即可實現。這樣一來,不但CPU資源佔用很小,而且不必佔用內存匯流排資源,數據延遲也比Intel的Smithfield核心和Presler核心大為減少,協作效率明顯勝過這兩種核心。不過,由於這種方式仍然是兩個內核的緩存相互獨立,從架構上來看也明顯不如以Yonah核心為代表的Intel的共享緩存技術Smart Cache。

❼ 系統緩存文件存放在哪裡怎麼加大二級緩存

1.系統緩存文件

主要在這兩個文件夾
C:\Documents and Settings\Administrator\Local Settings\Temp

C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files
2.頁面文件

右鍵點擊「我的電腦」->點擊「屬性」->「高級」->「性能選項」->「更改」,看看是不是每個盤里都有設置 最大值x 最小值y

3.2級緩存

CPU硬體存儲 不能升級.

❽ 二級緩存是什麼意思有什麼作用 二級緩存和三級緩存的區別

點評:了解了電腦緩存的作用,對於電腦緩存又分為一級、二級、三級緩存。那麼小編就對緩存來逐一介紹吧
呢?那麼這里小編就針對以上疑問給大家作詳細講解。
電腦緩存是當cpu在讀取數據的時候,先是從緩存文件中查找,然後找到之後會自動讀取在輸入到cpu進行處理,當然如果沒有在緩存中找到對應的緩存文件的話,那麼就會從內存中讀取並且傳輸給cpu來處理。當然這樣的話需要一定的時間所以會很慢。等cpu處理之後,就很貴把這個暑假所在的數據塊保存在緩存文件中,這樣的話在以後讀取這項數據的時候就直接在緩存中進行,這樣就不要重復在內存中調用並讀取數據了。
了解了電腦緩存的作用,對於電腦緩存又分為一級、二級、三級緩存。那麼小編就對緩存來逐一介紹吧。
一級緩存都內置在CPU內部並與CPU同速運行,可以有效的提高CPU的運行效率。一級緩存越大,CPU的運行效率越高,但受到CPU內部結構的限制,一級緩存的容量都很小。
所謂二級緩存,它是為了協調一級緩存和內存之間的速度。cpu調用緩存首先是一級緩存,不夠當處理器的速度逐漸提升了,導致一級緩存就供應不了需求了,這樣就提升到二級緩存了。二級緩存它是比一級緩存的速度相對來說會慢,但是它比一級緩存的空間容量要大。主要就是做一級緩存和內存之間數據臨時交換的地方用。
三級緩存的話也是一樣的。是為讀取二級緩存後未命中的數據設計的種緩存,在擁有三級緩存的CPU中,只有約5%的數據需要從內存中調用,這大大提高了CPU的效率。
現在我們來分析下現在主流的cpu處理器的緩存作用,如果你使用的AMD型號的cpu處理器的話一般只有一二級緩存,是沒有三級緩存的。如果是intel處理器的話,通常情況是只有二三級緩存。但是intel高端的處理器的話是只有一級和三級緩存。那麼這些為大家作為了解。

❾ 什麼是二級緩存

二級緩存又叫L2 CACHE,它是處理器內部的一些緩沖存儲器,其作用跟內存一樣。 它是怎麼出現的呢? 要上溯到上個世紀80年代,由於處理器的運行速度越來越快,慢慢地,處理器需要從內存中讀取數據的速度需求就越來越高了。然而內存的速度提升速度卻很緩慢,而能高速讀寫數據的內存價格又非常高昂,不能大量採用。從性能價格比的角度出發,英特爾等處理器設計生產公司想到一個辦法,就是用少量的高速內存和大量的低速內存結合使用,共同為處理器提供數據。這樣就兼顧了性能和使用成本的最優。而那些高速的內存因為是處於CPU和內存之間的位置,又是臨時存放數據的地方,所以就叫做緩沖存儲器了,簡稱「緩存」。它的作用就像倉庫中臨時堆放貨物的地方一樣,貨物從運輸車輛上放下時臨時堆放在緩存區中,然後再搬到內部存儲區中長時間存放。貨物在這段區域中存放的時間很短,就是一個臨時貨場。最初緩存只有一級,後來處理器速度又提升了,一級緩存不夠用了,於是就添加了二級緩存。二級緩存是比一級緩存速度更慢,容量更大的內存,主要就是做一級緩存和內存之間數據臨時交換的地方用。現在,為了適應速度更快的處理器P4EE,已經出現了三級緩存了,它的容量更大,速度相對二級緩存也要慢一些,但是比內存可快多了。緩存的出現使得CPU處理器的運行效率得到了大幅度的提升,這個區域中存放的都是CPU頻繁要使用的數據,所以緩存越大處理器效率就越高,同時由於緩存的物理結構比內存復雜很多,所以其成本也很高。

大量使用二級緩存帶來的結果是處理器運行效率的提升和成本價格的大幅度不等比提升。舉個例子,伺服器上用的至強處理器和普通的P4處理器其內核基本上是一樣的,就是二級緩存不同。至強的二級緩存是2MB~16MB,P4的二級緩存是512KB,於是最便宜的至強也比最貴的P4貴,原因就在二級緩存不同。