2014-04-30 4 views
1

Redis에는 정렬 된 집합이라는 데이터 구조가 있습니다.Redis 정렬 된 집합 (zset)과 동일한 Java 데이터 구조가 있습니까?

인터페이스는 대략 SortedMap의 인터페이스이지만 키가 아닌 값으로 정렬됩니다. 나는 거의 SortedSet으로 할 수 있지만 정적 정렬 값을 가정하는 것 같습니다.

유사한 개념의 표준 Java 구현이 있습니까?

즉시 사용할 수있는 경우는 각 요소에 TTL이있는 세트를 만드는 것입니다. 지도의 가치는 만료 시간이며 만료 된 요소를 주기적으로 제거합니다. 또한 만료 시간을 주기적으로 늘릴 수 있습니다.

+0

java.util.PriorityQueue를 살펴보십시오. 그것은 세트가 아니지만, 요소를 순서대로 정렬하여 가지 치기 쉬워집니다. –

답변

1

그래서 ... 여러 가지.

먼저 어떤 종류의 액세스를 수행할지 결정하십시오. 정렬 된 목록에 액세스하는 것보다 많은 HashMap 작업 (get, put)을 수행하는 경우 HashMap을 사용하고 컬렉션을 정리할 때 값을 정렬하는 것이 좋습니다.

콜렉션을 프 루닝하는 경우 가장 오래된 n 개 항목을 제거하지 않고 시간 소인이 아닌 값을 제거하려는 것처럼 들립니다. 그렇다면 값이 조건을 만족하는지 여부에 따라 HashMap을 필터링하는 것이 좋습니다. 목록을 먼저 정렬 한 다음 이전 항목을 제거하는 것보다 빠릅니다.

1

키와 값의 두 가지 조건이 필요하므로 대용량 데이터에서 최상의 성능을 얻으려면 두 가지 데이터 구조가 필요합니다. 일반 Set을 사용하고 TTL에 의해 정렬 된 PriorityQueue에 동일한 객체를 별도로 삽입 할 수 있습니다. TTL을 부딪 치는 것은 추가적인 TTL을 포함하고있는 객체의 필드에 기술함으로써 수행 될 수있다; 그런 다음 다음 객체를 제거 할 때 추가 TTL이 있는지 확인한 후이 경우 새 TTL 및 추가 TTL = 0으로 다시 채 웁니다. [PriorityQueue에서 제거하는 비용이 O (엔)]. 이것은 다음 객체의 제거를위한 O (log n) 시간을 가져올 것입니다 (범프 된 TTL로 인한 + 이것은 얼마나 자주 발생하는지에 달려 있습니다). 그리고 삽입, O (1) 또는 O (log n) 선택하는 Set의 구현에 따라 TTL.

물론 가장 깨끗한 접근 방법은이 모든 것을 캡슐화하는 새로운 클래스를 디자인하는 것입니다.

또한 데이터 세트가 너무 크지 않은 경우이 모든 것이 과도합니다.

0

ExpiringMap을 살펴보십시오. 구아바의 cache은 유스 케이스에서도 사용할 수 있습니다.

관련 문제