1. 程式人生 > >springboot caffine 快取 簡介及demo

springboot caffine 快取 簡介及demo

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