Тип ключа EhCache

#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. нет, ключ передается и сохраняется, поэтому он должен быть сериализуемым