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 JCS、Ehcache、JSR 107、Guava 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