Szukam simple Java in-memory cache [zamknięty]

Szukam prostego Cache ' a Javy w pamięci, który ma dobrą współbieżność (więc LinkedHashMap nie jest wystarczająco dobry), i który może być okresowo serializowany na dysk.

Jedną z funkcji, której potrzebuję, ale która okazała się trudna do znalezienia, jest sposób na "Podglądanie" obiektu. Przez to mam na myśli odzyskanie obiektu z pamięci podręcznej bez powodowania, że pamięć podręczna trzyma się obiektu dłużej, niż w przeciwnym razie miałoby to miejsce.

Update: dodatkowym wymogiem, o którym zapomniałem wspomnieć jest to, że trzeba umieÄ ‡ modyfikowaÄ ‡ buforowane obiekty (zawierajÄ ... tablice float) na miejscu.

Czy ktoś może podać jakieś zalecenia?

Author: sanity, 2009-02-22

9 answers

Ponieważ to pytanie zostało pierwotnie zadane, Biblioteka Guava Google zawiera teraz potężną i elastyczną pamięć podręczną. Polecam korzystanie z tego.

 48
Author: sanity,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-26 15:31:58

Ehcache jest całkiem dobrym rozwiązaniem i ma sposób na Podglądanie (getQuiet () jest metodą) tak, że nie aktualizuje znacznika czasu bezczynności. Wewnętrznie Ehcache jest zaimplementowany z zestawem map, podobnie jak ConcurrentHashMap, więc ma podobne korzyści dla współbieżności.

 35
Author: Alex Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-22 20:17:01

Jeśli potrzebujesz czegoś prostego, czy to pasuje do rachunku?

Map<K, V> myCache = Collections.synchronizedMap(new WeakHashMap<K, V>());

Nie zapisuje się na dysku, ale mówiłeś, że chcesz prostego...

Linki:

(Jak skomentował Adam, synchronizacja mapy ma hit wydajności. Nie mówiąc, że pomysł nie ma włosów na nim, ale wystarczy jako szybkie i brudne rozwiązanie.)

 16
Author: Evan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 08:18:04

Inną opcją dla pamięci podręcznej java jest cache2k . Wydajność w pamięci jest lepsza niż EHCache i google guava, patrz strona cache2k benchmarki .

Wzór użycia jest podobny do innych pamięci podręcznych. Oto przykład:

Cache<String,String> cache = new Cache2kBuilder<String, String>() {}
  .expireAfterWrite(5, TimeUnit.MINUTES)    // expire/refresh after 5 minutes
  .resilienceDuration(30, TimeUnit.SECONDS) // cope with at most 30 seconds
                                          // outage before propagating 
                                          // exceptions
  .refreshAhead(true)                       // keep fresh when expiring
  .loader(new CacheLoader<String, String>() {
    @Override
    public String load(final String key) throws Exception {
      return ....;
    }
  })
  .build();
String val = cache.peek("something");
cache.put("something", "hello");
val = cache.get("something");

Jeśli masz Google guava jako zależność, wypróbuj guava cache, może być dobrą alternatywą.

 13
Author: cruftex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-09 10:31:12

Możesz łatwo użyć imcache . Przykładowy kod znajduje się poniżej.

void example(){
    Cache<Integer,Integer> cache = CacheBuilder.heapCache().
    cacheLoader(new CacheLoader<Integer, Integer>() {
        public Integer load(Integer key) {
            return null;
        }
    }).capacity(10000).build(); 
}
 9
Author: yusufaytas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-16 20:38:30

Spróbuj tego:

import java.util.*;

public class SimpleCacheManager {

    private static SimpleCacheManager instance;
    private static Object monitor = new Object();
    private Map<String, Object> cache = Collections.synchronizedMap(new HashMap<String, Object>());

    private SimpleCacheManager() {
    }

    public void put(String cacheKey, Object value) {
        cache.put(cacheKey, value);
    }

    public Object get(String cacheKey) {
        return cache.get(cacheKey);
    }

    public void clear(String cacheKey) {
        cache.put(cacheKey, null);
    }

    public void clear() {
        cache.clear();
    }

    public static SimpleCacheManager getInstance() {
        if (instance == null) {
            synchronized (monitor) {
                if (instance == null) {
                    instance = new SimpleCacheManager();
                }
            }
        }
        return instance;
    }

}
 8
Author: Serhii Bohutskyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-25 15:03:29

Spróbuj @Cacheable z jcabi-aspekty. Za pomocą jednej adnotacji cały wynik metody można buforować w pamięci:

public class Resource {
  @Cacheable(lifetime = 5, unit = TimeUnit.SECONDS)
  public String load(URL url) {
    return url.openConnection().getContent();
  }
}

Przeczytaj również ten artykuł: http://www.yegor256.com/2014/08/03/cacheable-java-annotation.html

 7
Author: yegor256,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-12 15:17:15

A może tak: https://commons.apache.org/proper/commons-jcs / (zaktualizowany do nowego adresu, ponieważ JCS jest teraz w Apache Commons)

 3
Author: TofuBeer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-23 23:29:47

Try Ehcache ? Pozwala na podłączenie własnych algorytmów buforowania, dzięki czemu można kontrolować funkcjonalność peek.

Możesz serializować na dysk, bazę danych, przez klaster itp...

 0
Author: Stephen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-22 20:17:52