【发布时间】:2018-07-15 11:56:34
【问题描述】:
我将List<CompletableFuture> 存储在Map 中
private final Map<UUID, List<CompletableFuture>> hydrationProcesses = new ConcurrentHashMap<>();
目前有一个守护线程每 30 秒运行一次并删除所有已经完成的Futures。
有很多 TTL 失效实现,我正在寻找基于某些谓词的失效。我想摆脱这个守护线程。
是否有基于某些自定义逻辑的计划缓存失效的开箱即用解决方案。也许我错过了 Spring/Guava 中的某些东西?
可能类似于番石榴的东西
CacheBuilder.newBuilder()
.expireAfterAccess(2,TimeUnit.MILLISECONDS)
.build(loader);
而是在访问后将所有内容标记为已过期,我需要检查此 Future 是否已完成,然后将其从缓存中删除。
【问题讨论】:
-
@pvpkiran 有很多 TTL 失效实现,我正在寻找基于一些谓词的失效。
-
也许使用
expireAfterAccess(30, TimeUnit.SECONDS)和removalListener(removalListener)然后在removalListener检查条目是否仍然有效(未来未完成)并将其重新添加回缓存/映射。 -
您可以使用
CompletableFuture.allOf(...)在期货列表完成后驱逐条目。
标签: java spring multithreading caching guava