我在以下配置中使用咖啡因:
Cache<String, String> cache = Caffeine.newBuilder()
.executor(newWorkStealingPool(15))
.scheduler(createScheduler())
.expireAfterWrite(10, TimeUnit.SECONDS)
.maximumSize(MAXIMUM_CACHE_SIZE)
.removalListener(this::onRemoval)
.build();
private Scheduler createScheduler() {
return forScheduledExecutorService(newSingleThreadScheduledExecutor());
}
我是否正确地假设
onRemoval
方法将在 newWorkStealingPool(15)
ForkJoinPool 上执行,并且只会调用调度程序来查找需要驱逐的过期条目?
意味着事情会是这样的:
newWorkStealingPool(15)
中的每个被逐出的条目执行 onRemoval?我没有找到解释此行为的文档,所以我在这里询问
Tnx
您的假设很接近,只是在实践中稍微优化了一些。
Caffeine.executor
来调用 Cache.cleanUp
。Caffeine.executor
以调用 Cache.cleanUp
(请参阅 #3)。调度程序执行最少量的工作,任何处理都会推迟到执行程序。由于使用 O(1) 算法,维护工作很便宜,因此根据使用活动,维护工作可能经常发生。它针对小批量工作进行了优化,因此计划调用之间强制执行约 1 秒的延迟有助于每次调用捕获更多工作。如果下一个过期事件发生在遥远的将来,那么调度程序在此之前不会运行,尽管调用线程可能会由于其在缓存上的活动而触发维护周期(请参阅#1,2)。