(источник из здесь .)
Обозначение квадратной скобки позволяет использовать символы, которые нельзя использовать с точечной нотацией:
blockquote>var foo = myForm.foo[]; // incorrect syntax var foo = myForm["foo[]"]; // correct syntax
Во-вторых, обозначения квадратной скобки полезны при работе с именами свойств, которые меняются предсказуемым образом:
blockquote>for (var i = 0; i < 10; i++) { someFunction(myForm["myControlNumber" + i]); }
Roundup:
blockquote>
- Точечная запись быстрее записывается и читается.
- Обозначение квадратной скобки позволяет получить доступ к свойствам, содержащим специальные символы и выбор свойств с использованием переменных
Другим примером символов, которые нельзя использовать с точечной нотацией, являются имена свойств , которые сами содержат точку .
Например, Ответ json может содержать свойство, называемое
bar.Baz
.var foo = myResponse.bar.Baz; // incorrect syntax var foo = myResponse["bar.Baz"]; // correct syntax
Поскольку этот вопрос изначально был задан, библиотека Гуавы Google теперь включает мощный и гибкий кеш. Я бы рекомендовал использовать это.
Ehcache является довольно хорошим решением для этого и имеет возможность просмотреть ( метод getQuiet () ), так что он не обновляет временную метку времени простоя. Внутри Ehcache реализован с набором карт, вроде ConcurrentHashMap, поэтому он имеет аналогичные преимущества параллелизма.
Другой вариант для кэша 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, может быть хорошей альтернативой.
Если вам нужно что-то простое, это соответствовало бы счету?
Map<K, V> myCache = Collections.synchronizedMap(new WeakHashMap<K, V>());
Это не спасет диск, но вы сказали, что хотите просто ...
Ссылки :
(As Adam прокомментировал, синхронизация карты имеет удар производительности. Не сказать, что идея не имеет волосков на ней, но ее хватит как быстрое и грязное решение.)
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)
Попробуйте следующее:
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;
}
}
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
Попробуйте Ehcache ? Это позволяет вам подключать собственные алгоритмы завершения кеширования, чтобы вы могли контролировать свои возможности поиска.
Вы можете сериализоваться на диск, базу данных, через кластер и т. д. ...
Попробуйте @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
Вы можете легко использовать imcache . Пример кода ниже.
void example(){
Cache<Integer,Integer> cache = CacheBuilder.heapCache().
cacheLoader(new CacheLoader<Integer, Integer>() {
public Integer load(Integer key) {
return null;
}
}).capacity(10000).build();
}