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?
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.
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.
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.)
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ą.
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();
}
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;
}
}
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
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)
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...
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