将Guava缓存用作基于时间的驱逐图

问题描述 投票:0回答:1

我基本上需要一个映射,在该映射中,条目将在特定的已知时间段后到期,然后将其删除。在我的应用程序中使用它的方式实际上不是缓存,但是Guava缓存似乎可以达到目的。这是正确的选择吗?一件事是,我将需要查询地图是否为空,并且我发现Guava仅具有size函数,其文档说这只是一个近似值。

java guava
1个回答
0
投票

您可以为此目的使用番石榴。请注意有关清除的注意事项,如文档here(在下面复制)中所述。

使用CacheBuilder构建的缓存不执行清除和逐出值“自动”或值过期后立即进行,或排序。相反,它会在执行期间进行少量维护写操作,或者在偶尔的读操作期间(如果写)罕见。

原因如下:如果我们要执行缓存持续维护,我们需要创建一个线程,操作将与用户操作争夺共享锁。此外,某些环境会限制线程的创建,这会使CacheBuilder在该环境中无法使用。

相反,我们将选择权交给您。如果您的缓存是高吞吐量,那么您不必担心执行缓存维护以清理过期的条目等。如果您的缓存确实很少写入,并且您不希望清理阻止缓存阅读,您可能希望创建自己的维护线程来调用定期按Cache.cleanUp()。

[如果您要为某个缓存计划定期维护,只有很少有写,只是安排使用ScheduledExecutorService。

关于检查尺寸点,您正确地认为size()是近似值。如果在条目无效时需要执行某些操作,则应使用removalListener功能。现在复制了documentation中的相关示例代码。

CacheLoader<Key, DatabaseConnection> loader = new CacheLoader<Key, DatabaseConnection> () {
  public DatabaseConnection load(Key key) throws Exception {
    return openConnection(key);
  }
};
RemovalListener<Key, DatabaseConnection> removalListener = new RemovalListener<Key, DatabaseConnection>() {
  public void onRemoval(RemovalNotification<Key, DatabaseConnection> removal) {
    DatabaseConnection conn = removal.getValue();
    conn.close(); // tear down properly
  }
};

return CacheBuilder.newBuilder()
  .expireAfterWrite(2, TimeUnit.MINUTES)
  .removalListener(removalListener)
  .build(loader);
© www.soinside.com 2019 - 2024. All rights reserved.