加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > C语言 > 正文

guava cache 小记

发布时间:2020-12-15 00:30:51 所属栏目:C语言 来源:网络整理
导读:public static void main(String[] args) throws ExecutionException,InterruptedException{ //缓存接口这里是LoadingCache,LoadingCache在缓存项不存在时可以自动加载缓存 LoadingCache studentCache //CacheBuilder的构造函数是私有的,只能通过其静态方
public static void main(String[] args) throws ExecutionException,InterruptedException{
        //缓存接口这里是LoadingCache,LoadingCache在缓存项不存在时可以自动加载缓存
        LoadingCache studentCache
                //CacheBuilder的构造函数是私有的,只能通过其静态方法newBuilder()来获得CacheBuilder的实例
                = CacheBuilder.newBuilder()
                //设置并发级别为8,并发级别是指可以同时写缓存的线程数
                .concurrencyLevel(8)
                //设置写缓存后8秒钟过期
                .expireAfterWrite(8,TimeUnit.SECONDS)
                //设置缓存容器的初始容量为10
                .initialCapacity(10)
                //设置缓存最大容量为100,超过100之后就会按照LRU最近虽少使用算法来移除缓存项
                .maximumSize(100)
                //设置要统计缓存的命中率
                .recordStats()
                //设置缓存的移除通知
                .removalListener(new RemovalListener() {
                    @Override
                    public void onRemoval(RemovalNotification notification) {
                        System.out.println(notification.getKey() + " was removed,cause is " + notification.getCause());
                    }
                })
                //build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存
                .build(
                        new CacheLoader() {
                            @Override
                            public Student load(Integer key) throws Exception {
                                System.out.println("load student " + key);
                                Student student = new Student();
                                student.setId(key);
                                student.setName("name " + key);
                                return student;
                            }
                        }
                );
    for (int i=0;i<20;i++) {
        //从缓存中得到数据,由于我们没有设置过缓存,所以需要通过CacheLoader加载缓存数据
        Student student = studentCache.get(1);
        System.out.println(student);
        //休眠1秒
        TimeUnit.SECONDS.sleep(1);
    }

    System.out.println("cache stats:");
    //最后打印缓存的命中率等 情况
    System.out.println(studentCache.stats().toString());
}</code></pre>

guava缓存原理:

guava缓存过期时间分为两种,一种是从写入时开始计时,一种是从最后访问时间开始计时,而且guava缓存的过期时间是设置到整个一组缓存上的;这和EHCache,redis,memcached等不同,这些缓存系统设置都将缓存时间设置到了单个缓存上。

guava缓存设计成了一组对象一个缓存实例,这样做的好处是一组对象设置一组缓存策略,你可以根据不同的业务来设置不同的缓存策略,包括弱引用,软引用,过期时间,最大项数等。另外一点好处是你可以根据不同的组来统计缓存的命中率,这样更有意义一些。

这样做也是有缺点的,缺点是首先是每个缓存组都需要声明不同的缓存实例,具体到业务程序中可能就是每个业务对象一个缓存了。这样就把不同的业务缓存分散到不同的业务系统中了,不太好管理。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读