一、序言
Caffeine是一個行程內部快取框架,使用了Java 8最新的[StampedLock]樂觀鎖技術,極大提高快取并發吞吐量,一個高性能的 Java 快取庫,被稱為最快快取,
二、快取簡介
(一)快取對比
從橫向對常用的快取進行對比,有助于加深對快取的理解,有助于提高技術選型的合理性,下面對比三種常用快取:Redis、EhCache、Caffeine,
1、序列化
| 快取 | 序列化 | 原因 |
|---|---|---|
| Redis | 必須實作序列化 | 行程間資料傳輸,因此必須實作序列化,大多數情況下涉及內網網路傳輸;作為快取資料庫使用,持久化是標配, |
| EhCache | 不一定需要實作序列化 | 當快取配置不持久化到磁盤時,無需實作序列化介面,使用時,如果不確定是否需要持久化到磁盤,建議統一實作序列化介面, |
| Caffeine | 不需要實作序列化 | Map物件的改進型介面,不涉及任何形式的網路傳輸和持久化,因此完全不需要實作序列化介面, |
2、行程關系
| 快取 | 行程關系 | 備注 |
|---|---|---|
| Redis | 與業務行程獨立,由作業系統獨立管理,業務系統重啟對快取服務無影響 | Redis服務與業務服務獨立,互相影響較小 |
| EhCache | 附著于業務行程,業務系統重啟,存盤與記憶體部分的快取資料丟失;存盤與硬碟部分的資料繼續存在 | 快取配置存在兩種模式:一種是純記憶體型,一種是可持久化到磁盤 |
| Caffeine | 附著于業務行程,業務系統重啟,快取資料全部丟失 | 純記憶體型 |
記憶體型快取的理解:快取都是使用記憶體作為存盤媒介的,各種快取服務的區別如下:Caffeine是記憶體型快取是指快取與呼叫者屬于同一個應用,準確的說屬于同一個JVM;Redis是指另外一個獨立行程的記憶體型,快取資料存盤在Redis資料庫的記憶體中,而不是在呼叫服務所屬的記憶體中,
(二)本地快取
本地快取與分布式快取對應,快取行程和應用行程同屬于一個JVM,資料的讀、寫在一個行程內完成,本地快取沒有網路開銷,訪問速度很快,
Caffeine是基于Guava Cache增強的新一代快取技術,快取性能極其出色,
1、Map
JDK內置的Map可作為快取的一種實作方式,然而嚴格意義來講,其不能算作快取的范疇,原因如下:一是其存盤的資料不能主動過期;二是無任何快取淘汰策略,
三、SpringCache
Caffeine作為Spring體系中內置的快取之一,Spring Cache同樣提供呼叫介面支持,
(一)需求分析
1、CacheManager
Caffeine屬于行程內部快取框架,不需要配置多資料源,因此一個CacheManager即可滿足需求,如果應用中僅使用Caffeine作為唯一的快取框架,那么通過注解使用時無需顯式指明,
2、CacheName
任何一類快取,不同業務模塊間快取過期時間以及快取淘汰策略幾乎不相同,因此應該支持多CacheName,并且應該具有不同配置,過期時間是不同CacheName間快取配置的重要區別,
3、Key
記憶體型快取,無可視化界面,因此首要滿足鍵值的唯一性,鍵值唯一是正確使用業務快取的基礎保證,
(二)序列化
Caffeine快取不涉及任何序列化,因此目標快取物件不需要實作Serializable介面,若涉及多級快取或者多種快取共用,其它需要網路傳輸或者持久化的快取需要序列化,Caffeine盡管也使用實作序列化的物體類,但是不做序列化操作,
不需要序列化,降低了快取使用難度,
(三)集成
1、引入依賴
如果無特別要求,使用較新SpringBoot的內置版本即可,
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
2、全域配置
全域配置中指定使用caffeine快取管理,
spring:
cache:
type: caffeine
3、快取管理器
配置快取管理器:多CacheName配置,
public interface CacheNameTimeConstant {
String CACHE_DEFAULT = "CACHE_DEFAULT";
String CACHE_10SECS = "CACHE_10SECS";
String CACHE_60SECS = "CACHE_60SECS";
}
同一個CacheManager配置多個CacheName,此處僅配置過期時間的差異,其余配置可自由增加,
@Bean
public CacheManager caffeineCacheManager() {
SimpleCacheManager cacheManager = new SimpleCacheManager();
List<CaffeineCache> caches = new ArrayList<>();
caches.add(new CaffeineCache(CacheNameTimeConstant.CACHE_5SECS,
Caffeine.newBuilder().expireAfterWrite(5, TimeUnit.SECONDS).build()));
caches.add(new CaffeineCache(CacheNameTimeConstant.CACHE_10SECS,
Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build()));
caches.add(new CaffeineCache(CacheNameTimeConstant.CACHE_30SECS,
Caffeine.newBuilder().expireAfterWrite(30, TimeUnit.SECONDS).build()));
cacheManager.setCaches(caches);
return cacheManager;
}
四、小結
Java領域可用的快取框架非常多,Caffeine不屬于分布式快取,但不影響其在本地快取場景出色的表現,開發者在進行快取架構設計時需要綜合考慮各類快取的優缺點,依據具體場景選配相應快取,
喜歡本文就【??推薦??】一下,激勵我持續創作,這個Github同樣精彩,收到您的star我會很激動,本文歸檔在專題博客,視頻講解在B站,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/434369.html
標籤:Java
上一篇:Go記憶體逃逸分析
