2016-11-21 2 views
1

을 확인하기 위해 고정 된 크기 설정/목록을 구현 내가 사용 레디 스 다음 구현하려는 :레디 스는 : 중복

  1. 우리는 들어오는 활동이있다. 각 액티비티마다 고유 한 ID가 있습니다
  2. 들어오는 액티비티가 ID가 중복되어 있는지 확인하고 싶습니다.
  3. 액티비티 ID의 마지막 X 수만 유지하려고합니다. X 번호는 하드 코딩 된 요구 사항이 아닙니다. 여분의 신분증 두 개가 있다는 의미는 문제가되지 않습니다.
  4. 들어오는 각 활동에도 타임 스탬프가 있습니다.

구현 방법을 잘 모릅니다.

  1. 나는 목록을 사용할 수 있습니다 - LPUSHLTRIM를 사용하여 - 나는 고정 된 크기를 유지할 수 있습니다 - 그러나, 나는 쉽게 중복을 검사 할 수 없습니다.
  2. SET - 수신 작업을 처리하기 전에 복제본을 매우 쉽게 확인할 수 있습니다. 그러나 SET의 크기를 제한하는 방법을 잘 모르겠습니다.

어떤 데이터 구조를 사용해야합니까? 그러면 복제본을 쉽게 확인하고 픽스 크기를 유지할 수 있습니다.

나는 StackExchange.Redis 라이브러리를 사용 중입니다.

답변

2

TL; DR 없음 - 대신 정렬 된 집합을 사용하고 요소 (활동 ID) 점수를 타임 스탬프 (예 : Unix epoch)로 설정합니다.

O (N) 복잡도로 수행하기 때문에 목록은 중복을 탐지하기에 좋지 않은 선택입니다. 세트 (실제로, 해시뿐만 아니라 사용할 수 있습니다) 정확한 중복 검출을 위해 완벽하다, 당신은 세트의 카디널리티 (SCARD가) 당신의 X을 초과 할 때마다 count의 YSPOP 전화, 또는 의사 코드 수 :

y = SCARD key - x 
if y > 0 then 
    SPOP key y 
end 

그러나 SPOP은 무작위이며 타임 스탬프가 있다고 언급했습니다. 대부분의 경우 비결정 적이 지 않고 가장 새로운 요소 만 유지함으로써 세트의 크기를 제한하는 것이 더 실용적입니다. 이를 위해서는 정렬 된 집합을 사용하고 ZREMRANGEBYRANK을 사용하면 가장 오래된 활동을 버림으로써 집합의 카디널리티 (ZCARD)를 임의의 X 값으로 유지할 수 있습니다. 순위가 최저에서 최고까지이므로 0 (첫 번째 점수가 가장 낮은 요소)에서 순위 범위를 사용해야합니다. -X (마지막으로 점수가 가장 높은 요소의 X 번째 + 1 요소) 즉 단지 :

ZREMRANGEBYRANK key 0 -x 
+0

소트 세트에서 중복을 어떻게 체크하나요? 활동의 타임 스탬프 또는 실제 활동 ID를 사용하여 확인합니까? @ itamar-haber –

+0

걱정하지 마세요 - ZRANK 또는 ZSCORE를 사용할 수도 있습니다. –

+0

또한 ZCARD를 확인하는 대신 ZRMKYRANK key 0 -X를 사용할 수 있습니다. –