diff --git a/src/main/java/com/commafeed/backend/cache/CacheService.java b/src/main/java/com/commafeed/backend/cache/CacheService.java new file mode 100644 index 00000000..73edccb0 --- /dev/null +++ b/src/main/java/com/commafeed/backend/cache/CacheService.java @@ -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 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()); + } +} diff --git a/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java b/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java index 517ef776..c56d2427 100644 --- a/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java +++ b/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java @@ -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 locks; private LinkedBlockingDeque 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);