问题标签 [google-guava-cache]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Guava - 缓存表并在该缓存上使用 get 方法
我之前在我的应用程序中实现了缓存,与三个单独的 get 方法一起使用。这些 get 方法是getAllProfiles()
、getProfilesByID()
和getProfileByFields()
。因此,我的代码如下所示:
然而,为了简化我的工作,我需要getAllProfiles()
为整个表创建一个在启动时使用 , 创建的缓存。然后,所有三种方法都将使用这个缓存来处理。
我想我可以重用 loadCache2 的代码来首先创建缓存:
并传入 null 作为大小,因此 DAO 上的 SQL 语句将是“SELECT * FROM Profiles”。问题将来自其他方法;鉴于不同的输入要求,我不知道如何将这些方法指向此缓存。以前有没有人做过这样的事情?
编辑:
正如 Louis Wasserman 所建议的,我正在制作一个将 Object 作为通用键的 Cache 对象。从那里,服务应该使用 if 语句来检测输入对象类型并使用适当的方法来检索缓存的内容,具体取决于所使用的方法。
不过,到目前为止,它在 getAllProfiles 上失败了,出现了一个空指针异常,所以我需要弄清楚这一点。
根据下面的代码,看起来我走在正确的轨道上吗?对于这个对象,我使用的是 Cache 而不是 LoadingCache:
java - Guava 缓存数据加载问题
我在我的应用程序中使用番石榴缓存,它是在休眠平台上编写的。问题是我的缓存在加载数据时无法正常工作。当我删除或添加新数据时,它不会快速更新。
这就是我将数据加载到服务器端的方式,
我也不在数据保存或删除中使用缓存。有人可以解释一下这个问题的原因是什么吗?是番石榴缓存的问题吗?
java - Guava Cache - 刷新时出现 InvalidCacheLoadException
我使用 CacheBuilder 创建了一个缓存。我使用过ExpireAfterWrite 和RefreshAfterWrite。我已经覆盖了缓存加载器加载和重新加载功能。实际上,在重新加载时,我通过创建 ListenableFutureTask 并将其提交给 ExecutorService 来调用加载。下面是我得到的堆栈跟踪 -
警告:刷新期间引发异常 [junit] com.google.common.cache.CacheLoader$InvalidCacheLoadException:CacheLoader 为键 abc 返回 null。[junit] at com.google.common.cache.LocalCache$Segment.getAndRecordStats(Unknown Source) [junit] at com.google.common.cache.LocalCache$Segment$1.run(Unknown Source) [junit] at com.google .common.util.concurrent.MoreExecutors$DirectExecutor.execute(Unknown Source) [junit] at com.google.common.util.concurrent.ImmediateFuture.addListener(Unknown Source) [junit] at com.google.common.cache.LocalCache $Segment.loadAsync(Unknown Source) [junit] at com.google.common.cache.LocalCache$Segment.refresh(Unknown Source) [junit] at com.google.common.cache.LocalCache$Segment.scheduleRefresh(Unknown Source) [junit] 在 com.google.common。
我不知道为什么它不能刷新,它也不能到达 cacheloader.load 。它之前返回null。我很确定我没有在加载函数中返回 null。
示例代码 -
spring - Guava(Spring)中过期后如何刷新缓存中的键和值
因此,我正在研究 Java (Spring) 中的缓存方法。番石榴看起来可以解决这个问题。
这是用例 -
我从远程服务查询一些数据。我的应用程序的配置字段类型。我的应用程序的每个入站请求都将使用此字段。而且每次调用远程服务都会很昂贵,因为它是一种定期更改的常量。
因此,在我的应用程序的第一个入站请求中,当我调用远程服务时,我会缓存该值。我将此缓存的到期时间设置为 30 分钟。30分钟后缓存过期并且有检索密钥的请求,我想要一个回调或其他东西来执行调用远程服务并设置缓存并返回该键的值的操作。
我怎样才能在番石榴缓存中做到这一点?
java - 如何仅根据 Guava 中外部存储的结果缓存一些活动数据?
这是背景:我的外部存储中有 10 亿用户,其中大多数用户每天至少会被访问一次,但只有一些活动数据会被访问得更多。
所以对于番石榴,我可以写:
但是,每次我从外部存储加载时,Guava 都会将对象缓存到内存中。但是由于我有一个非常大的数据集,并且非常不活跃的数据也会被加载到内存中然后超过最大大小,因此真正活跃的数据可能会被淘汰。
所以我希望控制 Guava,告诉它这个数据不打算被缓存,像这样:
是否有可能在 Guava 中实现这个目标?
java - 从 Guava 的缓存中返回 TreeMap 作为值
我有一个如下定义的地图:
我想为它添加驱逐和最大大小属性,就像我们通过 Guava 进行缓存一样。有没有办法通过 Guava 的缓存来处理这个逻辑?我想避免编写自定义代码来处理我的地图的附加属性。
java - 如果达到 maxSize,则跳过 Guava Cache 缓存的元素
如果达到maximumSize,有没有办法不使用Guava Cache 缓存元素?我正在寻找类似于 couchbase 中“不弹出”选项的行为:
如果选择不弹出,则不会弹出现有数据,并且尝试缓存新数据失败。
我希望仅使用“expireAfterAccess”选项清除缓存。