Caffeine Cache

1. 前言

互联网软件神速发展,用户的体验度是判断一个软件好坏的重要原因,所以缓存就是必不可少的一个神器。在多线程高并发场景中往往是离不开cache的,需要根据不同的应用场景来需要选择不同的cache,比如分布式缓存如redis、memcached,还有本地(进程内)缓存如ehcache、GuavaCache、Caffeine。

说起Guava Cache,很多人都不会陌生,它是Google Guava工具包中的一个非常方便易用的本地化缓存实现,基于LRU算法实现,支持多种缓存过期策略。由于Guava的大量使用,Guava Cache也得到了大量的应用。但是,Guava Cache的性能一定是最好的吗?也许,曾经,它的性能是非常不错的。但所谓长江后浪推前浪,总会有更加优秀的技术出现。今天,我就来介绍一个比Guava Cache性能更高的缓存框架:Caffeine。

2. 比较

Google Guava工具包中的一个非常方便易用的本地化缓存实现,基于LRU算法实现,支持多种缓存过期策略。

EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。

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

2.1 官方性能比较

场景1:8个线程读,100%的读操作

场景二:6个线程读,2个线程写,也就是75%的读操作,25%的写操作

 

场景三:8个线程写,100%的写操作

可以清楚的看到Caffeine效率明显的高于其他缓存。

3. 如何使用

3.1手动加载(Manual)

public static void main(String[] args) {
        Cache<String, String> manualCache = Caffeine.newBuilder()
                .expireAfterWrite(10, TimeUnit.MILLISECONDS)   //设置过期时间
                .maximumSize(100)    //设置最大缓存个数
                .build();
        String key = "name";
        // 根据key查询一个缓存,如果没有返回NULL
        String value = manualCache.getIfPresent(key);
        System.out.println("key "+ value);    //key null
        // 将一个值放入缓存,如果以前有值就覆盖以前的值
        manualCache.put(key,"reed");
        String value1 = manualCache.getIfPresent(key);
        System.out.println("key1 "+value1);   //key1 reed
        // 删除一个缓存
        manualCache.invalidate(key);
        String value2 = manualCache.getIfPresent(key);
        System.out.println("key2 "+value2);    //key2 null
        // 根据Key查询一个缓存,如果没有调用createExpensiveGraph方法,并将返回值保存到缓存。
        String value3 =manualCache.get(key,k->"fan");
        System.out.println("key3 "+value3);    //key3 fan
        String value4 = manualCache.get(key,k->"reed");
        System.out.println("key4 "+value4);    //key4 fan
    }

3.2同步加载(Loading)

@Test
    public void test(){
        LoadingCache<String, String> loadingCache = Caffeine.newBuilder()
                .maximumSize(10_000)
                .expireAfterWrite(10, TimeUnit.MINUTES)
                .build(key -> getName(key));

        List<String> keys = new ArrayList<>();
        keys.add("reed");
        keys.add("fan");

        Map<String,String> map = loadingCache.getAll(keys);

        for(Map.Entry<String,String> m:map.entrySet()){
            System.out.println("key:" + m.getKey() + " value:" + m.getValue());
            /*key:reed value:reed
            key:fan value:fan*/
        }
    }
    private String getName(String str){
        return str;
    }

3.3异步加载(Asynchronously Loading)

@Test
    public void test() throws Exception {
        AsyncLoadingCache<String, String> asyncLoadingCache = Caffeine.newBuilder()
                .maximumSize(10_000)
                .expireAfterWrite(10, TimeUnit.MINUTES)
                .buildAsync(key -> getName(key));

        List<String> keys = new ArrayList<>();
        keys.add("reed");
        keys.add("fan");
        CompletableFuture<Map<String, String>> names = asyncLoadingCache.getAll(keys);
        Map<String, String> map = names.get();

        for (Map.Entry<String, String> m : map.entrySet()) {
            System.out.println("key:" + m.getKey() + " value:" + m.getValue());
            /*key:reed value:reed
            key:fan value:fan*/
        }
    }

    private String getName(String str) {
        return str;
    }

 

Caffeine Cache是一个用于在项目开发中实现本地缓存的工具。它是基于Guava Cache设计思想的,因此如果之前使用过Guava Cache,使用Caffeine会更加容易上手。通过Caffeine类来配置Cache,可以设置缓存的参数,包括最大缓存大小、写入后过期时间等。例如,可以使用以下代码来构造一个缓存Cache实例Cache cache = Caffeine.newBuilder().maximumSize(1000).expireAfterWrite(6, TimeUnit.MINUTES).softValues().build(); 这段代码中,使用Caffeine的newBuilder()方法创建一个新的Caffeine实例,并通过链式调用方法设置了缓存的最大大小为1000,写入后的过期时间为6分钟,并开启了软引用以支持内存敏感的缓存。最后使用build()方法构建出一个Cache实例。使用这个Cache实例,我们可以进行缓存的读写操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [浅入浅出Caffeine cache](https://blog.youkuaiyun.com/weixin_40413961/article/details/119064614)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [缓存之王Caffeine Cache,性能比Guava更强,命中率更高!](https://blog.youkuaiyun.com/rlnLo2pNEfx9c/article/details/114984936)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值