一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringBoot 緩存 Caffeine使用解析

SpringBoot 緩存 Caffeine使用解析

2022-01-07 12:56西涼的悲傷 Java教程

這篇文章主要介紹了SpringBoot 緩存 Caffeine使用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Redis和Caffeine的區別

相同點

  • 兩個都是緩存的方式

不同點

  • redis是分布式緩存,通過網絡將數據存儲到redis服務器內存里
  • caffeine是將數據存儲在本地應用里
  • caffeine和redis相比,沒有了網絡IO上的消耗

聯系

  • 一般將兩者結合起來,形成一二級緩存。
  • 使用流程大致如下:
  • 先去一級緩存中查找數據(caffeine-本地應用內),
  • 如果沒有的話,去二級緩存中查找數據(redis-內存),
  • 再沒有,再去數據庫中查找數據(數據庫-磁盤)

Spring Boot 緩存 Caffeine使用

1.需要添加的依賴

?
1
2
3
4
5
6
7
8
9
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>2.8.6</version>
</dependency>

2.配置

在SpringBoot中配置Caffeine,控制緩存行為(例如過期時間,緩存大小限制等)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
@Configuration
@EnableCaching //開啟緩存
public class CaffeinConfig {
    @Bean
    //配置Caffeine緩存行為(例如到期,緩存大小限制等)
    public Caffeine caffeineConfig() {
        Caffeine caffeine = Caffeine.newBuilder()
                .expireAfterWrite(60, TimeUnit.MINUTES)
                .maximumSize(1000);
        return caffeine;
    }
    @Bean
    public CacheManager cacheManager(Caffeine caffeine) {
        CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
        caffeineCacheManager.setCaffeine(caffeine);
        return caffeineCacheManager;
    }
}

Caffeine配置說明:

initialCapacity=[integer]:初始的緩存空間大小

maximumSize=[long]:緩存的最大條數

maximumWeight=[long]:緩存的最大權重

expireAfterAccess=[duration]:最后一次寫入或訪問后經過固定時間過期

expireAfterWrite=[duration]:最后一次寫入后經過固定時間過期

refreshAfterWrite=[duration]:創建緩存或者最近一次更新緩存后經過固定的時間間隔,刷新緩存

recordStats:開發統計功能

注意:

expireAfterWrite和expireAfterAccess同時存在時,以expireAfterWrite為準。

maximumSize和maximumWeight不可以同時使用

3.使用Caffeine緩存

示例1:

使用 @Cacheable(cacheNames = “xxx”) 或 @Cacheable(value = “xxx”) 注解在方法上。

?
1
2
3
4
5
@Cacheable(value = "caffeinSet_Value")
   public String caffeinSetValue(Integer number) {
       String str = number % 2 == 0 ? number + "是偶數" : number + "是奇數";
       return str;
   }

說明: 每次執行方法 caffeinSetValue 時,會先去 caffeinSet_Value 緩存里根據傳入的 number 查找有沒有匹配的緩存,有則直接返回結果;沒有則執行方法,執行完后將結果加入緩存里,下次如果匹配直接返回。

示例2:

當有多個參數時,@Cacheable 注解里可以使用 key 來選擇參數進行判斷緩存是否存在。可以使用 condition 來進行條件篩選,只有滿足條件的才會加入緩存。

?
1
2
3
4
5
6
7
8
/**
 * number為偶數時才會緩存,緩存的key是傳入的number值
 */
@Cacheable(value = "caffeinSet_Value", key = "#number", condition = "#number%2==0")
public String caffeinSetValue(Integer number,String st) {
    String str = number % 2 == 0 ? number + "是偶數" : number + "是奇數";
    return str+st;
}

說明: 假如傳入的參數 number 是2,首先判斷 caffeinSet_Value 緩存里有沒有 key 是2的,有則直接回結果。沒有則執行方法,因為滿足 condition 的條件則最后將結果加入緩存。

假如傳入的參數 number 是奇數,則每次都會執行方法,因為不滿足 condition ,不會被加入緩存。

示例3:

?
1
2
3
4
5
@Cacheable(value = "caffeinSet_Value", key = "#student.name", condition = "#student.age>10")
   public Student caffeinSetValue(Student student,Integer number) {
       System.out.println(11111);
       return student;
   }

說明: 根據student對象里的name去caffeinSetValue緩存里查找。只有student對象里的age大于10的時候才會緩存結果。

注意:

一個方法A調同一個類里的另一個有緩存注解的方法B,這樣是不走緩存的。

例如在同一個CaffeinConsumer 類里面 invalidCache 調用 caffeinSetValue,是不走緩存的,緩存是不生效的;

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Service
public class CaffeinConsumer {
    public String invalidCache(Integer number,String st) {
        String str = caffeinSetValue(number,st);
        return str;
    }
    
    /**
     * number為偶數時才會緩存,緩存的key是傳入的number值
     */
    @Cacheable(value = "caffeinSet_Value", key = "#number", condition = "#number%2==0")
    public String caffeinSetValue(Integer number,String st) {
        String str = number % 2 == 0 ? number + "是偶數" : number + "是奇數";
        return str+st;
    }
}

解決方案:

1.不使用注解的方式,直接取 Ehcache 的 CacheManger 對象,把需要緩存的數據放到里面,類似于使用 Map,緩存的邏輯自己控制;或者可以使用redis的緩存方式去添加緩存;

2.把方法A和方法B放到兩個不同的類里面,例如:如果兩個方法都在同一個service接口里,把方法B放到另一個service里面,這樣在A方法里調B方法,就可以使用B方法的緩存。

Caffeine其他常用注解

1.@CachePut:

被@CachePut標注的方法在執行前不會去檢查緩存中是否存在之前執行過的結果,而是每次都會執行該方法,并將執行結果以鍵值對的形式存入指定的緩存中。

2.@CacheEvict:

@CacheEvict是用來標注在需要清除緩存元素的方法或類上的。當標記在一個類上時表示其中所有的方法的執行都會觸發緩存的清除操作。

@CacheEvict可以指定的屬性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的語義與@Cacheable對應的屬性類似。

即value表示清除操作是發生在哪些Cache上的(對應Cache的名稱);key表示需要清除的是哪個key,如未指定則會使用默認策略生成的key;condition表示清除操作發生的條件。如果要清除所有緩存可使用屬性 allEntries=true

手動添加、獲取、刪除緩存

上面的一些示例通過注解來進行緩存操作,有時候我們需要在一些方法里對緩存進行操作增刪改查:

1.從緩存中獲取數據

假設上面示例2中向名為 “caffeinSet_Value”的緩存里加入的鍵是8,值是"8是偶數!!"。

下面手動獲取此緩存:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   @Autowired
   CacheManager cacheManager;
public String caffeinGetValue() {
       Cache cache = cacheManager.getCache("caffeinSet_Value");
       //獲取緩存名稱。name為caffeinSetValue
       String name = cache.getName();
       //獲取caffeinSetValue緩存里建是8的緩存
       Cache.ValueWrapper value = cache.get(8);
       String str ="";
       if (null != value) {
           //獲取值,8是偶數!!
            str = String.valueOf(value.get());
       }
       return str;
   }

2.向緩存中添加數據

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  @Autowired
  CacheManager cacheManager;
  public String caffeinPutValue() {
      Cache cache = cacheManager.getCache("caffeinSet_Value");
      //獲取緩存名稱。name為caffeinSetValue
      String name = cache.getName();
      /*
      //向緩存中put數據。如果不存在key是20的才會加入
cache.putIfAbsent(number, "添加測試");
*/
      //向緩存中put數據。如果存在key是20的會覆蓋原來的數據
      cache.put(20,"20是偶數!!");
      return "成功";
  }

3.刪除緩存中的數據

刪除caffeinSet_Value緩存中的某條緩存:

?
1
2
3
4
5
6
7
8
9
10
   @Autowired
   CacheManager cacheManager;
public String caffeinDeleteValue() {
       Cache cache = cacheManager.getCache("caffeinSet_Value");
       //獲取緩存名稱。name為caffeinSetValue
       String name = cache.getName();
       //只有20這條數據存在才會刪除
       boolean bo = cache.evictIfPresent(20);
       return String.valueOf(bo);
   }

刪除caffeinSet_Value緩存中的所有緩存:

?
1
2
3
4
5
6
7
8
9
10
   @Autowired
   CacheManager cacheManager;
public String caffeinDeleteAllValue() {
       Cache cache = cacheManager.getCache("caffeinSet_Value");
       //獲取緩存名稱。name為caffeinSetValue
       String name = cache.getName();
       //刪除caffeinSet_Value中的所有緩存
       boolean bo = cache.invalidate();
       return String.valueOf(bo);
   }

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/qq_33697094/article/details/114968105

延伸 · 閱讀

精彩推薦
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
主站蜘蛛池模板: 久久偷拍国2017的 | 拔插拔插成人 | 亚洲一区二区福利视频 | 亚洲精品电影天堂网 | 福利久草| 鄂州一家三口完整版免费 | 亚洲无人区乱码中文字幕 | 色就色欧美综合偷拍区a | 日韩精品成人免费观看 | 亚洲第一永久色 | 369看片网| 午夜国产在线视频 | 欧美视频久久 | 国产精品久久久久不卡绿巨人 | 精品亚洲综合在线第一区 | 成年女人免费 | 日本又大又硬又粗的视频 | 欧美亚洲欧美 | 国产精品一区二区三区久久 | 2012年中文字幕在线看 | 国产自在自拍 | 4虎影视国产在线观看精品 4s4s4s4s色大众影视 | 国产做a爰片久久毛片 | 好吊妞视频998www | 精品老司机在线视频香蕉 | 色一情一区二区三区四区 | 精品免费久久久久久影院 | 俄罗斯引擎首页进入 | 日韩中文在线 | 夫承子液by免费阅读 | 小早川怜子亚洲综合中文字幕 | 四虎成人免费大片在线 | 99精品久久精品一区二区小说 | 毛片免费全部免费观看 | 亚洲精品网址 | 日韩福利网 | 欧美日韩亚洲综合在线一区二区 | 久久婷婷五月综合色丁香花 | 国产在线视频自拍 | 午夜dj影院在线观看完整版 | 微拍秒拍99福利精品小视频 |