Cache Java Method Results

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

假设你有一个需要执行时间的方法,并希望将其结果缓存起来。有很多解决方案,包括Apache Commons JCSEhcacheJSR 107Guava Caching等等。

jcabi-aspects提供了一个非常简单的解决方案,基于AOP切面和Java6注解。

load() 方法的结果将在内存中缓存五分钟。

这篇关于AOP、AspectJ和方法日志记录的帖子解释了”切面织入”的工作原理(我强烈建议您先阅读它)。

在这里,我将解释缓存的工作原理。

这种方法非常直接。有一个静态哈希映射表,键是”方法坐标”,值是它们的结果。方法坐标由对象、方法的所有者和带有参数类型的方法名组成。

在上面的示例中,在load()方法完成后,映射表会增加一个新的条目(当然是简化示例):

每次连续调用load()都会被来自jcabi-aspects的切面拦截,并立即从缓存映射中解析一个值。该方法在其生命周期结束之前不会获得任何控制权,以上示例中为五分钟。

有时在缓存的生命周期结束之前刷新缓存的能力是必要的。以下是一个实际的例子:

很明显,在执行add()方法后,数据库中的员工数量将不同,并且size()的结果应该在缓存中无效。这个无效操作被称为“刷新”,而 @Cacheable.FlushBefore 触发它。

实际上,对 add() 的每次调用都会使该类中所有缓存方法无效,而不仅仅是 size()

还有 @Cacheable.FlushAfter。不同之处在于 FlushBefore 确保在方法 add() 开始时缓存已经无效。而 FlushAfter 在方法 add() 完成后无效缓存。这个小差别有时会产生很大的影响。

本文解释了 如何将 jcabi-aspects 添加到您的项目中

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-28 at 14:36

sixnines availability badge   GitHub stars