Guava Cache系列之二:如何回收缓存

2017-05-11  本文已影响709人  骊骅

上一篇文章:Guava Cache系列之一:如何加载缓存

回收缓存方案

Guava Cache提供了三种基本的缓存回收方式:

1、基于容量的回收(size-based eviction)

缓存将尝试回收最近没有使用或总体上很少使用的缓存项。——警告:在缓存项的数目达到限定值之前,缓存就可能进行回收操作——通常来说,这种情况发生在缓存项的数目逼近限定值时。


另外,不同的缓存项有不同的“权重”(weights)——例如,如果你的缓存值,占据完全不同的内存空间,你可以使用CacheBuilder.weigher(Weigher)指定一个权重函数,并且用CacheBuilder.maximumWeight(long)指定最大总重。在权重限定场景中,除了要注意回收也是在重量逼近限定值时就进行了,还要知道重量是在缓存创建时计算的,因此要考虑重量计算的复杂度。

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
        .maximumWeight(100000)
        .weigher(new Weigher<Key, Graph>() {
            public int weigh(Key k, Graph g) {
                return g.vertices().size();
            }
        })
        .build(
            new CacheLoader<Key, Graph>() {
                public Graph load(Key key) { // no checked exception
                    return createExpensiveGraph(key);
                }
            });

2、定时回收(Timed Eviction)

CacheBuilder提供两种定时回收的方法:

如下文所讨论,定时回收周期性地在写操作中执行,偶尔在读操作中执行。

3、基于引用的回收(Reference-based Eviction)

通过使用弱引用的键、或弱引用的值、或软引用的值,Guava Cache可以把缓存设置为允许垃圾回收。关于软引用个弱引用的概念可以参考强引用、弱引用、软引用、虚引用

3、显式清除

任何时候,你都可以显式地清除缓存项,而不是等到它被回收:

清理什么时候发生?

刷新

参考文章

CachesExplained

下一篇文章:Guava Cache系列之三:源码分析

上一篇下一篇

猜你喜欢

热点阅读