1.概览
Guava Cache 是一个基于本地缓存的实现,它提供了线程安全的机制,简单易用,性能好。在这篇文章中,我们将看一下Guava Cache的实现 ----最基本的用法,回收策略,缓存刷新以及一些比较有趣的操作。
(Guava (/ˈɡwɑːvə/)[1] is a common tropical fruit cultivated and enjoyed in many tropical and subtropical regions)
2.如何使用Guava Cache
我们先写一个简单的例子---我们利用Guava Cache来缓存 String实例的大写形式。
首先,先创建一个CacheLoader,利用这个CacheLoader我们可以计算存储在cache中的值。从这里开始,我们就可以使用给定的规则利用CacheBuilder 来创建我们的缓存:
3.回收策略
从某种程度上来说,每一个缓存都需要清除。我们来讨论一下缓存使用不同规则的回收策略。
3.1 根据大小进行回收
我们可以通过 maximumSize()方法来限制缓存的大小,如果缓存到底了限制之后,cache里面最老的值将会被回收掉。
在下面的代码中,我们把cache的大小限制为3条:
查看执行结果:
可以看到,当我们把缓存大小设置为3之后,在存储第四个值时,会自动把第一个存储的值给清除掉。
3.2 根据权重进行回收
除了根据缓存大小进行回收之外,我们还可以使用自定义的权重函数来限制缓存的大小,我们使用长度作为我们自定义的权重函数:
备注: 如果有一个新的大对象要放入缓存中的话,缓存为了腾出更多的空间会把当前缓存中的一个或多个记录给清除掉。
3.3 根据时间进行回收 eviction by time
除了使用大小策略去回收旧记录之外,我们还可以使用基于时间的策略来进行回收。在下面的例子中,我们会让我们的cache自动清除那些空闲2ms的记录:
我们还能基于记录的生存时间来进行回收,在下面的例子中,缓存cache将移除掉那些已经在其中中待了超过2ms的记录:
4.弱键
下一步,我们来看一下,如何让我们的键具有弱引用----这样可以让垃圾回收器去回收那些不再引用的cache key。默认情况下,缓存键和缓存值都是具有强引用但是我们可以让我们的缓存使用弱引用来存储这些key:
5.软值soft value
通过使用softValues()方法,我们可以让垃圾收集器去收集我们的缓存值:
6.处理null值
现在,我们来看一下如何处理null值。如果你试图加载一个null值得话,Guava Cache会抛出一个异常---因为缓存一个null值是毫无意义的。
但是,如果null值在你的代码中确实有用处的话,你可以好好地使用一下Optional类:
7.刷新cache
下一节,我们来看一下如何刷新缓存值。我们可以使用refreshAfterWrite()方法自动地刷新我们的cache缓存。在下面的例子中,每一分钟cache缓存就会自动刷新:
注意: 你可以使用refresh(key)方法去刷新特定的记录。
8.预加载缓存 preload cache
我们可以使用putAll()方法向cache缓存中插入多条记录。在下面的例子中,我们可以使用map来向cache中加入多个记录:
9.清除提醒RemovalNotification
有时候,当有一条记录从cache缓存中移除时,你需要执行一些动作,因此,我们来讨论一下,RemovalNotification:我们可以通过注册一个RemovalListener来获取一条记录的清除提醒,并且我们还可以使用getCache()方法获取清除的原因。
在下面的例子中,当第四个元素被放入到cache中之后,我们就会收到一个个RemovalNotification提醒:
10.注意事项Notes
最后,这里有几个关于Guava Cache实现的要点:
1.Guava Cache是线程安全的
2.你可以使用put(key,value)方法手动地向cache缓存中插入数据
3.你可以使用CacheStats测量你的缓存性能
11.总结
这篇文章中,我们写了很多Guava Cache用例-从简单地元素清除,刷新,cache预加载 到 清除提醒。