我是靠谱客的博主 执着曲奇,最近开发中收集的这篇文章主要介绍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方法是阻塞的,多线程环境中只有一个线程可以执行传入的方法,其他的线程则进入等待。且在阻塞中,不能对缓存中的其他键进行修改。所以在多线程环境中尽量使用简单的,耗时短的方法获取值,或者减少不必要的写操作,不要造成线程集体阻塞。

最后

以上就是执着曲奇为你收集整理的Caffeine缓存之王的全部内容,希望文章能够帮你解决Caffeine缓存之王所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部