gpt4 book ai didi

java - 如何做一个理想的缓存。?

转载 作者:行者123 更新时间:2023-11-30 08:23:30 30 4
gpt4 key购买 nike

在应用程序中,我们使用具有最大大小约束的 LRU(最近最少使用)缓存(并发 HashMap 实现)。我想知道我是否可以提高这个缓存的性能。以下是我在网上找到的几个替代方案。

  • 使用 Google Gauva 池库。(因为我的实现使用 LRU,我看不到 gauva 库有任何好处)
  • 如果我将对象包装为软引用并将其作为值存储在 LRU 映射中(没有任何大小限制),我能看到任何好处吗? (这不是一种理想的缓存方式。在 major gc run 之后,所有的软引用都会被垃圾回收)。
  • 如何使用混合池,它是 LRU 映射 + 软引用映射的组合。(想法是,无论何时从 LRU 映射中修剪对象,它都存储在软引用映射中。通过这种方法,我们可以在缓存中拥有更多的对象。但这种方法可能很耗时。)

有没有其他方法可以提高缓存的性能?

最佳答案

首先,欢迎加入缓存实现者和改进者俱乐部!

不要使用 LRU。有很多算法比 LRU 更好,现在同时超过10岁。首先阅读这些相关的研究论文:

在这些论文中,您还可以找到更多关于自适应缓存概念的基础论文。(例如 2Q、LRFU、LRU-k)。

变形对象:这取决于您想要实现的目标。实际上,缓存条目至少有三个附加对象:哈希表条目、弱引用对象、缓存条目对象。使用这种方法,您会增加内存占用量,并且如果您效率低下,例如由于过期时间短,您有很多 GC 垃圾。

适应可用内存:如果你想适应可用内存,最好在内存变低时驱逐条目。这样你就可以逐出很少使用的条目,而不是随机逐出。然而,这种方法提供了更多的编码。具有自动资源控制的 EHCache 已经实现了类似的东西。

如果您想为缓存使用更多内存但要避免低堆条件,那么引用包装器是一种不错且简单的方法,但就所有内存效率和访问时间而言,它的性能并不高。

测量它!是否获得“性能改进”在很大程度上取决于使用场景。理想情况下,您需要了解并考虑访问模式、缓存对象大小、到期约束和预期的并行性。我整理了一个基准套件,您可以在 GitHub 上找到 cache2k benchmarks .

但是,就目前而言,这些基准仅关注替换策略效率和访问时间。缺少内存开销和可能的并行性的比较。这将以某种方式在半年内添加。基准测试结果可在 cache2k benchmark results 上获得页面。

如果您总体上对该主题感兴趣并在该领域进行了一些研究,请考虑为 cache2k 做出贡献。我特别高兴有更多的基准测试代码,或使用场景的描述和访问模式的痕迹,以优化和改进替换算法。

关于java - 如何做一个理想的缓存。?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23630854/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com