Computer >> 컴퓨터 >  >> 프로그래밍 >> Redis

Redis RPOPLPUSH·BRPOPLPUSH 완벽 가이드: 한 목록에서 다른 목록으로 요소 이동하기

이 튜토리얼에서는 Redis 데이터 저장소에서 한 키에 저장된 리스트 값의 마지막 요소를 제거하고 반환한 뒤, 그 요소를 다른 키에 저장된 리스트 값의 첫 번째 위치에 삽입하는 방법을 알아봅니다. 이를 위해 Redis의 RPOPLPUSHBRPOPLPUSH 명령어를 사용합니다.

RPOPLPUSH 명령어란?

RPOPLPUSH 명령어는 소스 키에 저장된 리스트 값의 꼬리(마지막)에서 요소를 제거하고 반환한 후, 동일한 요소를 대상 키에 저장된 리스트 값의 머리(앞)에 삽입하는 역할을 합니다.

  • 소스 키가 존재하지 않는 경우: nil 값이 반환되며 아무 작업도 수행되지 않습니다.
  • 대상 키가 존재하지 않는 경우: 삽입 작업 전에 빈 리스트로 자동 생성됩니다.
  • 소스 키와 대상 키가 같은 경우: 리스트 요소를 회전(rotating)시키는 것과 동일한 효과를 냅니다.

참고: Redis 6.2부터 RPOPLPUSH는 더 유연한 LMOVE 명령어로 대체되었지만, 기존 코드 호환성을 위해 여전히 지원됩니다.

구문

redis host:port> RPOPLPUSH <source-key> <destination-key>

반환값

- (string) : 소스 리스트에서 팝(pop)된 요소
- (nil)    : 소스 키가 존재하지 않는 경우
- Error    : 키가 존재하지만 저장된 값이 리스트가 아닌 경우

예제

Redis RPOPLPUSH·BRPOPLPUSH 완벽 가이드: 한 목록에서 다른 목록으로 요소 이동하기

BRPOPLPUSH 명령어란?

BRPOPLPUSH는 RPOPLPUSH의 블로킹(blocking) 버전입니다. 소스 리스트에서 팝할 요소가 없으면, 즉 소스 키의 리스트가 비어 있거나 소스 키 자체가 존재하지 않으면 연결이 차단됩니다.

블로킹 해제 조건

  • 다른 클라이언트가 LPUSH, RPUSH, LINSERT 등의 명령어로 소스 리스트에 새 요소를 삽입하면, 차단되었던 클라이언트가 해제되어 RPOPLPUSH 작업을 수행합니다.
  • 0이 아닌 타임아웃이 지정된 상태에서 소스 키에 대한 삽입 작업 없이 타임아웃이 만료되면, 클라이언트는 null(nil) 값을 받으며 차단이 해제됩니다.

타임아웃 인수는 차단 상태로 대기할 최대 시간(초)을 나타내는 정수 값이며, 0을 지정하면 무기한 대기합니다.

참고: BRPOPLPUSH 역시 Redis 6.2부터 BLMOVE 명령어로 대체되었습니다.

구문

redis host:port> BRPOPLPUSH <source-key> <destination-key> <timeout>

반환값

- (string) : 소스 리스트에서 팝된 요소
- (nil)    : 팝할 요소가 없고 타임아웃이 만료된 경우

예제

Redis RPOPLPUSH·BRPOPLPUSH 완벽 가이드: 한 목록에서 다른 목록으로 요소 이동하기

활용 사례

RPOPLPUSH 계열 명령어는 특히 작업 큐(task queue) 구현에 널리 사용됩니다. 워커(worker)가 처리 중인 작업을 별도의 백업 리스트에 보관함으로써, 워커가 비정상 종료되더라도 작업을 복구할 수 있는 신뢰성 있는 큐 패턴을 만들 수 있습니다.

참고 자료

  1. RPOPLPUSH 명령어 공식 문서
  2. BRPOPLPUSH 명령어 공식 문서

이 글이 도움이 되었다면 댓글로 의견을 남겨주시고, 주변에도 공유해 주세요!

<- 리스트(List) 명령어 목록으로 돌아가기