Лучшие предложения для Java Local В кеше памяти [дубликат]

(источник из здесь .)

Обозначение квадратной скобки позволяет использовать символы, которые нельзя использовать с точечной нотацией:

var foo = myForm.foo[]; // incorrect syntax
var foo = myForm["foo[]"]; // correct syntax
blockquote>

Во-вторых, обозначения квадратной скобки полезны при работе с именами свойств, которые меняются предсказуемым образом:

for (var i = 0; i < 10; i++) {
  someFunction(myForm["myControlNumber" + i]);
}
blockquote>

Roundup:

  • Точечная запись быстрее записывается и читается.
  • Обозначение квадратной скобки позволяет получить доступ к свойствам, содержащим специальные символы и выбор свойств с использованием переменных
blockquote>

Другим примером символов, которые нельзя использовать с точечной нотацией, являются имена свойств , которые сами содержат точку .

Например, Ответ json может содержать свойство, называемое bar.Baz.

var foo = myResponse.bar.Baz; // incorrect syntax
var foo = myResponse["bar.Baz"]; // correct syntax

75
задан sanity 22 February 2009 в 21:46
поделиться

9 ответов

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

48
ответ дан IvanRF 25 August 2018 в 18:26
поделиться

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

35
ответ дан Alex Miller 25 August 2018 в 18:26
поделиться
  • 1
    Спасибо, дополнительный вопрос: если я получаю объект из EHcache (скажем, массив) и модифицирую его - будет ли объект обновляться в кеше? то есть. EHCache поддерживает ссылки на объекты? – sanity 22 February 2009 в 21:38
  • 2
    Я так считаю, но, чтобы сделать это безопасно, вы должны, соответственно, заблокировать объект. – Alex Miller 23 February 2009 в 03:49

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

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

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");

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

12
ответ дан cruftex 25 August 2018 в 18:26
поделиться
  • 1
    craftex, если я закрываю приложение, кеш уничтожит все зарегистрированные данные или нет? – Menai Ala Eddine 9 May 2018 в 14:35

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

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

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

Ссылки :

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

16
ответ дан Evan 25 August 2018 в 18:26
поделиться
  • 1
    Синхронизация всей гигантской карты - это огромный штраф. Вы можете легко хранить слабые типы в параллельной карте хэша и периодически удалять их. – Adam Gent 23 February 2011 в 01:11
  • 2
    ConcurrentHashMap лучше, чем Collections.synchronizedMap stackoverflow.com/questions/6692008/… – Pablo Moretti 11 July 2012 в 21:17
  • 3
    Производительность, ConcurrentHashMap абсолютно работает лучше, но не обладает свойствами WeakHashMap, что позволяет сборщику мусора восстанавливать память. Это может быть или не быть важно для вас. – Evan 13 July 2012 в 01:03
  • 4
    Затем используйте ConcurrentHashMap<WeakReference<T>>. [Д0] docs.oracle.com/javase/7/docs/api/java/lang/ref/… – jdmichal 22 September 2016 в 18:23

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

3
ответ дан Heretic Monkey 25 August 2018 в 18:26
поделиться

Попробуйте следующее:

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
ответ дан Serhii Bohutskyi 25 August 2018 в 18:26
поделиться
  • 1
    Проблемы с использованием синхронизированной карты уже обсуждались в других ответах. – sanity 25 March 2013 в 18:00
  • 2
    @sergeyB: Я искал аналогичное решение, которое просто для реализации кеша ... Спасибо – Prakruti Pathik 11 August 2015 в 12:53
  • 3
    public static SimpleCacheManager getInstance() { должен быть public synchronized static SimpleCacheManager getInstance() {, иначе if (instance == null) { не является потокобезопасным. В этом случае вы можете удалить объект монитора вместе, поскольку синхронизация выполняется для всех вызовов getInstance (), см.: javaworld.com/article/2073352/core-java/… – Can Kavaklıoğlu 15 December 2016 в 07:48
  • 4
    Могу ли я рекомендовать использование перечисления для singleton? dzone.com/articles/java-singletons-using-enum – Erk 17 June 2018 в 21:44

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

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

0
ответ дан Stephen 25 August 2018 в 18:26
поделиться

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

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

7
ответ дан yegor256 25 August 2018 в 18:26
поделиться

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

void example(){
    Cache<Integer,Integer> cache = CacheBuilder.heapCache().
    cacheLoader(new CacheLoader<Integer, Integer>() {
        public Integer load(Integer key) {
            return null;
        }
    }).capacity(10000).build(); 
}
9
ответ дан yusufaytas 25 August 2018 в 18:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: