이 튜토리얼에서는 Redis 데이터 저장소에 키로 저장된 정렬된 집합(Sorted Set) 값에서 최고 점수를 가진 요소를 제거하고 반환하는 방법을 ZPOPMAX와 BZPOPMAX 명령어를 통해 자세히 알아보겠습니다.
ZPOPMAX 명령어란?
ZPOPMAX 명령어는 지정된 키에 저장된 정렬된 집합 값에서 점수가 가장 높은 하나 이상의 요소를 제거하면서 동시에 반환하는 명령어입니다.
이 명령어는 count 인자를 받으며, 이는 정렬된 집합에서 제거할 요소의 총 개수를 의미합니다. count를 지정하지 않으면 기본값인 1이 적용됩니다. 요소가 반환될 때는 가장 높은 점수를 가진 요소가 먼저 나오고, 그다음으로 점수가 낮은 순서대로 이어집니다.
에러 처리 규칙도 중요합니다. 키가 존재하지만 저장된 값이 정렬된 집합 타입이 아니라면 에러가 반환되며, 키 자체가 존재하지 않는 경우에는 nil이 반환됩니다.
문법
redis host:post> ZPOPMAX <keyname> <count>
출력 결과
- (array) reply : 정렬된 집합의 요소와 점수를 나타내는 배열 - (nil) : 키가 존재하지 않는 경우 - Error : 키는 존재하지만 저장된 값이 정렬된 집합 타입이 아닌 경우
실행 예제

BZPOPMAX 명령어란?
BZPOPMAX는 ZPOPMAX의 블로킹(Blocking) 버전입니다. 지정된 정렬된 집합들 중 어디에서도 팝할 요소가 없으면 작업이 차단됩니다. 다시 말해, 지정된 모든 정렬된 집합이 비어 있거나 지정된 모든 키가 존재하지 않을 때 작업이 대기 상태에 들어갑니다.
이 명령어는 지정된 키들을 왼쪽에서 오른쪽 순서로 검사하면서, 처음 발견되는 비어 있지 않은 정렬된 집합에서 최고 점수 요소를 제거하고 반환합니다.
예를 들어 BZPOPMAX set1 set2 set3 0 명령을 실행했을 때, 키 set1이 존재하지 않고(빈 집합으로 간주), set2는 빈 집합이며, set3에 세 개의 요소가 있다면, set1부터 set3까지 검사하는 과정에서 처음으로 비어 있지 않은 집합인 set3에 저장된 정렬된 집합 값에서 최고 점수 요소를 제거하여 반환하게 됩니다.
이 명령어는 timeout(정수) 인자를 받으며, 이는 최대 차단 시간을 초 단위로 나타냅니다. timeout 값을 0으로 설정하면 무기한으로 차단할 수 있습니다.
문법
redis host:post> BZPOPMAX <keyname> [ <keyname> ] <timeout>
출력 결과
- (array) reply : 세 개의 요소가 담긴 배열이 반환됩니다. 첫 번째 요소는 정렬된 집합 키의 이름, 두 번째 요소는 팝된 요소의 점수, 세 번째 요소는 팝된 요소 그 자체입니다. - (nil) : 팝할 요소가 없는 상태로 타임아웃이 만료된 경우
실행 예제

참고 자료
- ZPOPMAX 공식 문서
- BZPOPMAX 공식 문서
지금까지 Redis 데이터 저장소에 저장된 정렬된 집합 값에서 최고 점수 요소를 제거하고 반환하는 방법을 살펴보았습니다. 이 글이 도움이 되었다면 댓글로 의견을 남겨주시고, 주변에도 널리 공유해 주세요!