一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

使用Spring Cache實(shí)現(xiàn)緩存

jf_ro2CN3Fa ? 來源:勇哥java實(shí)戰(zhàn)分享 ? 2023-05-11 17:40 ? 次閱讀

1 硬編碼

在學(xué)習(xí)Spring Cache之前,筆者經(jīng)常會硬編碼的方式使用緩存。

舉個例子,為了提升用戶信息的查詢效率,我們對用戶信息使用了緩存,示例代碼如下:

@Autowire
privateUserMapperuserMapper;
@Autowire
privateStringCommandstringCommand;
//查詢用戶
publicUsergetUserById(LonguserId){
StringcacheKey="userId_"+userId;
Useruser=stringCommand.get(cacheKey);
if(user!=null){
returnuser;
}
user=userMapper.getUserById(userId);
if(user!=null){
stringCommand.set(cacheKey,user);
returnuser;
}
//修改用戶
publicvoidupdateUser(Useruser){
userMapper.updateUser(user);
StringcacheKey="userId_"+userId.getId();
stringCommand.set(cacheKey,user);
}
//刪除用戶
publicvoiddeleteUserById(LonguserId){
userMapper.deleteUserById(userId);
StringcacheKey="userId_"+userId.getId();
stringCommand.del(cacheKey);
}
}

相信很多同學(xué)都寫過類似風(fēng)格的代碼,這種風(fēng)格符合面向過程的編程思維,非常容易理解。但它也有一些缺點(diǎn):

代碼不夠優(yōu)雅。業(yè)務(wù)邏輯有四個典型動作:存儲,讀取,修改,刪除。每次操作都需要定義緩存Key ,調(diào)用緩存命令的API,產(chǎn)生較多的重復(fù)代碼;

緩存操作和業(yè)務(wù)邏輯之間的代碼耦合度高,對業(yè)務(wù)邏輯有較強(qiáng)的侵入性。

侵入性主要體現(xiàn)如下兩點(diǎn):

開發(fā)聯(lián)調(diào)階段,需要去掉緩存,只能注釋或者臨時(shí)刪除緩存操作代碼,也容易出錯;

某些場景下,需要更換緩存組件,每個緩存組件有自己的API,更換成本頗高。

2 緩存抽象

首先需要明確一點(diǎn):Spring Cache不是一個具體的緩存實(shí)現(xiàn)方案,而是一個對緩存使用的抽象(Cache Abstraction )。

dc106b70-ed7d-11ed-90ce-dac502259ad0.png

2.1 Spring AOP

Spring AOP是基于代理模式(proxy-based )。

通常情況下,定義一個對象,調(diào)用它的方法的時(shí)候,方法是直接被調(diào)用的。

Pojopojo=newSimplePojo();
pojo.foo();
dc177a50-ed7d-11ed-90ce-dac502259ad0.png

將代碼做一些調(diào)整,pojo對象的引用修改成代理類。

ProxyFactoryfactory=newProxyFactory(newSimplePojo());
factory.addInterface(Pojo.class);
factory.addAdvice(newRetryAdvice());

Pojopojo=(Pojo)factory.getProxy();
//thisisamethodcallontheproxy!
pojo.foo();
dc1e6d92-ed7d-11ed-90ce-dac502259ad0.png

調(diào)用pojo的foo方法的時(shí)候,實(shí)際上是動態(tài)生成的代理類調(diào)用foo方法。

代理類在方法調(diào)用前可以獲取方法的參數(shù),當(dāng)調(diào)用方法結(jié)束后,可以獲取調(diào)用該方法的返回值,通過這種方式就可以實(shí)現(xiàn)緩存的邏輯。

2.2 緩存聲明

緩存聲明,也就是標(biāo)識需要緩存的方法以及緩存策略 。

Spring Cache 提供了五個注解。

@Cacheable:根據(jù)方法的請求參數(shù)對其結(jié)果進(jìn)行緩存,下次同樣的參數(shù)來執(zhí)行該方法時(shí)可以直接從緩存中獲取結(jié)果,而不需要再次執(zhí)行該方法;

@CachePut:根據(jù)方法的請求參數(shù)對其結(jié)果進(jìn)行緩存,它每次都會觸發(fā)真實(shí)方法的調(diào)用;

@CacheEvict:根據(jù)一定的條件刪除緩存;

@Caching:組合多個緩存注解;

@CacheConfig:類級別共享緩存相關(guān)的公共配置。

我們重點(diǎn)講解:@Cacheable,@CachePut,@CacheEvict三個核心注解。

2.2.1 @Cacheable注解

@Cacheble注解表示這個方法有了緩存的功能。

@Cacheable(value="user_cache",key="#userId",unless="#result==null")
publicUsergetUserById(LonguserId){
Useruser=userMapper.getUserById(userId);
returnuser;
}

上面的代碼片段里,getUserById方法和緩存user_cache 關(guān)聯(lián)起來,若方法返回的User對象不為空,則緩存起來。第二次相同參數(shù)userId調(diào)用該方法的時(shí)候,直接從緩存中獲取數(shù)據(jù),并返回。

▍ 緩存key的生成

我們都知道,緩存的本質(zhì)是key-value存儲模式,每一次方法的調(diào)用都需要生成相應(yīng)的Key, 才能操作緩存。

通常情況下,@Cacheable有一個屬性key可以直接定義緩存key,開發(fā)者可以使用SpEL語言定義key值。

若沒有指定屬性key,緩存抽象提供了 KeyGenerator來生成key ,默認(rèn)的生成器代碼見下圖:

dc258456-ed7d-11ed-90ce-dac502259ad0.png

它的算法也很容易理解:

如果沒有參數(shù),則直接返回SimpleKey.EMPTY

如果只有一個參數(shù),則直接返回該參數(shù);

若有多個參數(shù),則返回包含多個參數(shù)的SimpleKey 對象。

當(dāng)然Spring Cache也考慮到需要自定義Key生成方式,需要我們實(shí)現(xiàn)org.springframework.cache.interceptor.KeyGenerator 接口。

Objectgenerate(Objecttarget,Methodmethod,Object...params);

然后指定@Cacheable的keyGenerator屬性。

@Cacheable(value="user_cache",keyGenerator="myKeyGenerator",unless="#result==null")
publicUsergetUserById(LonguserId)

▍ 緩存條件

有的時(shí)候,方法執(zhí)行的結(jié)果是否需要緩存,依賴于方法的參數(shù)或者方法執(zhí)行后的返回值。

注解里可以通過condition屬性,通過Spel表達(dá)式返回的結(jié)果是true 還是false 判斷是否需要緩存。

@Cacheable(cacheNames="book",condition="#name.length()

上面的代碼片段里,當(dāng)參數(shù)的長度小于32,方法執(zhí)行的結(jié)果才會緩存。

除了condition,unless屬性也可以決定結(jié)果是否緩存,不過是在執(zhí)行方法后。

@Cacheable(value="user_cache",key="#userId",unless="#result==null")
publicUsergetUserById(LonguserId){

上面的代碼片段里,當(dāng)返回的結(jié)果為null則不緩存。

2.2.2 @CachePut注解

@CachePut注解作用于緩存需要被更新的場景,和 @Cacheable 非常相似,但被注解的方法每次都會被執(zhí)行。

返回值是否會放入緩存,依賴于condition和unless,默認(rèn)情況下結(jié)果會存儲到緩存。

@CachePut(value="user_cache",key="#user.id",unless="#result!=null")
publicUserupdateUser(Useruser){
userMapper.updateUser(user);
returnuser;
}

當(dāng)調(diào)用updateUser方法時(shí),每次方法都會被執(zhí)行,但是因?yàn)閡nless屬性每次都是true,所以并沒有將結(jié)果緩存。當(dāng)去掉unless屬性,則結(jié)果會被緩存。

2.2.3 @CacheEvict注解

@CacheEvict 注解的方法在調(diào)用時(shí)會從緩存中移除已存儲的數(shù)據(jù)。

@CacheEvict(value="user_cache",key="#id")
publicvoiddeleteUserById(Longid){
userMapper.deleteUserById(id);
}

當(dāng)調(diào)用deleteUserById方法完成后,緩存key等于參數(shù)id的緩存會被刪除,而且方法的返回的類型是Void ,這和@Cacheable明顯不同。

2.3 緩存配置

Spring Cache是一個對緩存使用的抽象,它提供了多種存儲集成。

dc2c4d22-ed7d-11ed-90ce-dac502259ad0.png

要使用它們,需要簡單地聲明一個適當(dāng)?shù)腃acheManager - 一個控制和管理Cache的實(shí)體。

我們以Spring Cache默認(rèn)的緩存實(shí)現(xiàn)Simple 例子,簡單探索下CacheManager的機(jī)制。

CacheManager非常簡單:

publicinterfaceCacheManager{
@Nullable
CachegetCache(Stringname);

CollectiongetCacheNames();
}

在CacheConfigurations配置類中,可以看到不同集成類型有不同的緩存配置類。

dc33c98a-ed7d-11ed-90ce-dac502259ad0.png

通過SpringBoot的自動裝配機(jī)制,創(chuàng)建CacheManager的實(shí)現(xiàn)類ConcurrentMapCacheManager。

dc3d0112-ed7d-11ed-90ce-dac502259ad0.png

而ConcurrentMapCacheManager的getCache方法,會創(chuàng)建ConcurrentCacheMap。

dc486b24-ed7d-11ed-90ce-dac502259ad0.png

ConcurrentCacheMap實(shí)現(xiàn)了org.springframework.cache.Cache接口。

dc4dc2e0-ed7d-11ed-90ce-dac502259ad0.png

從Spring Cache的Simple 的實(shí)現(xiàn),緩存配置需要實(shí)現(xiàn)兩個接口:

org.springframework.cache.CacheManager

org.springframework.cache.Cache

3 入門例子

首先我們先創(chuàng)建一個工程spring-cache-demo。

dc5a371e-ed7d-11ed-90ce-dac502259ad0.png

caffeine和Redisson分別是本地內(nèi)存和分布式緩存Redis框架中的佼佼者,我們分別演示如何集成它們。

3.1 集成caffeine

3.1.1 maven依賴


org.springframework.boot
spring-boot-starter-cache


com.github.ben-manes.caffeine
caffeine
2.7.0

3.1.2 Caffeine緩存配置

我們先創(chuàng)建一個緩存配置類MyCacheConfig。

@Configuration
@EnableCaching
publicclassMyCacheConfig{
@Bean
publicCaffeinecaffeineConfig(){
return
Caffeine.newBuilder()
.maximumSize(10000).
expireAfterWrite(60,TimeUnit.MINUTES);
}
@Bean
publicCacheManagercacheManager(Caffeinecaffeine){
CaffeineCacheManagercaffeineCacheManager=newCaffeineCacheManager();
caffeineCacheManager.setCaffeine(caffeine);
returncaffeineCacheManager;
}
}

首先創(chuàng)建了一個Caffeine對象,該對象標(biāo)識本地緩存的最大數(shù)量是10000條,每個緩存數(shù)據(jù)在寫入60分鐘后失效。

另外,MyCacheConfig類上我們添加了注解:**@EnableCaching** 。

3.1.3 業(yè)務(wù)代碼

根據(jù)緩存聲明 這一節(jié),我們很容易寫出如下代碼。

@Cacheable(value="user_cache",unless="#result==null")
publicUsergetUserById(Longid){
returnuserMapper.getUserById(id);
}
@CachePut(value="user_cache",key="#user.id",unless="#result==null")
publicUserupdateUser(Useruser){
userMapper.updateUser(user);
returnuser;
}
@CacheEvict(value="user_cache",key="#id")
publicvoiddeleteUserById(Longid){
userMapper.deleteUserById(id);
}

這段代碼與硬編碼里的代碼片段明顯精簡很多。

當(dāng)我們在Controller層調(diào)用 getUserById方法時(shí),調(diào)試的時(shí)候,配置mybatis日志級別為DEBUG,方便監(jiān)控方法是否會緩存。

第一次調(diào)用會查詢數(shù)據(jù)庫,打印相關(guān)日志:

Preparing:select*FROMusertwheret.id=?
Parameters:1(Long)
Total:1

第二次調(diào)用查詢方法的時(shí)候,數(shù)據(jù)庫SQL日志就沒有出現(xiàn)了, 也就說明緩存生效了。

3.2 集成Redisson

3.2.1 maven依賴


org.Redisson
Redisson
3.12.0

3.2.2 Redisson緩存配置

@Bean(destroyMethod="shutdown")
publicRedissonClientRedisson(){
Configconfig=newConfig();
config.useSingleServer()
.setAddress("redis://127.0.0.1:6201").setPassword("ts112GpO_ay");
returnRedisson.create(config);
}
@Bean
CacheManagercacheManager(RedissonClientRedissonClient){
Mapconfig=newHashMap();
//create"user_cache"springcachewithttl=24minutesandmaxIdleTime=12minutes
config.put("user_cache",
newCacheConfig(
24*60*1000,
12*60*1000));
returnnewRedissonSpringCacheManager(RedissonClient,config);
}

可以看到,從Caffeine切換到Redisson,只需要修改緩存配置類,定義CacheManager 對象即可。而業(yè)務(wù)代碼并不需要改動。

Controller層調(diào)用 getUserById方法,用戶ID為1的時(shí)候,可以從Redis Desktop Manager里看到:用戶信息已被緩存,user_cache緩存存儲是Hash數(shù)據(jù)結(jié)構(gòu)。

dc6323f6-ed7d-11ed-90ce-dac502259ad0.png

因?yàn)镽edisson默認(rèn)的編解碼是FstCodec , 可以看到key的名稱是:xF6x01。

在緩存配置代碼里,可以修改編解碼器。

publicRedissonClientRedisson(){
Configconfig=newConfig();
config.useSingleServer()
.setAddress("redis://127.0.0.1:6201").setPassword("ts112GpO_ay");
config.setCodec(newJsonJacksonCodec());
returnRedisson.create(config);
}

再次調(diào)用 getUserById方法 ,控制臺就變成:

dc6cc2da-ed7d-11ed-90ce-dac502259ad0.png

可以觀察到:緩存key已經(jīng)變成了:["java.lang.Long",1],改變序列化后key和value已發(fā)生了變化。

3.3 從列表緩存再次理解緩存抽象

列表緩存在業(yè)務(wù)中經(jīng)常會遇到。通常有兩種實(shí)現(xiàn)形式:

整體列表緩存;

按照每個條目緩存,通過redis,memcached的聚合查詢方法批量獲取列表,若緩存沒有命中,則從數(shù)據(jù)庫重新加載,并放入緩存里。

那么Spring cache整合Redisson如何緩存列表數(shù)據(jù)呢?

@Cacheable(value="user_cache")
publicListgetUserList(ListidList){
returnuserMapper.getUserByIds(idList);
}

執(zhí)行g(shù)etUserList方法,參數(shù)id列表為:[1,3] 。

wKgZomRcuNWAQQl8AADE0jZKrtw956.jpg

執(zhí)行完成之后,控制臺里可以看到:列表整體直接被緩存起來,用戶列表緩存和用戶條目緩存并沒有共享 ,他們是平行的關(guān)系。

這種情況下,緩存的顆粒度控制也沒有那么細(xì)致。

類似這樣的思考,很多開發(fā)者也向Spring Framework研發(fā)團(tuán)隊(duì)提過。

dc7966a2-ed7d-11ed-90ce-dac502259ad0.png

官方的回答也很明確:對于緩存抽象來講,它并不關(guān)心方法返回的數(shù)據(jù)類型,假如是集合,那么也就意味著需要把集合數(shù)據(jù)在緩存中保存起來。

還有一位開發(fā)者,定義了一個@CollectionCacheable 注解,并做出了原型,擴(kuò)展了Spring Cache的列表緩存功能。

@Cacheable("myCache")
publicStringfindById(Stringid){
//accessDBbackendreturnitem
}
@CollectionCacheable("myCache")
publicMapfindByIds(Collectionids){
//accessDBbackend,returnmapofidtoitem
}

官方也未采納,因?yàn)?strong>緩存抽象并不想引入太多的復(fù)雜性 。

寫到這里,相信大家對緩存抽象有了更進(jìn)一步的理解。當(dāng)我們想實(shí)現(xiàn)更復(fù)雜的緩存功能時(shí),需要對Spring Cache做一定程度的擴(kuò)展。

4 自定義二級緩存

4.1 應(yīng)用場景

筆者曾經(jīng)在原來的項(xiàng)目,高并發(fā)場景下多次使用多級緩存。多級緩存是一個非常有趣的功能點(diǎn),值得我們?nèi)U(kuò)展。

多級緩存有如下優(yōu)勢:

離用戶越近,速度越快;

減少分布式緩存查詢頻率,降低序列化和反序列化的CPU消耗;

大幅度減少網(wǎng)絡(luò)IO以及帶寬消耗。

進(jìn)程內(nèi)緩存做為一級緩存,分布式緩存做為二級緩存,首先從一級緩存中查詢,若能查詢到數(shù)據(jù)則直接返回,否則從二級緩存中查詢,若二級緩存中可以查詢到數(shù)據(jù),則回填到一級緩存中,并返回?cái)?shù)據(jù)。若二級緩存也查詢不到,則從數(shù)據(jù)源中查詢,將結(jié)果分別回填到一級緩存,二級緩存中。

dc91f6ae-ed7d-11ed-90ce-dac502259ad0.png

來自《鳳凰架構(gòu)》緩存篇

Spring Cache并沒有二級緩存的實(shí)現(xiàn),我們可以實(shí)現(xiàn)一個簡易的二級緩存DEMO,加深對技術(shù)的理解。

4.2 設(shè)計(jì)思路

MultiLevelCacheManager :多級緩存管理器;

MultiLevelChannel :封裝Caffeine和RedissonClient;

MultiLevelCache :實(shí)現(xiàn)org.springframework.cache.Cache接口;

MultiLevelCacheConfig :配置緩存過期時(shí)間等;

MultiLevelCacheManager是最核心的類,需要實(shí)現(xiàn)getCachegetCacheNames 兩個接口。

dc9b76de-ed7d-11ed-90ce-dac502259ad0.png

創(chuàng)建多級緩存,第一級緩存是:Caffeine , 第二級緩存是:Redisson。

dca99c3c-ed7d-11ed-90ce-dac502259ad0.png

二級緩存,為了快速完成DEMO,我們使用Redisson對Spring Cache的擴(kuò)展類RedissonCache 。它的底層是RMap ,底層存儲是Hash。

dcc2aba0-ed7d-11ed-90ce-dac502259ad0.png

我們重點(diǎn)看下緩存的「查詢」和「存儲」的方法:

@Override
publicValueWrapperget(Objectkey){
Objectresult=getRawResult(key);
returntoValueWrapper(result);
}

publicObjectgetRawResult(Objectkey){
logger.info("從一級緩存查詢key:"+key);
Objectresult=localCache.getIfPresent(key);
if(result!=null){
returnresult;
}
logger.info("從二級緩存查詢key:"+key);
result=RedissonCache.getNativeCache().get(key);
if(result!=null){
localCache.put(key,result);
}
returnresult;
}

查詢 」數(shù)據(jù)的流程:

先從本地緩存中查詢數(shù)據(jù),若能查詢到,直接返回;

本地緩存查詢不到數(shù)據(jù),查詢分布式緩存,若可以查詢出來,回填到本地緩存,并返回;

若分布式緩存查詢不到數(shù)據(jù),則默認(rèn)會執(zhí)行被注解的方法。

下面來看下「存儲 」的代碼:

publicvoidput(Objectkey,Objectvalue){
logger.info("寫入一級緩存key:"+key);
localCache.put(key,value);
logger.info("寫入二級緩存key:"+key);
RedissonCache.put(key,value);
}

最后配置緩存管理器,原有的業(yè)務(wù)代碼不變。

dcd7f21c-ed7d-11ed-90ce-dac502259ad0.png

執(zhí)行下getUserById方法,查詢用戶編號為1的用戶信息。

-從一級緩存查詢key:1
-從二級緩存查詢key:1
-==>Preparing:select*FROMusertwheret.id=?
-==>Parameters:1(Long)
-<==?Total:?1
-?寫入一級緩存?key:1
-?寫入二級緩存?key:1

第二次執(zhí)行相同的動作,從日志可用看到從優(yōu)先會從本地內(nèi)存中查詢出結(jié)果。

-從一級緩存查詢key:1

等待30s , 再執(zhí)行一次,因?yàn)楸镜鼐彺鏁?,所以?zhí)行的時(shí)候會查詢二級緩存

-從一級緩存查詢key:1
-從二級緩存查詢key:1

一個簡易的二級緩存就組裝完了。

5 什么場景選擇Spring Cache

在做技術(shù)選型的時(shí)候,需要針對場景選擇不同的技術(shù)。

筆者認(rèn)為Spring Cache的功能很強(qiáng)大,設(shè)計(jì)也非常優(yōu)雅。特別適合緩存控制沒有那么細(xì)致的場景。比如門戶首頁,偏靜態(tài)展示頁面,榜單等等。這些場景的特點(diǎn)是對數(shù)據(jù)實(shí)時(shí)性沒有那么嚴(yán)格的要求,只需要將數(shù)據(jù)源緩存下來,過期之后自動刷新即可。這些場景下,Spring Cache就是神器,能大幅度提升研發(fā)效率。

但在高并發(fā)大數(shù)據(jù)量的場景下,精細(xì)的緩存顆粒度的控制上,還是需要做功能擴(kuò)展。





審核編輯:劉清

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

    關(guān)注

    1

    文章

    780

    瀏覽量

    44726
  • AOP
    AOP
    +關(guān)注

    關(guān)注

    0

    文章

    40

    瀏覽量

    11182
  • cache技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    41

    瀏覽量

    1170
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    382

    瀏覽量

    11250

原文標(biāo)題:使用 Spring Cache 實(shí)現(xiàn)緩存,這種方式才叫優(yōu)雅!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

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

    CPU Cache是如何保證緩存一致性的?

    我們介紹`CPU Cache`的組織架構(gòu)及其進(jìn)行**讀操作**時(shí)的尋址方式,但是緩存不僅僅只有讀操作,還有 **寫操作** ,這會帶來一個新的問題
    的頭像 發(fā)表于 12-04 15:05 ?1943次閱讀
    CPU <b class='flag-5'>Cache</b>是如何保證<b class='flag-5'>緩存</b>一致性的?

    阿里巴巴開源的通用緩存訪問框架JetCache介紹

    摘要: JetCache是由阿里巴巴開源的通用緩存訪問框架,如果你對Spring Cache很熟悉的話,請一定花一點(diǎn)時(shí)間了解一下JetCache,它更好用。JetCache可以做類似Sprin
    發(fā)表于 04-24 16:09

    高速緩存(cache)的工作原理是什么?高速緩存可分為哪幾類

    存儲器系統(tǒng)的層次架構(gòu)是如何構(gòu)成的?高速緩存(cache)的工作原理是什么?高速緩存可分為哪幾類?
    發(fā)表于 12-23 06:18

    高速緩存Cache介紹

    被訪問,那么將來它附近的位置也會被訪問。比如順序執(zhí)行代碼,或者使用一個數(shù)據(jù)結(jié)構(gòu)? 時(shí)間局部性:被訪問過一次的存儲器位置,接下來會被多次引用。比如:循環(huán)? 緩存行(cache line)? 邏輯上的一組
    發(fā)表于 09-07 08:22

    什么是緩存Cache

    什么是緩存Cache 即高速緩沖存儲器,是位于CPU與主內(nèi)存間的一種容量較小但速度很高的存儲器。由于CPU的速度遠(yuǎn)高于主內(nèi)存,CPU直接
    發(fā)表于 01-23 10:57 ?947次閱讀

    什么是Instructions Cache/IMM/ID

    什么是Instructions Cache/IMM/ID  Instructions Cache: (指令緩存)由于系統(tǒng)主內(nèi)存的速度較慢,當(dāng)CPU讀取指令的時(shí)候,會導(dǎo)致CPU停下來
    發(fā)表于 02-04 11:51 ?659次閱讀

    什么是Cache

    什么是Cache  英文縮寫: Cache 中文譯名: 高速緩存器 分  類: IP與多媒體 解  釋: 信息在本地的臨時(shí)存儲
    發(fā)表于 02-22 17:26 ?1064次閱讀

    高速緩存(Cache),高速緩存(Cache)原理是什么?

    高速緩存(Cache),高速緩存(Cache)原理是什么? 高速緩存Cache是位于CPU和主
    發(fā)表于 03-26 10:49 ?6969次閱讀

    一級緩存、二級緩存、三級緩存區(qū)別是什么 詳解它們的區(qū)分方法

    一級緩存(Level?1?Cache)簡稱L1?Cache,位于CPU內(nèi)核的旁邊,是與CPU結(jié)合最為緊密的CPU緩存,也是歷史上最早出現(xiàn)的CPU緩存
    發(fā)表于 08-14 09:27 ?8.1w次閱讀

    你知道linux的cache memory?

    當(dāng)你讀寫文件的時(shí)候,Linux內(nèi)核為了提高讀寫性能與速度,會將文件在內(nèi)存中進(jìn)行緩存,這部分內(nèi)存就是Cache Memory(緩存內(nèi)存)。即使你的程序運(yùn)行結(jié)束后,Cache Memory
    發(fā)表于 04-26 15:49 ?1313次閱讀

    Linux內(nèi)核Page Cache和Buffer Cache兩類緩存的作用及關(guān)系如何

    page)即為頁緩存(page cache)。塊緩存(buffer cache),則是內(nèi)核為了加速對底層存儲介質(zhì)的訪問速度,而構(gòu)建的一層緩存
    的頭像 發(fā)表于 07-02 14:25 ?2959次閱讀
    Linux內(nèi)核Page <b class='flag-5'>Cache</b>和Buffer <b class='flag-5'>Cache</b>兩類<b class='flag-5'>緩存</b>的作用及關(guān)系如何

    關(guān)于Cache的其它內(nèi)容

    關(guān)于Cache的其它內(nèi)容 上面我們所描述情況,在訪問cache前,已經(jīng)將虛擬地址轉(zhuǎn)換成了物理地址,其實(shí),不一定,也可是是虛擬地址直接訪問cache,倒底是使用物理地址還是虛擬地址,這就是翻譯方式
    的頭像 發(fā)表于 11-21 11:12 ?2519次閱讀

    Spring Cache緩存常規(guī)配置

    作者最近在開發(fā)公司項(xiàng)目時(shí)使用到 Redis 緩存,并在翻看前人代碼時(shí),看到了一種關(guān)于 @Cacheable 注解的自定義緩存有效期的解決方案,感覺比較實(shí)用,因此作者自己拓展完善了一番后分享給各位。
    的頭像 發(fā)表于 11-28 10:44 ?779次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Cache</b><b class='flag-5'>緩存</b>常規(guī)配置

    什么是緩存(Cache)及其作用

    緩存Cache)是一種高速存儲器,用于臨時(shí)存儲數(shù)據(jù),以便快速訪問。在計(jì)算機(jī)系統(tǒng)中,緩存的作用是減少處理器訪問主存儲器(如隨機(jī)存取存儲器RAM)所需的時(shí)間。 緩存
    的頭像 發(fā)表于 12-18 09:28 ?5808次閱讀

    MCU緩存設(shè)計(jì)

    MCU 設(shè)計(jì)通過優(yōu)化指令與數(shù)據(jù)的訪問效率,顯著提升系統(tǒng)性能并降低功耗,其核心架構(gòu)與實(shí)現(xiàn)策略如下: 一、緩存類型與結(jié)構(gòu) 指令緩存(I-Cache)與數(shù)據(jù)
    的頭像 發(fā)表于 05-07 15:29 ?66次閱讀