генерация кеша - PullRequest
       14

генерация кеша

2 голосов
/ 11 сентября 2009

Я использую ehcache (через плагин Grails). Метод, который добавляет объекты в кэш, требует, чтобы ключи были сериализуемыми, поэтому типичное использование:

def key = 22
def someObject = new Object();
cacheService.cache(key, true, someObject)

(логический параметр указывает, должен ли объект быть добавлен в распределенный или локальный кеш)

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

class Person implements Serializable {
  String firstName
  String lastName
  Integer age
}

Один из подходов - предоставить методы hashCode () и equals () и использовать hashCode в качестве ключа. В этом случае мне не нужно было бы делать класс Person реализующим Serializable.

В качестве альтернативы, я мог бы просто использовать сам объект Person в качестве ключа. Кажется, что мне все еще нужно предоставить методы equals и hashCode, но также необходимо реализовать Serializable. Однако при таком подходе вероятность столкновения будет меньше, так как Person может быть равен только другому экземпляру Person.

Я предполагаю, что ehcache использует метод equals () ключа, чтобы определить, существует ли этот ключ в кэше, верно ли это предположение?

Является ли один из подходов, описанных выше, по сути лучше, чем другой, или есть другой подход, который я не рассматривал?

Спасибо, Дон

1 Ответ

1 голос
/ 11 сентября 2009

Ваш вопрос с хэш-ключом в основном ортогональн к сериализуемому вопросу. В ответ на хеш-ключ я бы использовал Apache Commons HashCodeBuilder. Это делает всю тяжелую работу за вас. Аналогично с equals, используйте EqualsBuilder.

Помните, однако, что хеш-коды должны оставаться неизменными на протяжении всего срока службы объекта, поэтому хэшируйте только те внутренние элементы, которые не изменятся.

Я бы не использовал объект Person в качестве ключа, так как он будет вызывать его equals () для проверки сравнения ключей, что, вероятно, медленнее, чем сравнение целочисленного хеш-кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...