陆丰体育网

当前位置: 首页 >西甲

高性能Java缓存库Caffeine1

来源: 作者: 2019-11-10 02:50:01

高性能Java缓存库Caffeine1

作者:baeldung译者:oopsguy.com

1、介绍

在本文中,我们来看看 Caffeine(https://github.com/ben-manes/caffeine) — 一个高性能的 Java 缓存库。

缓存和 Map 之间的一个根本区别在于缓存可以回收存储的 item。

回收策略为在指定时间删除哪些对象。此策略直接影响缓存的命中率 — 缓存库的一个重要特点。

Caffeine 因使用Window TinyLfu回收策略,提供了一个近乎最好的命中率。

2、依赖

我们需要在pom.xml中添加 caffeine 依赖:

3、填充缓存

让我们来了解一下 Caffeine 的3种缓存填充策略:手动、同步加载和异步加载。

首先,我们为要缓存中存储的值类型写一个类:

3.1、手动填充

在此策略中,我们手动将值放入缓存以后再检索。

让我们初始化缓存:

现在,我们可以使用getIfpresent方法从缓存中获得一些值。 如果缓存中不存在此值,则此方法将返回 null:

我们可以使用put方法手动填充缓存:

我们也可以使用get方法获取值,该方法将一个参数为 key 的 Function 作为参数传入。如果缓存中不存在该键,则该函数将用于提供回退值,该值在计算后插入缓存中:

get方法可以原子方式履行计算。这意味着您只进行一次计算 — 即便多个线程同时要求该值。这就是为何使用get优于getIfpresent。

有时我们需要手动使一些缓存的值失效:

3.2、同步加载

这类加载缓存的方法使用了与用于初始化值的 Function 类似的手动策略的get方法。让我们看看如何使用它。

首先,我们需要初始化缓存:

现在我们可以使用get方法检索值:

我们也可以使用getAll方法取得一组值:

从传递给build方法的底层后端初始化函数检索值。 这使得可以使用缓存作为访问值的主要门面(Facade)。

3.3、异步加载

此策略的作用与之前相同,但是以异步方式履行操作,并返回一个包括值的CompletableFuture:

我们可以以相同的方式使用get和getAll方法,同时考虑到他们返回的是CompletableFuture:

CompletableFuture有许多有用的 ApI,您可以在此文中获取更多内容。

4、值回收

Caffeine 有三个值回收策略:基于大小,基于时间和参考。

4.1、基于尺寸的驱逐

这种回收方式假定当超过配置的缓存大小限制时会产生回收。获得大小有两种方法:缓存中计数对象,或获取权重。

让我们看看如何计算缓存中的对象。当缓存初始化时,其大小等于零:

当我们添加一个值时,大小明显增加:

我们可以将第二个值添加到缓存中,这导致第一个值被删除:

值得一提的是,在获取缓存大小之前,我们调用了cleanUp方法。 这是因为缓存回收被异步履行,这种方法有助于等待回收的完成。

我们还可以传递一个weigher Function来获得缓存的大小:

当 weight 超过 10 时,值将从缓存中删除:

4.2、基于时间的回收

这类回收策略是基于条目的到期时间,有三种类型:

访问后到期— 从上次读或写产生后,条目即过期。

写入后到期— 从上次写入发生以后,条目即过期

自定义策略— 到期时间由 Expiry 实现独自计算

让我们使用expireAfterAccess方法配置访问后过期策略:

要配置写入后到期策略,我们使用expireAfterWrite方法:

要初始化自定义策略,我们需要实现Expiry接口:

4.3、基于援用的回收

我们可以将缓存配置为启用缓存键值的垃圾回收。为此,我们将 key 和 value 配置为弱引用,并且我们可以仅配置软援用以进行垃圾回收。

当没有任何对对象的强援引时,使用WeakRefence可以启用对象的垃圾收回收。SoftReference允许对象根据 JVM 的全局最近最少使用(Least-Recently-Used)的策略进行垃圾回收。有关 Java 援用的更多详细信息,请参见此处。

我们应当使用Caffeine.weakKeys()、Caffeine.weakValues()和Caffeine.softValues()来启用每一个选项:

5、刷新

可以将缓存配置为在定义的时间段后自动刷新条目。让我们看看如何使用refreshAfterWrite方法:

这里我们应该要明白expireAfter和refreshAfter之间的区别。 当要求过期条目时,履行将产生阻塞,直到build Function计算出新值为止。

但是,如果条目可以刷新,则缓存将返回1个旧值,并异步重新加载该值。

6、统计

Caffeine 有一种记录缓存使用情况的统计方式:

我们也可能会传入recordStatssupplier,创建一个StatsCounter的实现。每次与统计相干的更改将推送此对象。

7、结论

在本文中,我们熟习了 Java 的 Caffeine 缓存库。 我们看到了如何配置和填充缓存,和如何根据我们的需要选择适当的到期或刷新策略。

文中示例的源代码可以在 Github (https://github.com/eugenp/tutorials/tree/master/libraries)上找到。

服用伟哥后的功效怎么样

深受男人喜爱的壮阳药伟哥万艾可

希爱力是西地那非吗

印度神油产品介绍

相关推荐