레디스 ZSCAN

Lediseu Zscan



정렬된 집합의 구성원에 대해 반복

아시다시피 Redis 정렬 집합은 각 구성원이 점수 값에 따라 오름차순으로 정렬되는 일반 집합에서 파생됩니다. 둘 이상의 구성원이 동일한 점수 값을 보유하는 경우 사전순으로 정렬됩니다. 일반적으로 ZRANGE 명령을 사용하여 멤버와 점수를 직접 검색할 수 있습니다. 수천 명의 구성원이 있는 큰 정렬 집합이 있는 경우 ZRANGE 명령은 단점인 SMEMBERS 및 KEYS 명령과 같이 오랫동안 서버를 차단할 수 있습니다. 따라서 Redis는 정렬된 집합의 구성원을 반복하기 위해 SCAN 명령에서 파생된 ZSCAN이라는 특수 명령을 제공합니다. ZSCAN 명령은 SCAN 명령을 상속하기 때문에 거의 모든 동작이 범용 SCAN 명령과 동일합니다.







주어진 그림과 같이 SCAN 명령은 커서 기반 반복자입니다. 따라서 Redis 컬렉션의 모든 항목을 제공하려면 하나 이상의 반복이 필요합니다. ZSCAN 명령은 상위 SCAN 명령을 상속하므로 동작은 동일합니다. 이 가이드에서는 ZSCAN 명령의 구문과 사용 사례에 대해 자세히 설명합니다.



ZSCAN 명령

ZSCAN 명령은 0번째 커서로 반복을 시작하는 커서 기반 반복기입니다. 그 후 각 반복에서 다음 명령 호출에 대한 커서로 사용해야 하는 다음 커서와 함께 0개 이상의 정렬된 집합 멤버를 반환합니다. 한 번 이상 반복한 후 반환된 커서가 0이면 스캔 프로세스가 종료되었음을 의미합니다. 이 시점에서 모든 정렬된 집합 구성원이 반환됩니다. 이 프로세스를 전체 반복이라고 합니다. 보시다시피 ZSCAN 명령은 제한된 상태 인식으로 이어지는 커서를 사용하여 상태를 유지합니다. 따라서 ZSCAN 명령에는 다음과 같은 단점이 있습니다.



  • 동일한 요소가 여러 반복에서 반환될 수 있습니다.
  • 스캔 프로세스를 시작할 때 구성원이 없으면 전체 반복 중에 해당 구성원을 반환하지 않을 가능성이 있습니다.

또한 반환된 회원 수에 대한 보장은 없습니다. 경우에 따라 정렬된 집합이 매우 작은 경우 모든 구성원이 첫 번째 반복에서 반환될 수 있습니다. Redis는 최대 항목 수에 도달할 때까지 구성원을 보유하기 위해 특별한 단일 할당 압축 인코딩 형식을 사용하기 때문입니다. ZSCAN 명령은 스캔된 데이터 구조가 해시 테이블로 표시되는 경우에만 커서를 반환할 수 있습니다.





통사론:
ZSCAN 명령은 정렬된 세트 키를 첫 번째 인수로 허용한다는 점을 제외하고는 SCAN 명령과 거의 동일한 구문을 사용합니다. 허용되는 인수가 있는 명령 구문은 다음과 같습니다.

ZSCAN sorted_set_key 커서 [ 매치 패턴 ] [ COUNT 회원_카운트 ]

sorted_set_key : 정렬된 집합의 키입니다.
커서 : 커서 값은 0에서 시작하여 전체 반복인 경우 0에서 끝납니다.



다음 인수는 선택 사항입니다.

성냥 : 각 반복에서 요소를 검색할 때 일치시킬 패턴입니다. 일치하는 멤버만 반환됩니다.
세다 : 각 반복에서 반환될 대략적인 멤버 수입니다.

반복당 반환된 결과 집합에는 몇 가지 요소가 포함됩니다. 첫 번째 부분은 다음 호출로 전달할 커서를 나타내는 64비트 부호 없는 정수입니다. 다음 부분은 구성원 및 관련 점수의 배열입니다.

사용 사례 1 – 온라인 게임의 모든 구성원 및 완료된 임무 검색

온라인 게임 회사가 Redis 정렬 세트를 사용하여 리더보드를 관리한다고 가정해 보겠습니다. 대규모 사용자가 적극적으로 게임을 하고 있기 때문에 각 플레이어와 완료된 임무의 수인 관련 점수를 검색하는 방법이 필요합니다. 서버를 차단하지 않고 검색을 수행하는 것은 필수입니다. 따라서 다음과 같이 ZSCAN 명령을 사용하는 것이 좋습니다.

먼저 일부 플레이어와 완료된 미션 수로 정렬된 세트를 만듭니다.

zadd 리더보드 12 Player6: 존 4 Player2:메리 22 Player1: 파텔 열 다섯 플레이어: 열하나 23 Player5:앤 30 Player7:가혹한 23 Player12:애비 Player13:니키 6 Player9:제레미 7 Player45: 키나

이제 다음과 같이 정렬된 집합의 구성원을 반복할 수 있습니다.

zscan 리더보드 0

산출:

반환된 결과 집합에서 커서 값은 0입니다. 즉, 첫 번째 반복이 끝날 때 모든 구성원이 반환됩니다. 이 경우 구성원 수가 적기 때문에 Redis는 단일 할당 압축 인코딩을 사용하여 이러한 구성원을 나타냅니다. 따라서 최대 팩 크기 또는 구성원 수에 도달할 때까지 명령은 정렬된 집합의 모든 구성원을 반환합니다. 이것을 전체 반복이라고 합니다. 첫 번째 반복이 끝나면 10명의 구성원과 점수를 모두 받기 때문입니다. 수백 명의 구성원이 있는 경우 메모리에 해시 테이블로 표시됩니다. 따라서 모든 멤버를 반환하려면 여러 번 반복해야 합니다.

COUNT 매개변수를 사용하여 반복에서 반환되는 멤버 수를 제한할 수 있습니다. 기본적으로 이 인수는 10으로 설정됩니다. 정렬된 집합이 수백 개의 구성원으로 구성된 경우 메모리에 해시 테이블로 표시됩니다. 따라서 반환되는 멤버의 수는 반복당 약 10개입니다. 정렬된 집합이 너무 작으면 COUNT 인수의 값이 무시됩니다.

사용 사례 2 – 이름이 문자 'J'로 시작하는 플레이어 가져오기

ZSCAN 명령을 사용하여 패턴 일치를 기반으로 반환된 멤버를 필터링할 수 있습니다. 이 경우 MATCH 인수를 지정해야 합니다.

이전 사용 사례와 동일한 예를 사용하겠습니다. 요구 사항은 이름이 문자 'J'로 시작하는 플레이어를 가져오는 것입니다. 게임과 관련된 다음 멋진 기능을 구현하는 것뿐입니다. MATCH 인수는 다음과 같이 지정할 수 있습니다.

zscan 리더보드 0 성냥 * 제이 *

이것은 이상적으로 이름이 Jeremy와 John인 두 멤버를 반환해야 합니다.

결론

요약하면 ZSCAN 명령은 Redis 정렬 집합의 구성원과 점수를 반복하는 데 사용됩니다. 이 명령은 ZSCAN 명령이 첫 번째 인수로 설정 키를 허용한다는 점을 제외하고 SCAN 명령과 동일하게 작동합니다. 사용 사례에서 설명한 것처럼 ZSCAN 명령은 특정 패턴과 일치하는 멤버 및 관련 점수를 검색하고 반복당 반환되는 멤버 수를 제한할 수 있는 MATCH 및 COUNT 인수를 지정하여 다양한 방식으로 사용할 수 있습니다. 전반적으로 ZSCAN 명령은 서버나 클라이언트를 차단하지 않고 정렬된 집합의 구성원을 검색할 때 유용할 수 있습니다.