springboot之本地快取(guava與caffeine)

  • 2019 年 10 月 11 日
  • 筆記

1. 場景描述

因項目要使用本地快取,具體為啥不用redis等,就不討論,記錄下過程,希望能幫到需要的朋友。

2.解決方案

2.1 使用google的guava作為本地快取

初步的想法是使用google的guava,因為本身項目中就有guava的denpency。

2.1.1 pom文件

需要3個dependency,如下:

  <!--軟體老王 1-->    <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-cache</artifactId>    </dependency>    <!--軟體老王 2-->      <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-context-support</artifactId>              <version>4.3.18.RELEASE</version>    </dependency>     <!--軟體老王 3-->     <dependency>                  <groupId>com.google.guava</groupId>                  <artifactId>guava</artifactId>                  <version>24.0-jre</version>       </dependency>

2.1.2 java類

(1)GuavaCacheManager

新建bean,返回及配置guava的GuavaCacheManager。

import com.google.common.cache.CacheBuilder;  import org.springframework.cache.CacheManager;  import org.springframework.cache.annotation.EnableCaching;  import org.springframework.cache.guava.GuavaCacheManager;  import org.springframework.context.annotation.Bean;  import org.springframework.context.annotation.Configuration;    import java.util.concurrent.TimeUnit;  /**  *  * @auther: 軟體老王  */  @Configuration  @EnableCaching  public class GuavaCacheConfig {        @Bean      public CacheManager cacheManager() {          GuavaCacheManager cacheManager = new GuavaCacheManager();          cacheManager.setCacheBuilder(                  CacheBuilder.newBuilder().                          expireAfterWrite(6, TimeUnit.HOURS).                          maximumSize(1000)); //軟體老王,6小時過期,最大1000條          return cacheManager;      }  }

(2)spring註解標籤使用快取

/**  *  * @auther: 軟體老王  */    @Cacheable(value = "ruanjianlaowang")      public VO<UserParm> getUserInfo(String token) {          VO<UserParm> vo = userauthClient.verifyToken(token);          return vo;      }

guava本地快取完成。

2.2 spring框架提供的本地快取方案

spring中已經提供了抽象類,默認只需要配置載入jar包,配置type就可以了,但是從spring5開始,將guava的剔除掉了,替換成了caffeine,spring做了測試,作為本地快取caffeine比guava要高出好多,我們也改成了caffeine作為本地快取。

springboot與guava、caffeine等本地快取,springboot1的時候還有guava,springboot2裡面就把guava的快取介面去掉了,所以前面guava本地快取才需要定義Configuration,在這裡面的話,就只需要在配置文件裡面定義類型就會自動注入了。

2.3 caffeine本地快取

2.3.1 pom文件
        <!--軟體老王-->         <dependency>              <groupId>com.github.ben-manes.caffeine</groupId>              <artifactId>caffeine</artifactId>              <version>2.8.0</version>          </dependency>
2.3.2 配置文件
spring:     cache:        type: caffeine        cache-names: bc.gateway.ut        caffeine:  #        spec: maximumSize=5000,expireAfterWrite=20s           spec: maximumSize=5000,expireAfterAccess=3600s

具體參數含義

/**  * @auther: 軟體老王  */  • initialCapacity=[integer]: 初始的快取空間大小  • maximumSize=[long]: 快取的最大條數  • maximumWeight=[long]: 快取的最大權重  • expireAfterAccess=[duration]: 最後一次寫入或訪問後經過固定時間過期  • expireAfterWrite=[duration]: 最後一次寫入後經過固定時間過期  • refreshAfterWrite=[duration]: 創建快取或者最近一次更新快取後經過固定的時間間隔,刷新快取
2.3.3 使用方式還是spring的標籤不用動:
/**  *  * @auther: 軟體老王  */    @Cacheable(value = "ruanjianlaowang")      public VO<UserParm> getUserInfo(String token) {          VO<UserParm> vo = userauthClient.verifyToken(token);          return vo;      }

2.4 關於spring快取標籤的說明

四個標籤:

(1)@Cacheable,首先在快取中查詢,沒有的話,進方法執行,執行完成後返回值放快取;

(2)@CachePut,不進行查詢判斷,直接新增或者更新快取內容,類似add或update;

(3)@CacheEvict,直接清除,類似delete。

(4)@Caching,1,2,3個組合

value 快取的名稱,在 spring 配置文件中定義,必須指定至少一個 例如: @Cacheable(value=」laowang_cache1」) @Cacheable(value={」」laowang_cache1,」laowang_cache2」}
key 快取的 key,可以為空,如果指定要按照 SpEL 表達式編寫,如果不指定,則預設按照方法的所有參數進行組合 @Cacheable(value=」laowang_cache1」,key=」#userName」)
condition 快取的條件,可以為空,使用 SpEL 編寫,返回 true 或者 false,只有為 true 才進行快取 @Cacheable(value=」laowang_cache1」, condition=」#userName.length()>11」)

I』m 「軟體老王」,如果覺得還可以的話,關注下唄,後續更新秒知!歡迎討論區、同名公眾號留言交流!