当前位置: 首页 > 网络应用技术

Java开发沙龙Guava Cache使用文章

时间:2023-03-08 13:46:43 网络应用技术

  当涉及到缓存时,您第一次想到是redis,memcache等。这些属于分布式缓存,在某些情况下,我们可能不需要分布式缓存。在所有数据量很小之后,频繁访问或某些不会更改的静态配置数据。我们可以考虑被放置在本地缓存中。那么我们通常会做什么?我相信,当您编写或阅读有关本地缓存代码时,您会看到以下实现方法:

  确实,这种方法简单有效,但是缺点带来的太简单了,并且功能太缺乏,如果不使用它,它将带来可怕的内存溢出。例如,当您谈论Cacheexpired策略时,但是请放心,强大的Guava工具库为我们提供了简单有效的Guava缓存。

  值得注意的是,请不要被强大的Guava Cache混淆。如果您的缓存场景不使用这些缓存的特性,那么ConcurrenthashMap可能是您的最佳选择

  官方地址:https://github.com/google/guava/wiki/cachesexplaine

  关键的高速缓存值的计算方法是缓存可能是长期计算的缓存(除了CPU类型任务,还计算了I/O类型)。REAL计算,然后GUAVA CACE提供三个缓存计算方法。您也可以理解缓存加载方法。他们是Cacheloader,Callace,直接插入。

  CacheloAdercacheloader方法,简单地说,计算方法作用于所有密钥,即由Cacheloader方法创建的缓存,无论您访问哪种键,其计算方法都是相同的。看看示例:

  在此示例中,我们通过构建的Cachebuilder方法介绍了匿名类Cacheload。Cacheload方法的负载方法逻辑是获得一个缓存键,如果不存在密钥缓存,则将计算其缓存值的计算。仅在首次访问缓存时才执行,并且每个缓存键的计算方法相同。

  在Callable知道Cacheloader之后,您可能会想:如果我计算不同缓存键的高度方法,我该怎么办!请不要担心,可呼叫可以保护您:

  可以从以下示例中可以看出,当您通话时,您可以通过可调用来为此缓存键提供特殊的缓存值计算方法。

  计算放缓值的逻辑不再由Guava缓存管理,但是呼叫方可以将put(键,值)直接插入缓存值。

  一个残酷的事实是,我们通常没有如此大的记忆来支持缓存,因此我们必须有效地使用昂贵的记忆,也就是说,要及时消除那些未使用的缓存,然后Guava Cache为我们提供了提供的Cache,为我们提供了这些cache。排除机制:基于尺寸排除,缓存时间排除和引用去除。

  根据大小的大小,它不是指缓存大小的职业,而是指高速缓存条的数量。当缓存密钥的数量达到指定的数量时,将根据LRU缓存键消除它。

  在上面的示例中,最大缓存条目将其设置为3,然后又添加了三个缓存项,然后依次进行采访。第二次访问,因为缓存很有价值,因此直接从缓存中读取。。当开始淘汰起始阶段时,此时,请尝试获取我以前从未访问过的键4。恢复缓存的值,谁被淘汰?遵循LRU算法,Key1最近使用的是最不常用的,那么什么消除了键1,可以从我们的第三次访问输出的结果中验证。

  注意:如果在0中传递了最大尺寸,则所有密钥都不会缓存!

  除了最大数量的最大数量指定缓存键外,您还可以通过最大压力指定最大重量,即每个缓存键都需要返回权重。如果所有缓存密钥的重量总和大于我们指定的最大权重,则将执行执行。LRU消除策略:

  这没什么要解释的,请根据输出来考虑它...

  基于时间,Guava缓存提供了两种用于Cachebuilder的方法:ExpiratterAccess(Long,TimeUnit)和ExpireTeaterWrite(Long,TimeUnit)

  顾名思义,当缓存键超过自上次访问以来的指定时间时(读取或写入)时,此缓存键将失败。

  在此示例中,我们将最新访问(或写入)的缓存设置超过3秒钟,并且会失败,并且可以通过输出看到。

  顾名思义,当高速缓存键是在上次编写的(请注意,这是EverateAfcess s之间的区别,即过期,强调写作,不关心阅读)对时间的检查,它将到期并消除:

  同样,应该根据程序和输出来理解它!

  根据报价,有四个主要参考可以消除Java,强,软,虚弱和虚拟的。如果您不知道这些引用,则可以首先阅读本文:Java四引号

  Guava Cache提供了引用的删除策略。看到这一点,您是否想到了线程局部如何防止内存泄漏?如果您不知道,我将继续阅读我帖子上的参考文章。GuavaCache提供了基于参考的三种策略:

  当我们使用弱键()时,番石榴缓存将在弱参考中存储缓存键,然后根据弱参考的定义:当发生垃圾回收时,无论当前系统资源是否足够,弱参考都将被回收。例子:

  基于cachebuilder.weakkeys()的基础,猫必须知道cachebuilder.weakvalues()的角色才能涂上老虎?不改用药物,这次是针对放缓的价值!

  基于Cachebuilder.weakvalues(),Cachebuilder.softvalues()的角色也应该知道比较,您很棒,也就是说,先前的弱参考被软引用代替。与弱参考相比,回收条件很恶劣:当垃圾回收时,只有在系统资源不足时才将其回收!

  积极消除被动消除策略,因此除了被动外,我们还可以主动调用清除缓存的方法。

  有时,缓存灾难性监视设备有时会在缓存未能消除时会做一些好事。目前,我们可以通过cachebuilder.removallistener(removallistener)指定缓存拆卸侦听器。我们的侦听器:

  实际上,当我在实验的最后一部分中删除监视设备时,我发现了一个问题:如果我在缓存失败后不再执行任何操作,则不会调用此缓存监视设备!Guava Cache不会主动清理这些无效的缓存,但是当我们操作缓存时,我们将进行检查,清洁和其他操作。因此,为什么要考虑一下,如果您想采取主动行动来删除它,然后必须有一个后端线程来执行清洁,并且还有一个额外的线程,这意味着它不再是一个单个线程的程序。这无疑会消耗我们的资源并影响性能。不必主动将其删除。当您操作时将其删除为时不晚!

  当然,番石榴缓存还为我们提供了主动清洁方法:cache.cleanup(),然后在此方法之后,是否将主动的清洁操作移交给我们,我们自己权衡了它。

  Cachebuilder提供了用于指定缓存键以重新计算和缓存的refreshafterwrite:

  在此示例中,在我们指定编写缓存键后,我们将刷新超过1秒钟,然后每2秒访问每2秒钟的缓存键,并且我们可以看到每次重新计算时!

  本文通过大量代码案例详细介绍了Guava缓存的使用。当然,您认为它会在这里停止吗?由于空间,本文被使用,接下来将启动本章。我们的目的是吸收这些大型家伙的源代码设计中的本质。