最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring緩存注解@Cacheable @CacheEvit @CachePut使用介紹

 更新時(shí)間:2021年07月05日 10:51:29   作者:一灰灰  
Spring在3.1版本,就提供了一條基于注解的緩存策略,實(shí)際使用起來(lái)還是很絲滑的,本文將針對(duì)幾個(gè)常用的注解進(jìn)行簡(jiǎn)單的介紹說(shuō)明,有需要的小伙伴可以嘗試一下

Spring在3.1版本,就提供了一條基于注解的緩存策略,實(shí)際使用起來(lái)還是很絲滑的,本文將針對(duì)幾個(gè)常用的注解進(jìn)行簡(jiǎn)單的介紹說(shuō)明,有需要的小伙伴可以嘗試一下

本文主要知識(shí)點(diǎn):

  • @Cacheable: 緩存存在,則使用緩存;不存在,則執(zhí)行方法,并將結(jié)果塞入緩存
  • @CacheEvit: 失效緩存
  • @CachePut: 更新緩存

I. 項(xiàng)目環(huán)境

1. 項(xiàng)目依賴

本項(xiàng)目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA + redis5.0進(jìn)行開(kāi)發(fā)
開(kāi)一個(gè)web服務(wù)用于測(cè)試

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
</dependencies>

全程使用默認(rèn)配置,redis本機(jī),端口6379,無(wú)密碼

II. 緩存注解介紹

1. @Cacheable

這個(gè)注解用于修飾方法or類,當(dāng)我們?cè)L問(wèn)它修飾的方法時(shí),優(yōu)先從緩存中獲取,若緩存中存在,則直接獲取緩存的值;緩存不存在時(shí),執(zhí)行方法,并將結(jié)果寫入緩存
這個(gè)注解,有兩個(gè)比較核心的設(shè)置

 /**
  * 與 cacheNames 效果等價(jià)
  */
 @AliasFor("cacheNames")
 String[] value() default {};

 
 @AliasFor("value")
 String[] cacheNames() default {};

 /**
  * 緩存key
  */
 String key() default "";

cacheNames可以理解為緩存key的前綴,可以為組件緩存的key變量;當(dāng)key不設(shè)置時(shí),使用方法參數(shù)來(lái)初始化,注意key為SpEL表達(dá)式,因此如果要寫字符串時(shí),用單引號(hào)括起來(lái)

一個(gè)簡(jiǎn)單的使用姿勢(shì)

/**
 * 首先從緩存中查,查到之后,直接返回緩存數(shù)據(jù);否則執(zhí)行方法,并將結(jié)果緩存
 * <p>
 * redisKey: cacheNames + key 組合而成 --> 支持SpEL
 * redisValue: 返回結(jié)果
 *
 * @param name
 * @return
 */
@Cacheable(cacheNames = "say", key = "'p_'+ #name")
public String sayHello(String name) {
    return "hello+" + name + "-->" + UUID.randomUUID().toString();
}

如我們傳參為 yihuihui, 那么緩存key為 say::p_yihuihui

除了上面三個(gè)配置值之外,查看@Cacheable注解源碼的童鞋可以看到還有condition設(shè)置,這個(gè)表示當(dāng)它設(shè)置的條件達(dá)成時(shí),才寫入緩存

/**
 * 滿足condition條件的才寫入緩存
 *
 * @param age
 * @return
 */
@Cacheable(cacheNames = "condition", key = "#age", condition = "#age % 2 == 0")
public String setByCondition(int age) {
    return "condition:" + age + "-->" + UUID.randomUUID().toString();
}

上面這個(gè)case中,age為偶數(shù)的時(shí)候,才走緩存;否則不寫緩存
接下來(lái)是unless參數(shù),從名字上可以看出它表示不滿足條件時(shí)才寫入緩存

/**
 * unless, 不滿足條件才寫入緩存
 *
 * @param age
 * @return
 */
@Cacheable(cacheNames = "unless", key = "#age", unless = "#age % 2 == 0")
public String setUnless(int age) {
    return "unless:" + age + "-->" + UUID.randomUUID().toString();
}

2. @CachePut

不管緩存有沒(méi)有,都將方法的返回結(jié)果寫入緩存;適用于緩存更新

/**
 * 不管緩存有沒(méi)有,都寫入緩存
 *
 * @param age
 * @return
 */
@CachePut(cacheNames = "t4", key = "#age")
public String cachePut(int age) {
    return "t4:" + age + "-->" + UUID.randomUUID().toString();
}

3. @CacheEvict

這個(gè)就是我們理解的刪除緩存

/**
 * 失效緩存
 *
 * @param name
 * @return
 */
@CacheEvict(cacheNames = "say", key = "'p_'+ #name")
public String evict(String name) {
    return "evict+" + name + "-->" + UUID.randomUUID().toString();
}

4. @Caching

在實(shí)際的工作中,經(jīng)常會(huì)遇到一個(gè)數(shù)據(jù)變動(dòng),更新多個(gè)緩存的場(chǎng)景,對(duì)于這個(gè)場(chǎng)景,可以通過(guò)@Caching來(lái)實(shí)現(xiàn)

/**
 * caching實(shí)現(xiàn)組合,添加緩存,并失效其他的緩存
 *
 * @param age
 * @return
 */
@Caching(cacheable = @Cacheable(cacheNames = "caching", key = "#age"), evict = @CacheEvict(cacheNames = "t4", key = "#age"))
public String caching(int age) {
    return "caching: " + age + "-->" + UUID.randomUUID().toString();
}

上面這個(gè)就是組合操作

  • 從 caching::age緩存取數(shù)據(jù),不存在時(shí)執(zhí)行方法并寫入緩存;
  • 失效緩存 t4::age

5. 異常時(shí),緩存會(huì)怎樣?

上面的幾個(gè)case,都是正常的場(chǎng)景,當(dāng)方法拋出異常時(shí),這個(gè)緩存表現(xiàn)會(huì)怎樣?

/**
 * 用于測(cè)試異常時(shí),是否會(huì)寫入緩存
 *
 * @param age
 * @return
 */
@Cacheable(cacheNames = "exception", key = "#age")
@Cacheable(cacheNames = "say", key = "'p_yihuihui'")
public int exception(int age) {
    return 10 / age;
}

根據(jù)實(shí)測(cè)結(jié)果,當(dāng)age==0時(shí),上面兩個(gè)緩存都不會(huì)成功

6. 測(cè)試用例

接下來(lái)驗(yàn)證下緩存注解與上面描述的是否一致

@RestController
public class IndexRest {
    @Autowired
    private BasicDemo helloService;

    @GetMapping(path = {"", "/"})
    public String hello(String name) {
        return helloService.sayHello(name);
    }
}

上面這個(gè)主要是驗(yàn)證@Cacheable注解,若緩存不命中,每次返回的結(jié)果應(yīng)該都不一樣,然而實(shí)際訪問(wèn)時(shí),會(huì)發(fā)現(xiàn)返回的都是相同的

curl http://localhost:8080/?name=yihuihui

失效緩存

@GetMapping(path = "evict")
public String evict(String name) {
    return helloService.evict(String.valueOf(name));
}

失效緩存,需要和上面的case配合起來(lái)使用

curl http://localhost:8080/evict?name=yihuihui
curl http://localhost:8080/?name=yihuihui

剩下其他的相關(guān)測(cè)試類就比較好理解了,一并貼出對(duì)應(yīng)的代碼

@GetMapping(path = "condition")
public String t1(int age) {
    return helloService.setByCondition(age);
}

@GetMapping(path = "unless")
public String t2(int age) {
    return helloService.setUnless(age);
}

@GetMapping(path = "exception")
public String exception(int age) {
    try {
        return String.valueOf(helloService.exception(age));
    } catch (Exception e) {
        return e.getMessage();
    }
}

@GetMapping(path = "cachePut")
public String cachePut(int age) {
    return helloService.cachePut(age);
}

7. 小結(jié)

最后管理小結(jié)一下Spring提供的幾個(gè)緩存注解

  • @Cacheable: 緩存存在,則從緩存??;否則執(zhí)行方法,并將返回結(jié)果寫入緩存
  • @CacheEvit: 失效緩存
  • @CachePut: 更新緩存
  • @Caching: 都注解組合

上面雖說(shuō)可以滿足常見(jiàn)的緩存使用場(chǎng)景,但是有一個(gè)非常重要的點(diǎn)沒(méi)有說(shuō)明,緩存失效時(shí)間應(yīng)該怎么設(shè)置???
如何給每個(gè)緩存設(shè)置不同的緩存失效時(shí)間,咱么下篇博文見(jiàn),我是一灰灰,歡迎關(guān)注長(zhǎng)草的公眾號(hào)一灰灰blog

III. 不能錯(cuò)過(guò)的源碼和相關(guān)知識(shí)點(diǎn)

0. 項(xiàng)目

工程:https://github.com/liuyueyi/spring-boot-demo
源碼:https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/125-cache-ano

到此這篇關(guān)于Spring緩存注解@Cacheable @CacheEvit @CachePut使用介紹的文章就介紹到這了,更多相關(guān)Spring @Cacheable @CacheEvit @CachePut內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java concurrency之互斥鎖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java concurrency之互斥鎖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    本文通過(guò)示例代碼給大家介紹了Java concurrency之互斥鎖的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-06-06
  • Java中ThreadLocal避免內(nèi)存泄漏的方法詳解

    Java中ThreadLocal避免內(nèi)存泄漏的方法詳解

    ThreadLocal是Java中的一個(gè)線程本地存儲(chǔ)機(jī)制,它允許每個(gè)線程擁有一個(gè)獨(dú)立的本地存儲(chǔ)空間,用于存儲(chǔ)該線程的變量,本文主要介紹了ThreadLocal如何避免內(nèi)存泄漏,需要的朋友可以參考下
    2023-05-05
  • IDEA中的.iml文件和.idea文件夾使用方式

    IDEA中的.iml文件和.idea文件夾使用方式

    這篇文章主要介紹了IDEA中的.iml文件和.idea文件夾使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Spring Boot項(xiàng)目如何同時(shí)支持HTTP和HTTPS協(xié)議的實(shí)現(xiàn)

    Spring Boot項(xiàng)目如何同時(shí)支持HTTP和HTTPS協(xié)議的實(shí)現(xiàn)

    這篇文章主要介紹了Spring Boot項(xiàng)目如何同時(shí)支持HTTP和HTTPS協(xié)議的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Spring Boot RestTemplate提交表單數(shù)據(jù)的三種方法

    Spring Boot RestTemplate提交表單數(shù)據(jù)的三種方法

    本篇文章主要介紹了Spring Boot RestTemplate提交表單數(shù)據(jù)的三種方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Java數(shù)組的特性_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java數(shù)組的特性_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    數(shù)組是基本上所有語(yǔ)言都會(huì)有的一種數(shù)據(jù)類型,它表示一組相同類型的數(shù)據(jù)的集合,具有固定的長(zhǎng)度,并且在內(nèi)存中占據(jù)連續(xù)的空間。在C,C++等語(yǔ)言中,數(shù)組的定義簡(jiǎn)潔清晰,而在Java中確有一些會(huì)讓人迷惑的特性。本文就嘗試分析這些特性
    2017-04-04
  • 如何自定義springboot-starter日志組件供各個(gè)服務(wù)使用(系統(tǒng)日志優(yōu)化)

    如何自定義springboot-starter日志組件供各個(gè)服務(wù)使用(系統(tǒng)日志優(yōu)化)

    文章介紹了如何將各個(gè)微服務(wù)的接口調(diào)用日志邏輯優(yōu)化為一個(gè)可共享的Spring Boot Starter,通過(guò)自定義注解和自動(dòng)裝配機(jī)制實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • java中計(jì)算集合的交差并集示例代碼

    java中計(jì)算集合的交差并集示例代碼

    今天突然想Java如何計(jì)算集合的交差并集,主要是看Python語(yǔ)言的時(shí)候想起來(lái)的。下面這篇文章主要給大家介紹了關(guān)于java中計(jì)算集合的交差并集的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-08-08
  • idea如何關(guān)閉頁(yè)面顯示的瀏覽器圖標(biāo)

    idea如何關(guān)閉頁(yè)面顯示的瀏覽器圖標(biāo)

    這篇文章主要介紹了idea如何關(guān)閉頁(yè)面顯示的瀏覽器圖標(biāo)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java客戶端利用Jedis操作redis緩存示例代碼

    Java客戶端利用Jedis操作redis緩存示例代碼

    Jedis是Redis官方推薦的用于訪問(wèn)Java客戶端,下面這篇文章主要給大家介紹了關(guān)于Java客戶端利用Jedis操作redis緩存的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-07-07

最新評(píng)論

绿春县| 延寿县| 西乌珠穆沁旗| 江都市| 嵩明县| 河间市| 鹿邑县| 鹿邑县| 闻喜县| 田阳县| 柏乡县| 乌什县| 凤台县| 阜宁县| 丹寨县| 河间市| 东宁县| 禹州市| 顺义区| 汝州市| 怀仁县| 邯郸县| 泗洪县| 松潘县| 甘德县| 永寿县| 台东市| 苏州市| 苏尼特左旗| 格尔木市| 剑阁县| 柞水县| 克拉玛依市| 阿拉善左旗| 丰原市| 刚察县| 独山县| 时尚| 鞍山市| 喀什市| 荣成市|