From fbd0feb6e74838cbff7503937118646c4d1acae5 Mon Sep 17 00:00:00 2001 From: Athou Date: Fri, 28 Jun 2013 17:02:29 +0200 Subject: [PATCH] initial entry caching implementation --- .../commafeed/backend/cache/CacheService.java | 31 +++++++++++++++++++ .../backend/feeds/FeedRefreshUpdater.java | 12 ++++++- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/commafeed/backend/cache/CacheService.java 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);