forked from Archives/Athou_commafeed
initial entry caching implementation
This commit is contained in:
31
src/main/java/com/commafeed/backend/cache/CacheService.java
vendored
Normal file
31
src/main/java/com/commafeed/backend/cache/CacheService.java
vendored
Normal 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,6 +20,7 @@ import org.slf4j.Logger;
|
|||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import com.commafeed.backend.MetricsBean;
|
import com.commafeed.backend.MetricsBean;
|
||||||
|
import com.commafeed.backend.cache.CacheService;
|
||||||
import com.commafeed.backend.dao.FeedDAO;
|
import com.commafeed.backend.dao.FeedDAO;
|
||||||
import com.commafeed.backend.dao.FeedEntryDAO;
|
import com.commafeed.backend.dao.FeedEntryDAO;
|
||||||
import com.commafeed.backend.dao.FeedSubscriptionDAO;
|
import com.commafeed.backend.dao.FeedSubscriptionDAO;
|
||||||
@@ -62,6 +63,9 @@ public class FeedRefreshUpdater {
|
|||||||
@Inject
|
@Inject
|
||||||
FeedEntryDAO feedEntryDAO;
|
FeedEntryDAO feedEntryDAO;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
CacheService cache;
|
||||||
|
|
||||||
private ThreadPoolExecutor pool;
|
private ThreadPoolExecutor pool;
|
||||||
private Striped<Lock> locks;
|
private Striped<Lock> locks;
|
||||||
private LinkedBlockingDeque<Runnable> queue;
|
private LinkedBlockingDeque<Runnable> queue;
|
||||||
@@ -167,7 +171,13 @@ public class FeedRefreshUpdater {
|
|||||||
try {
|
try {
|
||||||
locked = lock.tryLock(1, TimeUnit.MINUTES);
|
locked = lock.tryLock(1, TimeUnit.MINUTES);
|
||||||
if (locked) {
|
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;
|
success = true;
|
||||||
} else {
|
} else {
|
||||||
log.error("lock timeout for " + feed.getUrl() + " - " + key);
|
log.error("lock timeout for " + feed.getUrl() + " - " + key);
|
||||||
|
|||||||
Reference in New Issue
Block a user