【问题标题】:Cache a set of strings with LRU eviction policy in Java在 Java 中使用 LRU 驱逐策略缓存一组字符串
【发布时间】:2017-07-26 21:25:51
【问题描述】:

我正在尝试以这种方式为一组具有 LRU 驱逐策略的字符串创建缓存。

private static final Boolean PLACEHOLDER = true;
LoadingCache<String, Boolean> scannedIDsCache = CacheBuilder.newBuilder()
        .build(new CacheLoader<String, Boolean>() {
            @Override
            public Boolean load(String key) throws Exception {
                return PLACEHOLDER;
            }
        });

我认为我只使用一个对象作为所有元素的值来节省空间,对吗?你知道任何其他节省空间的方法吗?谢谢。

【问题讨论】:

    标签: java caching memory guava


    【解决方案1】:

    不,你没有节省空间。

    当 JVM* autoboxesboolean 调用 Boolean.valueOf(boolean) 时,它会返回 Boolean.TRUEBoolean.FALSE,它们是 static final Boolean 字段。它不会创建新的Boolean 实例。因此,您定义的 PLACEHOLDER 实际上是对 Boolean.TRUE 的引用,并且是多余的。

    此外,我不会将 Guava 的 Cache 用于 LRU,除非我愿意接受这样一个事实:“缓存可能会驱逐一个条目,因为它最近没有被使用过或经常 "(CacheBuilder.maximumSize(long)强调添加)。

    如果你想要一个直接的 LRU,你可以使用 Collections.newSetFromMap(Map)LinkedHashMap

    Set<String> cache = Collections.newSetFromMap(new LinkedHashMap<String, Boolean>() {
        @Override
        protected boolean removeEldestEntry(Map.Entry<String, Boolean> eldest) {
            return size() > MAX_ENTRIES;
        }
    });
    

    你在哪里定义MAX_ENTRIES


    *注意:理论上,当自动装箱 boolean 原语时,可能会有一些 JVM 实现在运行时不调用 Boolean.valueOf(boolean)(或类似的东西),但如果存在这样的实现,我相当有信心你没有使用它,而且很少有人使用它。来自Boolean(boolean)

    注意:很少使用这个构造函数。除非需要 new 实例,否则静态工厂 valueOf(boolean) 通常是更好的选择。它可能会产生明显更好的空间和时间性能。

    【讨论】:

    • 感谢您的详细回答。所以,我认为我在为参考 PLACEHOLDER 浪费空间。 Guava 的缓存对我来说没问题。除了使用truefalse,我可以使用任何其他对象类型节省更多空间吗?
    • @theeminence Guava Cache 的空间已经很小了。我不知道有什么方法可以进一步减少存储空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2023-03-10
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2014-02-15
    • 2018-02-14
    相关资源
    最近更新 更多