#java #ehcache
#java #ehcache
Вопрос:
В EhCache при добавлении элемента в кэш :
cache.put(new Element("key1", "value1"));
// Element constructors :
Element(Object key, Object value)
Я вижу, что могу указать Object
в качестве индекса ключа.
Как я могу использовать это, чтобы иметь «сложный» ключ, состоящий из нескольких int: (userId,siteId,...)
вместо строки в качестве индекса?
Спасибо
Комментарии:
1. Это отличный вопрос. Как создать многомерный ключ для кэша или карты. Ответ ниже @Bozho более или менее правильный, за исключением объединения строк. Вы потратили бы меньше времени на создание нового объекта, и он, скорее всего, был бы меньше, поскольку у вас не было бы (по приблизительной оценке) почти 5 неявных строк, созданных этой конкатенацией (идентификатор пользователя в строку, встроенный «:», конкатенация идентификатора пользователя «:», SiteID в строку, новая строка, конкатенация предыдущей строки SiteID str).
Ответ №1:
Оберните его в новый класс:
public class CacheKey implements Serializable {
private int userId;
private int siteId;
//override hashCode() and equals(..) using all the fields (use your IDE)
}
И затем (при условии, что вы определили соответствующий конструктор):
cache.put(new Element(new CacheKey(userId, siteId), value);
Для простых случаев вы можете использовать конкатенацию строк:
cache.put(new Element(userId ":" siteId, value));
Комментарии:
1. Конкатенация строк для меня не самая лучшая, потому что мне нужен минимально возможный объем памяти (много-много записей). С
Serializable
смогу ли я получить самый легкий / короткий ключ из возможных? Как EhCache собирается использовать объект Key? Спасибо2. размер не будет проблемой, не волнуйтесь. ehcache получит хэш объекта (следовательно, вы должны переопределить хэш-код со всеми включенными полями)
3. Извините, что воскрешаю, но нужно ли это реализовывать
Serializable
?Comparable<CacheKey>
Было бы достаточно?4. нет, ключ передается и сохраняется, поэтому он должен быть сериализуемым