Caffeine缓存之王

 Caffeine是使用Java8对Guava缓存的重写版本,在Spring Boot 2.0中将取代,基于LRU算法实现,支持多种缓存过期策略。

1、依赖

        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
            <version>2.5.5</version>
        </dependency>

2、本地测试

三种缓存策略都可以通过:

put(k,v); 方法覆盖式的写入缓存,
getIfPresent(k);读取缓存,不存在返回null
import com.github.benmanes.caffeine.cache.AsyncLoadingCache;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

public class CaffeineCache {

    private static String key = "test";
    private static Object result = null;

    public static void main(String[] args) throws Exception{

      /**
         * 手动加载:
         *      在获取的时候如果key存在,则获取,不存在就手动写入
         */
        Cache<String, Object> manualCache = Caffeine.newBuilder()
                .initialCapacity(1000)
                .maximumSize(5000)
                .expireAfterWrite(30, TimeUnit.SECONDS)
                .build();

        result = manualCache.get(key, k -> "manualCache");
        System.out.println("手动加载:"+result);

      /**
         * 同步加载:
         *      用同步方式去获取一个缓存和上面的手动方式是一个原理
         *      查询并在缺失的情况下使用同步的方式来构建
         */
        LoadingCache<String, Object> loadingCache = Caffeine.newBuilder()
                .maximumSize(1000)
                .expireAfterWrite(30, TimeUnit.SECONDS)
                .build(key -> "loadingCache");

        result = loadingCache.get(key);
        System.out.println("同步加载:"+ result);

      /**
         * 异步加载:
         *      查询并在缺失的情况下使用异步的方式来构建缓存.
         *      使用 isDone()查看异步是否完成。
         */
        AsyncLoadingCache<String, Object> asyncLoadingCache = Caffeine.newBuilder()
                .maximumSize(1000)
                .expireAfterWrite(30, TimeUnit.SECONDS)
                .buildAsync(key -> "asyncLoadingCache");

        CompletableFuture<Object> graph = asyncLoadingCache.get(key);
        if(graph.isDone()){
            System.out.println("异步加载:"+ graph.get().toString());
        }

    }
}

注意事项:以下是Caffine的get方法的注解

大意就是:get方法是阻塞的,多线程环境中只有一个线程可以执行传入的方法,其他的线程则进入等待。且在阻塞中,不能对缓存中的其他键进行修改。所以在多线程环境中尽量使用简单的,耗时短的方法获取值,或者减少不必要的写操作,不要造成线程集体阻塞。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值