springboot caffine 快取 簡介及demo
阿新 • • 發佈:2019-08-10
Caffeine是使用Java8對Guava快取的重寫版本,在Spring 5.0或者Spring Boot 2.0中將取代,基於LRU演算法實現,支援多種快取過期策略。 那麼為什麼這麼好的東西需要被淘汰呢,如果對於本地Cache有過深入研究的人應該知道LRU演算法基本可以滿足大部分的場景,但是很多人為了精益求精,基於LRU的演算法,又在此基礎上提出了一系列更好的,更有效果的淘汰策略。比如有ARC,LIRS和W-TinyLFU等都提供了接近最理想的命中率,他們這些演算法進一步提高了本地快取的效率。 Caffeine配置說明: initialCapacity=[integer]: 初始的快取空間大小 maximumSize=[long]: 快取的最大條數 maximumWeight=[long]: 快取的最大權重 expireAfterAccess=[duration]: 最後一次寫入或訪問後經過固定時間過期 expireAfterWrite=[duration]: 最後一次寫入後經過固定時間過期 refreshAfterWrite=[duration]: 建立快取或者最近一次更新快取後經過固定的時間間隔,重新整理快取 weakKeys: 開啟key的弱引用 weakValues:開啟value的弱引用 softValues:開啟value的軟引用 recordStats:開發統計功能 注意: expireAfterWrite和expireAfterAccess同時存在時,以expireAfterWrite為準。 maximumSize和maximumWeight不可以同時使用 weakValues和softValues不可以同時使用
springbootApplication開啟快取支援:@EnableCaching// 開啟快取,需要顯示的指定 maven 引入:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> </dependency>
demo:
import com.github.benmanes.caffeine.cache.Caffeine; import org.springframework.cache.caffeine.CaffeineCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; @Configuration public class CacheConfig { private static final int DEFAULT_MAXSIZE = 10; private static final int DEFAULT_TTL = 15 * 60; /** * 個性化配置快取 */ @Bean(name = "caffeineCache") public CaffeineCacheManager cacheManager() { CaffeineCacheManager cacheManager = new CaffeineCacheManager(); Caffeine caffeine = Caffeine.newBuilder() //cache的初始容量值 .initialCapacity(10) .expireAfterWrite(DEFAULT_TTL,TimeUnit.SECONDS) //maximumSize用來控制cache的最大快取數量,maximumSize和maximumWeight不可以同時使用, .maximumSize(DEFAULT_MAXSIZE); cacheManager.setCaffeine(caffeine); cacheManager.setCacheNames(getNames()); return cacheManager; } private static List<String> getNames(){ List<String> names = new ArrayList<>(2); names.add("datainterface"); return names; } }
&nbs