initial entry caching implementation

This commit is contained in:
Athou
2013-06-28 17:02:29 +02:00
parent 25bc35ef14
commit fbd0feb6e7
2 changed files with 42 additions and 1 deletions

View File

@@ -0,0 +1,31 @@
package com.commafeed.backend.cache;
import java.util.concurrent.TimeUnit;
import com.commafeed.backend.model.Feed;
import com.commafeed.backend.model.FeedEntry;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
public class CacheService {
Cache<String, Marker> entryCache = CacheBuilder.newBuilder()
.maximumSize(1000000).expireAfterWrite(24, TimeUnit.HOURS).build();
private static enum Marker {
INSTANCE
}
public boolean hasFeedEntry(Feed feed, FeedEntry entry) {
return entryCache.getIfPresent(buildKey(feed, entry)) == Marker.INSTANCE;
}
public void putFeedEntry(Feed feed, FeedEntry entry) {
entryCache.put(buildKey(feed, entry), Marker.INSTANCE);
}
private String buildKey(Feed feed, FeedEntry entry) {
return String.format("%s:%s:%s", feed.getId(), entry.getGuid(),
entry.getUrl());
}
}

View File

@@ -20,6 +20,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.commafeed.backend.MetricsBean;
import com.commafeed.backend.cache.CacheService;
import com.commafeed.backend.dao.FeedDAO;
import com.commafeed.backend.dao.FeedEntryDAO;
import com.commafeed.backend.dao.FeedSubscriptionDAO;
@@ -62,6 +63,9 @@ public class FeedRefreshUpdater {
@Inject
FeedEntryDAO feedEntryDAO;
@Inject
CacheService cache;
private ThreadPoolExecutor pool;
private Striped<Lock> locks;
private LinkedBlockingDeque<Runnable> queue;
@@ -167,7 +171,13 @@ public class FeedRefreshUpdater {
try {
locked = lock.tryLock(1, TimeUnit.MINUTES);
if (locked) {
feedUpdateService.updateEntry(feed, entry, subscriptions);
if (!cache.hasFeedEntry(feed, entry)) {
log.info("cache miss for {}", entry.getUrl());
feedUpdateService.updateEntry(feed, entry, subscriptions);
cache.putFeedEntry(feed, entry);
} else {
log.info("cache hit for {}", entry.getUrl());
}
success = true;
} else {
log.error("lock timeout for " + feed.getUrl() + " - " + key);