美文网首页
Guava Cache

Guava Cache

作者: 晚歌歌 | 来源:发表于2020-03-20 10:03 被阅读0次

    简介

    LocalCache是一款类似ConcurrentHashMap的本地缓存

    特性

    1、重写CacheLoader.load方法,自动加载数据;CacheLoader.reload方法异步刷新数据
    2、缓存达到配置的最大数量时,LRU回收缓存
    3、灵活过期时间设置
    4、强弱引用
    5、访问统计
    6、分段锁

    核心类

    LocalCache:整个缓存操作的核心类,extends AbstractMap,implements ConcurrentMap
    CacheBuilder:LocalCache.LocalManualCache建造者类
    CacheLoader:定义load、reload操作的抽象类
    Cache:接口,定义get、put、invalidate等操作,这里只有缓存增删改的操作,没有数据加载的操作
    LoadingCache:接口,继承自Cache。定义get、getUnchecked、getAll等操作,这些操作都会从数据源load数据
    LocalManualCache:LocalCache内部静态类,实现Cache接口。其内部的增删改缓存操作全部调用成员变量localCache(LocalCache类型)的相应方法
    LocalLoadingCache:LocalCache内部静态类,继承自LocalManualCache类,实现LoadingCache接口。其所有操作也是调用成员变量localCache(LocalCache类型)的相应方法

    核心参数

    // guava线程池,用来产生ListenableFuture
        private static ListeningExecutorService service = MoreExecutors.listeningDecorator(
            Executors.newFixedThreadPool(10));
    
    LoadingCache<String, String> cache = CacheBuilder.newBuilder()
            .concurrencyLevel(4)
            .maximumSize(1000)
            //.refreshAfterWrite(1, TimeUnit.SECONDS)
            .expireAfterWrite(1, TimeUnit.SECONDS)
            //.expireAfterAccess(1,TimeUnit.SECONDS)
            .build(new CacheLoader<String, String>() {
                @Override
                public String load(String key) throws Exception {
                    
                    return value;
                }
    
                @Override
                public ListenableFuture<String> reload(final String key, final String oldValue)
                    throws Exception 
                    return service.submit(new Callable<String>() {
                        @Override
                        public String call() throws Exception {
                         
                            return value;
                        }
                    });
                }
            });
    maximumSize //缓存最大容量
    concurrencyLevel = Math.min(builder.getConcurrencyLevel(), MAX_SEGMENTS);//默认并发水平是4
    expireAfterAccessNanos = builder.getExpireAfterAccessNanos();
    expireAfterWriteNanos = builder.getExpireAfterWriteNanos();
    refreshNanos = builder.getRefreshNanos();
    removalListener //移除元素监听器
    defaultLoader //缓存加载器
    

    过期策略

    expireAfterWrite:当 创建 或 写之后的 固定 有效期到达时,数据会被自动从缓存中移除
    expireAfterAccess:当 创建 或 写 或 读 之后的 固定值的有效期到达时,数据会被自动从缓存中移除。读写操作都会重置访问时间
    refreshAfterWrite:是在指定时间内没有被创建/覆盖,则指定时间过后,再次访问时,会去刷新该缓存,在新值没有到来之前,始终返回旧值。刷新方法在LoadingCache接口的refresh()声明,实际最终调用的是CacheLoader的reload()

    移除方式

    1、基于大小的移除
    LocalCache.Segment.evictEntries
    2、 基于时间的移除
    LocalCache.Segment.recordRead
    LocalCache.Segment.recordWrite
    LocalCache.Segment.recordLockedRead
    每次访问或者写入都会记录时间
    getLiveValue时会根据过期策略进行缓存移除

    刷新:scheduleRefresh
    3、基于引用的移除
    基于JVM的垃圾回收机制,根据键或者值的引用关系决定移除

    相关文章

      网友评论

          本文标题:Guava Cache

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