美文网首页
Guava Cache使用案例

Guava Cache使用案例

作者: _火山_ | 来源:发表于2019-11-06 15:53 被阅读0次

需要在pom.xml文件中添加guava cache的依赖

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>18.0</version>
</dependency>

代码示例

import com.google.common.cache.*;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

/**
 * guava cache使用案例
 */
public class TestGuavaCache {

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

        /**
         * guava cache元素的创建方式推荐使用两种:
         * 1、cacheLoader方式
         * 2、callable方式
         */

        /**
         * 1、采用cacheLoader方式创建元素
         */

        //创建guava cache
        LoadingCache<String, String> loadingCache = CacheBuilder.newBuilder()
                //cache的初始容量
                .initialCapacity(5)
                //cache最大缓存数
                .maximumSize(10)
                //读/写过期时间,某个key在指定的时间内没有发生读/写操作,即为过期元素
                .expireAfterAccess(10, TimeUnit.SECONDS)
                //删除cache元素的监听器,即当监听到cache删除元素时,额外可以做些什么操作
                .removalListener(new RemovalListener<String, String>() {
                    @Override
                    public void onRemoval(RemovalNotification<String, String> removalNotification) {
                        //例如,我这里额外执行的操作是提示一下,此时删除的元素的key和value分别是什么;
                        //当然,你可以根据实际情况做些有用的操作
                        String key = removalNotification.getKey();
                        String value = removalNotification.getValue();
                        System.out.println("此时删除的key是: " + key + " , " + "此时删除的value是: " + value);
                    }
                })
                //采用CacheLoader方式创建元素,当调用get从cache中获取指定key的值时,发现没有,则调用cacheLoader计算得到一个该key对应的值,并添加到cache中,然后返回该值
                .build(new CacheLoader<String, String>() {
                    @Override
                    public String load(String key) throws Exception {
                        return "我是" + key + "的值";
                    }
                });

        /**
         * get()从cache中获取指定key对应的元素,如果没有,则调用cacheLoader计算key对应的值(计算逻辑即为load()方法里的逻辑),并添加到cache,然后返回该值;
         * 如果该key对应的值存在,则直接返回该值。
         */
        String a = loadingCache.get("a");
        System.out.println(a);
        String b = loadingCache.get("b");
        System.out.println(b);

        /**
         * 显式删除cache中指定key对应的值;
         * 当cache删除元素时,removalListener监听器可以监听到该操作,然后执行onRemoval方法;
         * 当元素过期后,cache隐式删除它们时removalListener也是会监听到的,也会执行onRemoval方法;
         * 如果指定key不存在,执行删除操作也不会抛异常。
         */
        loadingCache.invalidate("a");

        /**
         * put()方法也可以用于往cache中添加一个元素,但是put方式创建元素其value的计算调用cacheLoader的load()方法了,需要自行先生成值;
         * 如果指定key已存在,则本次put操作将替换指定key原本的值;
         * 否则,往cache中添加一个新元素;
         * 但是put()方式创建元素的方式不被推荐。
         */
        String c = "我是c的值";
        loadingCache.put("c",c);


        /**
         * 2、采用callable方式创建元素
         */
        Cache<String, String> cache = CacheBuilder.newBuilder()
                .initialCapacity(5)
                .maximumSize(10)
                .expireAfterAccess(10, TimeUnit.SECONDS)
                .removalListener(new RemovalListener<String, String>() {
                    @Override
                    public void onRemoval(RemovalNotification<String, String> removalNotification) {
                        String key = removalNotification.getKey();
                        String value = removalNotification.getValue();
                        System.out.println(key + "->" + value);
                    }
                })
                .build();

        /**
         * get()从cache中获取指定key对应的元素,如果没有,则调用callable的回调方法计算key对应的值,并添加到cache,然后返回该值;
         * 如果该key对应的值存在,则直接返回该值。
         */
        final String key_d = "d";
        String d = cache.get(key_d, new Callable<String>() {
            @Override
            public String call() throws Exception {
                return "我是" + key_d + "的值";
            }
        });

        /**
         * 显式删除cache中指定key对应的值;
         * 当cache删除元素时,removalListener监听器可以监听到该操作,然后执行onRemoval方法;
         * 当元素过期后,cache隐式删除它们时removalListener也是会监听到的,也会执行onRemoval方法;
         * 如果指定key不存在,执行删除操作也不会抛异常。
         */
        loadingCache.invalidate(key_d);

        /**
         * put()方法也可以用于往cache中添加一个元素,但是put方式创建元素其value的计算调用cacheLoader的load()方法了,需要自行先生成值;
         * 如果指定key已存在,则本次put操作将替换指定key原本的值;
         * 否则,往cache中添加一个新元素;
         * 但是put()方式创建元素的方式不被推荐。
         */
        String e = "我是e的值";
        loadingCache.put("e",e);
    }
}

可以直接拷贝代码测试一下哦。

上述例子中提到的put方式创建元素不被推荐,至于为什么不推荐,我现在也不是很清楚原因,等后期我分析源码,了解其中原理后,会再写一篇文章进行解释。

相关文章

  • Guava Cache使用案例

    需要在pom.xml文件中添加guava cache的依赖 代码示例 可以直接拷贝代码测试一下哦。 上述例子中提到...

  • 高并发系统技术梳理

    缓存 缓存使用常见问题归纳Guava Cache系列之一Guava Cache系列之二Guava Cache系列之...

  • Guava Cache用法介绍

    Guava Cache的使用场景 参考1 Guava Cache用法介绍2 分布式系统缓存系列之guava cache

  • cache

    guava cache的使用

  • java之guava cache应用

    google的guava cache是一个轻量级进程内缓存框架。 如何使用guava cache a. 引入方便,...

  • Guava Cache

    原文 使用Guava cache构建本地缓存 - sameLuo的个人空间 - OSCHINA Guava Cac...

  • Guava Cache 使用

    缓存分为本地缓存和远端缓存。常见的远端缓存有 Redis,MongoDB;本地缓存一般使用 map 的方式保存在本...

  • Guava cache源码解析之构造缓存器

    guava cache使用介绍 guava cache是目前最长用的本地缓存,可以把它看成是增加了一些额外功能的C...

  • guava 本地缓存

    介绍 Guava cache是本地缓存的一种实现。 Guava Cache与ConcurrentMap很相似,但也...

  • Guava Cache本地缓存使用小结

    原创文章,转载请注明原文章地址,谢谢! Guava Cache介绍 guava cache是google guav...

网友评论

      本文标题:Guava Cache使用案例

      本文链接:https://www.haomeiwen.com/subject/yqiubctx.html