2009-09-10 6 views
2

Grails 플러그인을 통해 ehcache를 사용하고 있습니다. 캐시에 객체를 추가하는 방법은 직렬화로 키를 필요로하므로 일반적인 용도는 다음과 같습니다캐시 키 생성

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

(부울 PARAM 개체가 분산 또는 로컬 캐시에 추가할지 여부를 나타내는)

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

한 가지 방법은 hashCode()와 equals() 메소드를 제공 키로의 해시 코드를 사용하는 것입니다 :

내 질문은 내가 같은 값 객체에서 생성 키에 대해 이동하는 방법입니다. 이 경우에는 Person 클래스가 Serializable을 구현하도록 만들 필요가 없습니다.

또는 단순히 키로 Person 객체 자체를 사용할 수 있습니다. 그것은 여전히 ​​equals 및 hashCode 메서드를 제공해야하지만 Serializable을 구현해야 할 것처럼 보입니다. 그러나 Person은 다른 Person 인스턴스와 동등 할 수 있기 때문에이 접근법을 사용하면 충돌 가능성이 줄어들 것입니다. 내가 그으로 Ehcache를 믿고있어

는, 그 키가 이미 캐시에 있는지 여부를 확인하기 위해 등호() 키의 방법을 사용이 가정이 맞습니까?

는 방법 중 하나는 다른 것보다 본질적으로 더 이상 설명, 아니면 내가 고려하지 않은 다른 방법이 있나요?

감사합니다, 돈

답변

1

귀하의 hashkey 질문이 직렬화 질문에 대부분 직교한다. 해시 키에 대한 답변으로 Apache Commons HashCodeBuilder를 사용합니다. 그것은 당신을 위해 힘든 일을합니다. equals와 마찬가지로 EqualsBuilder를 사용합니다.

하지만, 해시 코드는 이렇게에만 변경되지 않습니다 그 내부 요소를 해시, 개체의 수명 동안 동일하게 유지해야 기억. 그게 같음의 전화 할게으로

내가 키로 Person 객체를 사용하지 않는 것() 정수 해시 코드를 비교하는 것보다 가능성이 느린 인 키 비교를 확인합니다.

+0

하지만 그건 단지 사람 –

+0

하나의 다른 인스턴스와 동일 할 수 있기 때문에 내가 그 충돌에 대한 걱정, 사람을 사용하는 경우 충돌의 적은 기회도있다 홍보-eoptimization입니다. 최적화 규칙 기억하기 :). 1) 최적화하지 않음, 2) 아직 최적화하지 않음. 둘째, 동일한 해시를 생성하는 두 사람의 가능성은 매우 적습니다. 세 번째로, Person을 키로 사용하려는 경우 등가성 (equals()) 대신 조회를 위해 실제 객체 평등 (==)에 의존하지 않는 한 equals() hashcode()를 구현해야합니다. –

+3

충돌 = 캐시 손상. 부패 = 매우 나쁨. 아주 나쁜 = 최적화하지. 나는 ehcache (그리고 특히 Spring 캐시 추상화 설계)를 다루는 많은 사람들이 분명히 'hashCode (obj1) = hashCode (obj2) = \ => obj1 = obj2'를 잊어 버렸습니다. –