Я ищу простой Java-кеш в памяти, который имеет хороший параллелизм (поэтому LinkedHashMap недостаточно хорош) и который можно периодически сериализовать на диск.
Одна функция, которая мне нужна, но которую оказалось трудно найти, - это способ «взглянуть» на объект. Под этим я подразумеваю получение объекта из кеша, не заставляя кеш удерживать объект дольше, чем в противном случае.
Обновление: дополнительное требование, о котором я забыл упомянуть, заключается в том, что мне нужно иметь возможность изменять кэшированные объекты (они содержат массивы с плавающей запятой) на месте.
Кто-нибудь может дать какие-либо рекомендации?
Ответы:
Поскольку этот вопрос был задан изначально, библиотека Google Guava теперь включает мощный и гибкий кеш. Я бы рекомендовал использовать это.
источник
Ehcache - довольно хорошее решение для этого и имеет способ заглянуть ( метод getQuiet () ), чтобы он не обновлял временную метку простоя. Внутри Ehcache реализован с помощью набора карт, вроде ConcurrentHashMap, поэтому он имеет аналогичные преимущества параллелизма.
источник
Если вам нужно что-то простое, будет ли это отвечать всем требованиям?
Это не будет сохраняться на диск, но вы сказали, что хотите простого ...
Ссылки:
(Как прокомментировал Адам, синхронизация карты снижает производительность. Не говоря уже о том, что у этой идеи нет проблем, но было бы достаточно быстрого и грязного решения.)
источник
ConcurrentHashMap<WeakReference<T>>
. docs.oracle.com/javase/7/docs/api/java/lang/ref/…Другой вариант для java-кеша в памяти - cache2k . Производительность в памяти превосходит EHCache и google guava, см. Страницу тестов cache2k .
Схема использования аналогична другим кешам. Вот пример:
Если у вас есть зависимость от google guava, хорошей альтернативой может быть проверка кеша guava.
источник
Вы можете легко использовать imcache . Пример кода ниже.
источник
Попробуй это:
источник
public static SimpleCacheManager getInstance() {
должно бытьpublic synchronized static SimpleCacheManager getInstance() {
иначеif (instance == null) {
не является потокобезопасным. В этом случае вы можете удалить объект монитора все вместе, поскольку синхронизация выполняется для всех вызовов getInstance (), см .: javaworld.com/article/2073352/core-java/…Попробуйте
@Cacheable
из jcabi-аспектов . С помощью одной аннотации вы делаете весь результат метода кешируемым в памяти:Также прочтите эту статью: http://www.yegor256.com/2014/08/03/cacheable-java-annotation.html
источник
Как насчет этого: https://commons.apache.org/proper/commons-jcs/ (обновлено на новый адрес, поскольку JCS теперь находится в Apache Commons)
источник
Попробуйте Ehcache ? Он позволяет вам подключать собственные алгоритмы истечения срока действия кеширования, чтобы вы могли контролировать свои функции просмотра.
Вы можете сериализовать на диск, в базу данных, в кластере и т. Д.
источник