0

Java、Guava 或其他可以执行以下操作的库中是否有可用的 Cache 实现:

  • 具有自动过期项目的键、值缓存。修改该值会重新启动到期计时器。每个键/值对分别过期(有自己的计时器)。
  • 可以手动添加项目,例如,cache.put(key, value);

我见过 Guava LoadingCache,但该实现需要您实现该load(key)方法。该load(key)方法旨在通过使用数据库或其他资源基于键计算值。一旦通过该load(key)方法计算出该值,我相信LoadingCache会将结果(键,值)对粘贴在缓存中。

我的实现要求与我的不同,LoadingCache因为我的键将保持固定,但相应的值将在我抓取数据库时缓慢更新。换句话说,我不想像 LoadingCache 在它的load(key)方法中那样一次加载整个值——我想保持键不变,并根据我从数据库中获得的内容增量更新值 Object。因此,这似乎排除了使用,LoadingCache因为该load(key)方法会强制您一次加载键的相应值。

我想要增量加载值(对于每个键)的原因是因为它需要很长时间,并且我使用 AJAX 轮询来保持用户更新。因此,一次加载它是没有用的。我想缓存这些值,以便可以使用 AJAX 轻松检索它们。我希望它们过期,因为一旦用户完成访问网页,它们就没有用了。

4

2 回答 2

1

JCS支持空闲时间过期和手动添加

于 2013-04-09T19:51:42.937 回答
1

按照@Louis Wasserman 的建议,我实现了以下代码:

LoadingCache<String, WorkerItem> cache = CacheBuilder.newBuilder()
.concurrencyLevel(level) 
.maximumSize(size)
.expireAfterWrite(seconds, TimeUnit.SECONDS)
.removalListener(this)
.build(
    new CacheLoader<String, WorkerItem>() {
        public WorkerItem load(String key) throws Exception {
            WorkerItem workerItem = new MoreSpecificWorkerItem();
            workerItem.setTask(key);
            Controller.beginWorking(workerItem); //Runs in thread pool
            return workerItem;
        }
    }
);

当用户在 Cache 上调用 get() 时,它将立即返回WorkerItem并在后台填充它。只要您WorkerItem使用isFinished()方法或类似方法实现,就可以知道它何时可以使用。

而且我实施了清理服务,因为缓存不会定期删除过期项目。过期的项目只是简单地标记为脏,并在您下次访问它们或下次调用清理时被删除。

final Runnable doCleanup = new Runnable() {
    public void run() { 
        LoadingCache<K, V> cache = getCache();
        cache.cleanUp();
        }
    }

ScheduledFuture<?> cleanupHandle = scheduler.scheduleAtFixedRate(doCleanup, 1, 1, TimeUnit.MINUTES);
return cleanupHandle;
于 2013-04-19T16:11:24.963 回答