Поиск простого кэша Java в памяти

Я ищу простой Java-кэш памяти, который имеет хороший параллелизм (поэтому LinkedHashMap недостаточно хорош) и периодически может быть сериализован на диск.

Одна из особенностей, которая мне нужна, но которую трудно найти, – это способ «заглянуть» в объект. Под этим я подразумеваю извлечение объекта из кеша, не заставляя кеш удерживать объект дольше, чем в противном случае.

Обновление. Дополнительным требованием, о котором я не упоминал, является то, что мне нужно иметь возможность изменять кэшированные объекты (они содержат массивы с плавающей точкой) на месте.

Кто-нибудь может дать какие-либо рекомендации?

Поскольку этот вопрос изначально был задан, библиотека Google Guava теперь включает мощный и гибкий кеш. Я бы рекомендовал использовать это.

Ehcache – довольно хорошее решение для этого и имеет возможность заглянуть ( getQuiet () – это метод), так что он не обновляет временную метку времени простоя. Внутри Ehcache реализован с набором карт, вроде ConcurrentHashMap, поэтому он имеет аналогичные преимущества параллелизма.

Если вам нужно что-то простое, это будет соответствовать счету?

Map myCache = Collections.synchronizedMap(new WeakHashMap()); 

Это не спасет диск, но вы сказали, что хотите просто …

Ссылки:

  • Collections.synchronizedMap
  • WeakHashMap

(Как заметил Адам, синхронизация карты имеет удар производительности. Не говоря о том, что идея не имеет волосков на ней, но ее хватит как быстрое и грязное решение.)

Еще один вариант для кэша java в памяти – cache2k . Производительность в памяти превосходит EHCache и google guava, см. Страницу benchmarks cache2k .

Схема использования похожа на другие кеши. Вот пример:

 Cache cache = new Cache2kBuilder() {} .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() { @Override public String load(final String key) throws Exception { return ....; } }) .build(); String val = cache.peek("something"); cache.put("something", "hello"); val = cache.get("something"); 

Если у вас есть google guava в качестве зависимости, а затем попробовать кеш guava, это может быть хорошей альтернативой.

Вы можете легко использовать imcache . Ниже приведен пример кода.

 void example(){ Cache cache = CacheBuilder.heapCache(). cacheLoader(new CacheLoader() { public Integer load(Integer key) { return null; } }).capacity(10000).build(); } 

Попробуй это:

 import java.util.*; public class SimpleCacheManager { private static SimpleCacheManager instance; private static Object monitor = new Object(); private Map cache = Collections.synchronizedMap(new HashMap()); 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; } } 

Попробуйте @Cacheable из jcabi-аспектов . С помощью одной annotations вы делаете весь результат метода кэшируемым в памяти:

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

Также прочитайте эту статью: http://www.yegor256.com/2014/08/03/cacheable-java-annotation.html

Как насчет этого: https://commons.apache.org/proper/commons-jcs/ (обновлено до нового адреса, так как JCS теперь находится в Apache Commons)

Попробуйте Ehcache ? Это позволяет вам подключать собственные алгоритмы завершения кеширования, чтобы вы могли контролировать свои возможности поиска.

Вы можете сериализовать на диск, базу данных, через кластер и т. Д. …

  • Как очистить кеш Android
  • Chrome не кэширует изображения / js / css
  • Android: очистить кеш всех приложений?
  • Борьба с кешированием на стороне клиента в Django
  • Есть ли способ удержать страницу от рендеринга, когда человек вышел из системы, но нажал кнопку «назад»?
  • Расseleniumие изображения UIImageNamed: FUD
  • В чем разница между кодом состояния HTTP 200 (кеш) и кодом состояния 304?
  • Что такое кеширование?
  • Размер строки кешей L1 и L2
  • Как удалить кэш других приложений из нашего приложения для Android?
  • Отключение кеширования браузеров для всех браузеров из ASP.NET
  • Interesting Posts
    Давайте будем гением компьютера.