2012-10-31 6 views
2

Play !, play.api.Cache은 싱글 톤 개체이므로 다른 모든 개체에서 전역 적으로 액세스 할 수 있습니다. 그리고 캐시의 특성상 캐시는 변경 가능한 개체입니다. 이와 같이 전역 가변 상태는 일반적으로 매우 문제가 있습니다.Play!를 사용하는 동안 키 충돌을 피하는 방법! 개체 캐시?

특히 키 충돌의 잠재적 인 문제가 있습니다. 다른 두 클래스 (서로 느슨하게 결합 된 클래스)는 실수로 동일한 키를 사용하여 값을 저장할 수 있습니다. 그런 다음 업데이트 중 하나가 다른 업데이트에 의해 무시됩니다.

이 문제에 대한 가능한 해결책 중 하나는 글로벌 클래스 Cache에 위임 할 수 있지만 키에 일종의 "네임 스페이스"를 추가하는 새로운 클래스를 만드는 것입니다. 구현하기가 어렵지는 않지만이 문제에 대한 표준 솔루션이 이미있는 경우 (Play! 자체에서 구현하는 것이 바람직 함) 더 좋을 것입니다. 있어요?

+0

+1하지만 키 이름을 아직 지정하지 않았습니까? 나는 일반적으로 문제의 도메인 + 사용자 ID, 타임 스탬프 등의 다른 고유 한 식별자 뒤에 캐시 키 이름을 지정합니다. 캐시를 지우는 것은 키 접두사로 캐시를 지우는 방법, 더 큰 걱정입니까? 그것은 매우 유용 할 것입니다. – virtualeyes

+0

그냥 제안 : 나는 항상 캐시 키에 대한 컨벤션을 유지하려고 해요 : classname.methodname.additionalparams.moreadds 그것은 화려한 해결책은 아니지만 조금 도움이됩니다. BTW는 여전히 Ehcache'indexes /'search API'를 좀 더 자세히 들여다 볼 시간이 없기 때문에 충돌을 피할 수 있습니다. – biesior

답변

1

가장 간단한 방법은 키에 식별자를 넣는 것입니다. 예를 들어, User 클래스가 주어진 경우 캐시에 저장할 때 "user"+user.id을 키로 사용합니다. 그렇게하면 충돌에 대해 걱정할 필요가 없습니다.

하나의 Play 애플리케이션에서 사용하는 캐시를 고려 중입니다. 기본적으로 EhCache는 Play가 사용하는 것과 동일한 JVM 공간을 사용하므로 두 개의 다른 User 클래스가있을 수 없습니다. 여러 앱이 캐시를 공유하는 외부 캐시를 사용하는 경우 키에 일부 네임 스페이스를 추가해야합니다 (appName.class.classId 또는 이와 유사). 그러나 독립 실행 형 Play 응용 프로그램에서는이 문제가 발생하지 않습니다.

캐시를 비우는 방법에 대한 의견은 대개 걱정할 필요가 없습니다. 이론적으로 장기간의 오래된 키는 사용되지 않아 캐시에서 삭제됩니다. 캐시 구현 (LRU 등)에 따라 어떻게/언제 변경 될 수 있는지에 대한 세부 정보가 있지만 매우 구체적인 제약이없는 한 문제가되어서는 안됩니다.

관련 문제