17 Eylül 2020 Perşembe

LoadingCache Arayüzü - Kullanmayın Caffeine Daha İyi

Giriş
Giriş
Şu satırı dahil ederiz
import google.common.cache.LoadingCache;
Cache arayüzünden kalıtır. Açıklaması şöyle.
LoadingCache should be used when you know how to populate it with a given key (the loader can load a value for any key it is invoked with).
Yani bu nesne eğer aranılan nesne kendisinde yoksa bir CacheLoader kullanarak yükler. Dolayısıyla
Bu nesneyi yaratırken kullanılan CacheBuilder sınıfının build() metoduna CacheLoader nesnesi geçilir.

Multi Threaded Kullanım
Açıklaması şöyle
Guava doesn't have an AsyncLoadingCache, but its LoadingCache will discard refresh calls if an existing load for that entry is in-flight. 
constructor
Şöyle yaparız. Burada CacheBuilder sınıfının build() metoduna CacheLoader geçildiği görülebilir.
LoadingCache<String, Integer> cache = CacheBuilder.newBuilder()
  .maximumSize(100000)
  .expireAfterAccess(5, TimeUnit.MINUTES)
  .build(
    new CacheLoader<String, Integer>() {
      public Integerload(String user) {
        return ...;
      }
    }
);
get metodu
Şöyle yaparız
CacheLoader<String, T> loader = new CacheLoader<>() {
  @Override
  public T load(String key) {
    return "...";
  }
};

LoadingCache<String, T> loadingCache = CacheBuilder.newBuilder()
  .expireAfterWrite(expiryDuration, timeUnit)
  .concurrencyLevel(Runtime.getRuntime().availableProcessors())
  .build(loader);

public T get(String key) throws ExecutionException {
  return loadingCache.get(key);
}
getIfPresent metodu
Şöyle yaparız.
LoadingCache<Integer, ConcurrentHashMap<Point, Boolean>> loadingCache = ...;

ConcurrentHashMap<Point, Boolean> points = loadingCache.getIfPresent(...);
if (points == null) {
  ...
}
getUnchecked metodu
CacheLoader sınıfının load() metodunu tetikler.
Örnek
Şöyle yaparız.
LoadingCache<Long, String> myCache = ...;

public String myget(Long key) {
  String v = myCache.getUnchecked(key);
  
  if (v == "INITIAL") {...}
}
refresh metodu
refreshAfterWrite() gibi ayarlar bu metodu tetikler. CacheLoader sınıfının reload() metodunu tetikler. Açıklaması şöyle.
Returns without doing anything if another thread is currently loading the value for {@code key}. If the cache loader associated with this cache performs refresh asynchronously then this method may return before refresh completes.
Yani bir başka thread asenkron olarak refresh() işlemini başlattıysa, yeni bir thread başlatmaz ve mevcut değeri döner. Açıklaması şöyle
It sees another refresh thread is running and it just returns the old data without spawning a new thread.
Örnek
Şöyle yaparız.
LoadingCache<Long, String> myCache = ...;

public String myget(Long key) {
  String v = myCache.getUnchecked(key);

  if (v == "INITIAL") {
    myCache.refresh(key);
    myCache.getUnchecked(key);

  }

  return v;
}


Hiç yorum yok:

Yorum Gönder