package ch.elexis.core.data.cache; import java.util.concurrent.TimeUnit; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheStats; import ch.elexis.data.DBConnection; public class MultiGuavaCache<K> implements IPersistentObjectCache<K> { private Cache<K, Object> shortTermCache; private Cache<K, Object> longTermCache; public MultiGuavaCache(long duration, TimeUnit unit){ shortTermCache = CacheBuilder.newBuilder().softValues().recordStats().expireAfterWrite(duration, unit) .build(); longTermCache = CacheBuilder.newBuilder().softValues().recordStats().maximumSize(Long.MAX_VALUE) .build(); } @Override public void put(K key, Object object, int timeToCacheInSeconds){ if (key == null || object == null) return; if (timeToCacheInSeconds <= DBConnection.CACHE_DEFAULT_LIFETIME) { shortTermCache.put(key, object); } else { longTermCache.put(key, object); } } @Override public Object get(K key, int cacheTime){ if (cacheTime <= DBConnection.CACHE_DEFAULT_LIFETIME) { return shortTermCache.getIfPresent(key); } return longTermCache.getIfPresent(key); } @Override public Object get(K key){ Object ret = shortTermCache.getIfPresent(key); if (ret != null) return ret; return longTermCache.getIfPresent(key); } @Override public void remove(K key){ shortTermCache.invalidate(key); longTermCache.invalidate(key); } @Override public void clear(){ shortTermCache.invalidateAll(); longTermCache.invalidateAll(); } @Override public void stat(){ CacheStats shortStats = shortTermCache.stats(); CacheStats longStats = longTermCache.stats(); System.out.println("--------- GUAVA CACHE Statistics ---------"); System.out.println("|>--- SHORT-TERM"); System.out.println("| Hits (count/rate): " + shortStats.hitCount() + " / " + String.format("%.2f%%", shortStats.hitRate() * 100)); System.out.println("| Misses (count/rate): " + shortStats.missCount() + " / " + String.format("%.2f%%", shortStats.missRate() * 100)); System.out.println("|>--- LONG-TERM "); System.out.println("| Hits (count/rate): " + longStats.hitCount() + " / " + String.format("%.2f%%", longStats.hitRate() * 100)); System.out.println("| Misses (count/rate): " + longStats.missCount() + " / " + String.format("%.2f%%", longStats.missRate() * 100)); System.out.println("------------------------------------------"); } @Override public void purge(){ clear(); } @Override public void reset(){ clear(); } }