- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想要:当实体因超时到期而被移除时收到通知。
我尝试过: 设置删除监听器。
问题: 删除监听器似乎无法正常工作。它仅在我将新项目放入缓存时起作用(请参见下面的代码)
问题: 如何在不放置新项目的情况下使删除监听器工作?
代码:
我的加载缓存:
LoadingCache<String, Integer> ints = CacheBuilder.newBuilder()
.maximumSize(10000)
.expireAfterAccess(ACCESS_TIMEOUT, TimeUnit.MILLISECONDS)
.removalListener(
new RemovalListener() {
//PROBLEM: THIS METHOD IS NEVER CALLED!!!
public void onRemoval(RemovalNotification notification) {
if (notification.getCause() == RemovalCause.EXPIRED) {
System.out.println("Value " + notification.getValue() + " has been expired");
} else {
System.out.println("Just removed for some reason");
}
}
}
)
.build(
new CacheLoader<String, Integer>() {
public Integer load(String key) throws Exception {
return new Integer(-1);
}
});
我如何在单独的线程中使用缓存:
cache.put("key", 100);
Thread.sleep(ACCESS_TIMEOUT / 2);
System.out.println(cache.getIfPresent(key)); //returns 100
Thread.sleep(ACCESS_TIMEOUT * 5);
//CRUCIAL STRING: cache.put("key2", 200); //invoke removal listener
System.out.println(cache.getIfPresent(key)); //return null
//And again: the problem is that entity has been already expired, but removal listener isn't called untill I add new item to the cache.
P.S:如果你需要,我可以在 GitHub 上分享完整的演示,告诉我
最佳答案
这是因为 Guava 无法确保在超时值到期时自动驱逐这些值。然而,它会在一系列读写操作期间执行此操作。
根据其文档 here :
Caches built with CacheBuilder do not perform cleanup and evict values "automatically," or instantly after a value expires, or anything of the sort. Instead, it performs small amounts of maintenance during write operations, or during occasional read operations if writes are rare.
The reason for this is as follows: if we wanted to perform Cache maintenance continuously, we would need to create a thread, and its operations would be competing with user operations for shared locks. Additionally, some environments restrict the creation of threads, which would make CacheBuilder unusable in that environment.
要在到期时验证您的onRemoval
,请调用cache#cleanUp
就在您的第二次读取操作之前,它应该调用您的 onRemoval
。
关于java - Guava CacheBuilder 不调用移除监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21986551/
这个问题已经有答案了: Spark 1.5.1, Cassandra Connector 1.5.0-M2, Cassandra 2.1, Scala 2.10, NoSuchMethodError
有人可以向我解释如何正确使用 Guava CacheBuilder。 如果数据不可访问,getFromNetwork() 应该引发异常还是返回 null?我应该引发执行异常并使用 guavaCache
从我的应用程序日志中,我觉得在缓存键过期后没有立即调用removeListener。这会在下面的场景中产生问题 缓存配置: SimpleCacheManager simpleCacheManager
我正在尝试创建一个简单的缓存,可以在其中存储 map 中的一些数据元素。我需要将这些数据保留大约 16 小时左右,之后我可以让旧项目过期。我正在实例化我的 LoadingCache: cache =
嗨,我是谷歌 Guava 集合的新手,所以我需要会过期一段时间的集合。所以我编写了以下代码,但它不会在过期时间后删除数据。任何人都可以告诉我代码的问题是什么。 Cache cache = CacheB
我想弄清楚您在 Guava CacheBuilder maximumSize() 中指定的数字代表什么。 假设我的代码中有这样的东西, Cache programCache = CacheBuilde
我想用 Guava CacheBuilder ,但无法找到任何明确的示例来实现这一点。 文档说明了以下代码: LoadingCache graphs = CacheBuilder.newBuilder
请告诉我哪里遗漏了什么。 我在 DataPool 中有一个由 CacheBuilder 构建的缓存。 DataPool 是一个单例对象,各种线程都可以获取其实例并对其进行操作。现在我有一个线程生成数据
我想要:当实体因超时到期而被移除时收到通知。 我尝试过: 设置删除监听器。 问题: 删除监听器似乎无法正常工作。它仅在我将新项目放入缓存时起作用(请参见下面的代码) 问题: 如何在不放置新项目的情况下
我正在尝试使用 Stash 插件的代码片段,但编译器一直给我一个我似乎无法解决的错误。它使用 com.google.common.cache.Cache (Guava) static final R
我已经创建了一个 Guava(一个包含有用的东西的库,几乎可以在任何 Java 项目中使用,包括用于不可变集合、函数式编程、I/O 等等的库)基于 CacheBuilder 的缓存 LoadingC
我目前在我的应用程序中使用 ConcurrentHashMap,但我需要添加在超时期限后有效地使条目过期的功能 (expireAfterWrite),并在删除条目时通知删除监听器。 我看到 Cache
Guava CacheBuilder 只使用一个 JVM。我想使用 CacheBuilder 接口(interface)从 redis 加载数据,然后 redis 依次从 MySQL 加载数据。 我该
我想使用这里推荐的 CacheBuilder: Java time-based map/cache with expiring keys 但是我不明白什么时候 Guava 知道条目会过期。 Guava
我想知道目前是否有一种方法可以使用 Guava MapMaker 或将使用 CacheBuilder 来提供计算缓存是否在最大大小范围内的函数? 看起来目前的驱逐只是基于缓存中的元素数量与 .maxi
我需要获取慢速方法的结果slowResult()对于类 Something 的实例。单独缓存并没有什么帮助,因为实例几乎不会重复。幸运的是,我知道结果实际上只取决于一些容易获得的Attributes的
我有一个方法可以提取大量数据。由于数据集很大且所需的计算量很大,这可能会花费相当多的时间。执行此调用的方法将被多次使用。结果列表每次都应返回相同的结果。话虽如此,我想缓存结果,所以我只需要做一次计算。
我尝试使用 MapMaker/CacheBuilder 制作缓存,但我不明白如何正确处理空值。 ConcurrentMap graphs = new MapMaker() .concu
从昨天开始尝试上传我的应用程序的新版本(仅更改了客户端代码),出现以下异常(应用程序 ID 为“riparautonline-hrd”): Uncaught exception from servle
我不习惯处理 Java 中的软引用和弱引用,但我理解其中的原理,因为我习惯处理像 Gemfire 这样的数据网格,它在内存已满时提供溢出到硬盘功能,可能使用软引用或我猜是类似的东西。 我在 Guava
我是一名优秀的程序员,十分优秀!