Guava---缓存

google guava框架提供了内存缓存的功能,可以很方便的缓存对象,设置生命周期, 及缓存对象的弱引用 强应用 软引用等.

所在包:package com.google.common.cache;

//LoadingCache在缓存项不存在时可以自动加载缓存
private LoadingCache<Key,String> dictCache = CacheBuilder.newBuilder()
            .maximumSize(200)//设置缓存最大容量为200,超过200之后就会按照LRU最近虽少使用算法来移除缓存项
            .expireAfterWrite(30, TimeUnit.MINUTES)//设置写缓存后30分钟过期,过期后会触发removalListener
            .concurrencyLevel(4)//并发级别为4,并发级别是指可以同时写缓存的线程数
            .removalListener(new RemovalListener<Object, Object>() {//这段代码可以移除
                @Override
                public void onRemoval(RemovalNotification<Object, Object> notification) {
                    LOG.debug("");
                }
            })
            //build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存
                .build(
            .build(new CacheLoader<Key,String>() {
                @Override
                public String load(Key key) throws Exception {
                    return loadFromDb(key);
                }
            });

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

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

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

参考文献:
使用google guava做内存缓存

猜你喜欢

转载自blog.csdn.net/Jiakunboy/article/details/51881904
今日推荐