在许多情况下,您可以从应用程序中缓存常用对象中获益,尤其是在 Web 和面向微服务的环境中。您可以在 Java 中执行的最简单的缓存类型可能是引入一个私有 HashMap,您在计算对象之前查询该 HashMap 以确保您不会重复执行该工作。
这是一个例子:
public class PrimeService { private Map<Long, BigInteger> cache = new HashMap<>(); public BigInteger getPrime(long minimum) { return cache.computeIfAbsent(minimum, m -> BigInteger.valueOf(m).nextProbablePrime() ); } }
这是解决问题的快速方法,但遗憾的是效率不高。在人们将各种疯狂的数字输入服务几个月之后,我们将拥有一个非常大的 HashMap,可能会导致我们耗尽内存。
这是解决该问题的快速技巧。您可以使用 LinkedHashMap 并简单地覆盖方法 removeEldestEntry,而不是使用 HashMap。这允许您配置自己的限制功能以防止Map爆炸。
public class PrimeService { public final static int CACHE_MAX_SIZE = 1_000; private Map<Long, BigInteger> cache = new LinkedHashMap<>() { @Override protected boolean removeEldestEntry(Map.Entry<ID, Boolean> eldest) { return size() > PrimeService.CACHE_MAX_SIZE; } }; public BigInteger getPrime(long minimum) { return cache.computeIfAbsent(minimum, m -> BigInteger.valueOf(m).nextProbablePrime() ); } }
我们现在已经成功地限制了缓存,防止它爆炸。添加新条目时将删除旧条目。应该注意的是,此解决方案在小型应用程序中运行良好,但对于更高级的场景,您可能希望改用外部缓存解决方案。如果您有兴趣在 SQL 数据库中缓存条目而不编写大量 SQL 代码,我会推荐 Speedment,因为它是轻量级的并且具有非常流畅的 API。
直到下一次!
标签2: Java教程地址:https://www.cundage.com/article/jcg-quick-tip-prevent-caches-exploding.html