Caffeine Cache


想必很多人对 Google 出品的 Guava Cache 都不陌生,还没怎么听过 Caffeine Cache,但是如果你使用 2.0.0 以上版本的 Springboot 时会惊讶的发现其已经不再支持 Guava Cache 了,在其文档中推荐了 Caffeine Cache。Guava 这么优秀的工具怎么突然就给废了呢?

其实 Caffeine Cache 就是 Guava Cache 的 JDK8 重写版本,加入了一些优化,两者的原理包括使用方式都基本类似,但是性能有了很大的提升。下图是几种 Cache 的性能对比,数据出处

下面重点介绍一下在 Springboot 项目中集成 Caffeine 的过程。

首先加入 Maven 依赖

<!-- cache -->
<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>

Caffeine 配置

@Configuration
@EnableCaching
public class CaffeineCacheConf {
    public static final int DEFAULT_MAXSIZE = 50000;
    public static final int DEFAULT_TTL = 30*60;    
    /**
     * cache name、过期时间(秒)、最大容量(条)
     * 缺省:30分钟超时、最多缓存50000条数据,需要修改可以在构造方法的参数中指定。
     */
    public enum Caches{
        testCache, //使用默认值
        testCache1(60), //一分钟过期。最大容量使用默认值
        testCache2(10, 20), //指定过期时间和最大容量
        ;    
        Caches() {
        }
        Caches(int ttl) {
            this.ttl = ttl;
        }
        Caches(int ttl, int maxSize) {
            this.ttl = ttl;
            this.maxSize = maxSize;
        }        
        private int maxSize = DEFAULT_MAXSIZE;    
        private int ttl = DEFAULT_TTL;    

        public int getMaxSize() {
            return maxSize;
        }
        public int getTtl() {
            return ttl;
        }
    }

    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        ArrayList<CaffeineCache> caches = new ArrayList<CaffeineCache>();
        for(Caches c : Caches.values()){
            caches.add(new CaffeineCache(c.name(), 
                Caffeine.newBuilder()
                .expireAfterWrite(c.getTtl(), TimeUnit.SECONDS)
                .maximumSize(c.getMaxSize())
                .build())
            );
        }
        cacheManager.setCaches(caches);
        return cacheManager;
    }

}

利用注解对方法进行缓存,可以简单的对其进行测试。

@Cacheable(value="testCache", sync=true)
public int testCache(int i) {
    System.out.println("----- not from cache!");
    return i*i;
}

链接

Copyright © jverson.com 2018 all right reserved,powered by GitbookFile Modify: 2019-04-21 23:09:08

results matching ""

    No results matching ""