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 「軟體老王」,如果覺得還可以的話,關注下唄,後續更新秒知!歡迎討論區、同名公眾號留言交流!