真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Springcache@Cacheable的使用-創(chuàng)新互聯(lián)

@Cacheable的使用
  • 1.@Cacheable
    • 1.1 cacheNames value
    • 1.2 關(guān)聯(lián)多個(gè)緩存名
    • 1.3 key 和 keygenerator
    • 1.4 CacheManager CacheResolver
    • 1.5 sync
    • 1.6 condition
    • 1.7 unless
  • 2.@CachePut 放置緩存
  • 3.@CacheEvict 刪除緩存
  • 4.測(cè)試代碼
  • 5.默認(rèn)緩存和redis緩存
  • 6.過(guò)程中的問(wèn)題

建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡(luò)程序員、網(wǎng)頁(yè)設(shè)計(jì)師等,應(yīng)用各種網(wǎng)絡(luò)程序開(kāi)發(fā)技術(shù)和網(wǎng)頁(yè)設(shè)計(jì)技術(shù)配合操作的協(xié)同工作。創(chuàng)新互聯(lián)建站專業(yè)提供網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站制作(企業(yè)站、成都響應(yīng)式網(wǎng)站建設(shè)、電商門戶網(wǎng)站)等服務(wù),從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗(yàn)的提升,我們力求做到極致!1.@Cacheable

注解在方法上,表明方法的返回結(jié)果會(huì)緩存。相同的參數(shù)對(duì)應(yīng)相同的返回緩存。以后相同的參數(shù)進(jìn)行調(diào)用時(shí),并不會(huì)執(zhí)行方法,而是使用返回緩存中的值。

1.1 cacheNames value

@Cacheable提供兩個(gè)參數(shù)來(lái)指定緩存名
cacheNames value
調(diào)用方法時(shí),檢查緩存,如果緩存中有數(shù)據(jù),不會(huì)執(zhí)行方法。

@Cacheable("menu")
public Menu findById(String id){}
1.2 關(guān)聯(lián)多個(gè)緩存名

可以關(guān)聯(lián)多個(gè)緩存名,執(zhí)行方法時(shí),關(guān)聯(lián)的緩存都會(huì)檢查,只要其中一個(gè)緩存命中,這個(gè)緩存的值就會(huì)返回。

@Cacheable({"menu","menu2"})
public Menu findById(String id){}
1.3 key 和 keygenerator

一個(gè)緩存名對(duì)應(yīng)一個(gè)注解方法,但是一個(gè)方法傳入不同的參數(shù),結(jié)果不通,區(qū)分用到key。
key可以顯示指定,也可以通過(guò)keygenerator生成

不指定key則會(huì)采用keyGenerator進(jìn)行自動(dòng)生成

官方推薦顯式的指定key,可以通過(guò)springEL表達(dá)式來(lái)解決不同入?yún)⒌膯?wèn)題

@Cacheable(value={"menu"},key="#id")
public Menu findById(String id){}

@Cacheable(value={"menu"},key="'id-'+#menu.id")
public Menu findById(Menu menu){}

key和keyGenerator是互斥的,同時(shí)指定兩個(gè)會(huì)導(dǎo)致異常

1.4 CacheManager CacheResolver

CacheManager 緩存管理器用來(lái)管理一級(jí)緩存。緩存管理器與緩存組件類型相關(guān)聯(lián)的。
srping緩存抽象的目的是為使用不同的緩存組件類型提供提供統(tǒng)一的訪問(wèn)接口,以向開(kāi)發(fā)者屏蔽各種緩存組件的差異。
CacheResolver 緩存解析器是用來(lái)管理緩存管理器的,CacheResolver保持CacheManager的引用,并用他來(lái)檢索緩存。類似于keyGenerator和key

一般情況下,系統(tǒng)只會(huì)使用一種緩存,不需要顯式的指定CacheManager和CacheResolver。同時(shí)配置多中緩存,需要指定,使用的是@cacheable中的參數(shù)

1.5 sync

是否同步,多線程環(huán)境下相同參數(shù)的訪問(wèn)是否進(jìn)行對(duì)入口加鎖,即只有一個(gè)線程計(jì)算操作的結(jié)果值,避免了n-1次數(shù)據(jù)庫(kù)訪問(wèn)
sync=true 可以有效避免緩存擊穿的問(wèn)題

1.6 condition

調(diào)用前判斷,緩存的條件。接受springEL表達(dá)式,為true進(jìn)行緩存,否則直接調(diào)用

1.7 unless

springEL表達(dá)式,為ture不緩存,為false緩存

2.@CachePut 放置緩存

@CachePut和@Cacheable屬性相同
@CachePut是執(zhí)行方法體緩存結(jié)果
@Cacheable是查找緩存,有就返回,沒(méi)有執(zhí)行方法體,緩存結(jié)果

3.@CacheEvict 刪除緩存
  • beforeInvocation 是否在方法執(zhí)行前清除緩存 默認(rèn)false
    true的時(shí)候,先刪除緩存,刪除數(shù)據(jù)失敗,查詢會(huì)直達(dá)數(shù)據(jù)庫(kù),造成壓力;
    false,先刪除數(shù)據(jù)庫(kù),刪除緩存失敗,會(huì)造成臟緩存。多線程,執(zhí)行緩存刪除,方法執(zhí)行慢,此時(shí)其他線程獲得了臟緩存
  • allEntries 是否刪除整個(gè)緩存(value和cacheNames指定的)
4.測(cè)試代碼

依賴

org.springframework.bootspring-boot-starter-data-redis

配置

spring.redis.host=127.0.0.1
spring.redis.password=123456
spring.redis.port=6379

啟動(dòng)類注解

@SpringBootApplication
@EnableCaching
public class RedisTestApplication {public static void main(String[] args) {SpringApplication.run(RedisTestApplication.class, args);
    }

}

請(qǐng)求入口

@RestController
public class CacheTestController {@Autowired
    private CacheTest cacheTest;

    @RequestMapping("putCache")
    public String testCachePut(){cacheTest.testCachePut();
        return "放置緩存成功";
    }

    @RequestMapping("testCacheable")
    public String testCacheable(){cacheTest.testCacheable();
        return "獲取緩存";
    }

    @RequestMapping("deleteCache")
    public String testCacheEvict(){cacheTest.testCacheEvict();
        return  "刪除緩存";
    }
}	

緩存

@Component
public class CacheTest {@Autowired
    CacheManager cacheManager;



    @CachePut(value = "test1",key = "'testCache1'")
    public Integer testCachePut(){System.out.println("放置緩存");
        return 1;
    }

    @Cacheable(value = "test1",key = "'testCache1'")
    public Integer testCacheable(){System.out.println("緩存測(cè)試");
        return 1;
    }

    @CacheEvict(value = "test1",key = "'testCache1'")
    public void testCacheEvict(){System.out.println("刪除緩存");
        return ;
    }

    public void getCache(){//        System.out.println(redisCacheManager.getCache("test1"));
        System.out.println(cacheManager.getCache("test1"));
    }
}

在這里插入圖片描述

在進(jìn)行請(qǐng)求后會(huì)發(fā)現(xiàn)redis中多了對(duì)應(yīng)key的數(shù)據(jù)

在這里插入圖片描述

在刪除緩存后進(jìn)行獲取緩存測(cè)試,會(huì)發(fā)現(xiàn),在沒(méi)有緩存的時(shí)候會(huì)執(zhí)行一次方法,之后多次調(diào)用就不會(huì)調(diào)用方法,而是獲取緩存。

在這里插入圖片描述

刪除緩存后刷新redis,已經(jīng)找不到對(duì)應(yīng)key的數(shù)據(jù)了

5.默認(rèn)緩存和redis緩存

不引入redis依賴 使用的是spring的緩存
CacheManager在沒(méi)有redis依賴時(shí),getCache走的ConcurrentMapCacheManager類中的
拿到的cache對(duì)象為org.springframework.cache.concurrent.ConcurrentMapCache@8347d73
有redis依賴getCache走的是AbstractCacheManager類中的
拿到的cache對(duì)象為org.springframework.data.redis.cache.RedisCache@11e1d8da

默認(rèn)緩存的生命周期和項(xiàng)目周期是一致的。
redis緩存的生命周期是和redis中的數(shù)據(jù)的生命周期是一致的。
項(xiàng)目發(fā)版(重啟)默認(rèn)緩存會(huì)丟失,但是redis緩存,只要redis數(shù)據(jù)沒(méi)清除,就不需要重新獲取緩存。
為什么要用redis做緩存?
1.redis可以用幾十G的內(nèi)存來(lái)做緩存
2.redis緩存可以持久化
3.redis是分布式緩存,默認(rèn)緩存的生命周期隨著jvm的銷毀而結(jié)束,屬于本地緩存,不具有一致性。
4.redis可以處理百萬(wàn)并發(fā),專業(yè)的緩存服務(wù)
5.redis緩存有過(guò)期機(jī)制
6.redis有豐富的API

6.過(guò)程中的問(wèn)題
  • 1.起初一直沒(méi)有在redis中找到對(duì)應(yīng)key的緩存
    發(fā)現(xiàn)引入依賴spring-boot-starter-data-redis解決,將相應(yīng)的redis相關(guān)bean掃入spring容器
  • 2.在公司測(cè)試好使,回家復(fù)現(xiàn)發(fā)現(xiàn)緩存不生效,@Cacheable不生效
    在啟動(dòng)類中加入 @EnableCaching解決,并不是網(wǎng)上的那些引入什么aop依賴,通過(guò)@EnableCaching注解中的@import注解注入代理的相關(guān)類。奇怪的是公司項(xiàng)目的啟動(dòng)類中并沒(méi)有。初步懷疑是spring版本的問(wèn)題,等知道了回來(lái)補(bǔ)上答案

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


網(wǎng)站名稱:Springcache@Cacheable的使用-創(chuàng)新互聯(lián)
當(dāng)前地址:http://weahome.cn/article/djigjj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部