Redis 자료구조 : Hash Collection

장민근·2025년 1월 21일
0

Redis

목록 보기
5/14

Redis 자료구조 : Hash Collection

Redis의 Hash는 하나의 키 아래 여러 필드와 값을 구성할 수 있는 데이터 구조이다. 이는 RDB의 테이블에서 여러 컬럼과 비슷한 역할을 하지만, 컬럼 갯수에 제한이 있는 RDB와 달리, Redis Hash는 최대 40억 개의 필드와 값을 저장할 수 있다고 한다.

1. Hash란?

Redis에서 Hash는 특정 키(key)에 대해 필드(field)와 값(value) 쌍으로 데이터를 저장하는 구조이다. 간단한 키-값 구조보다 복잡한 데이터를 효율적으로 저장하고 접근하는 데 유용하다.

2. Redis Hash 명령어

주요 명령어

1. MSET / HMSET

  • 여러 필드와 값을 한 번에 저장한다.
    성능적인 이점을 얻으려면 여러 필드를 동시에 설정하도록 활용하는 것이 좋다.
> HMSET user:1 name John age 30 email john@example.com
OK

2. HGET

  • 특정 필드의 값을 가져온다.
> HGET user:1 email
"john@example.com"

3. HMGET

  • 여러 필드의 값을 동시에 가져온다.
> HMGET user:1 name email
1) "John"
2) "john@example.com"

4. HSCAN

  • 해시 안의 필드와 값을 스캔한다. 페이징 처리가 가능하다.
> HSCAN user:1 0
1) "12345"              # 스캔 포인터 (계속해서 추가 데이터를 조회할 수 있는 포인터)
2) 1) "name"            # 필드
   2) "John"            # 해당 필드의 값

> HSCAN user:1 12345
1) "0"                 # 스캔 포인터, "0"이면 더 이상 스캔할 항목이 없음
2) 1) "age"            # 추가된 필드
   2) "30"             # 해당 필드의 값

   
   /* 
  간단하게 강의를 듣고 한 Key 에대한 Value를 Paging 처리를 통해 
  결과 값을 반환한다는데 어떤 원리로 Paging이 되는지 궁긍하여 한 번 찾아보았다. 

  페이징 처리 방식의 핵심:

  스캔 포인터: HSCAN 명령은 내부적으로 스캔 포인터를 사용하여 데이터를 여러 번 나누어 반환한다. 
  사용자가 명시적으로 "몇 개씩 반환할지"를 설정하는 것이 아니라,
  Redis가 자동으로 데이터의 일부분을 반환하며, 
  남은 데이터를 추출하려면 그 다음 스캔 포인터를 사용해야 한다.

  그러나 사용자가 아예 지정할 수 없는건 아니다. 
  Count를 사용한다면 사용자가 어느정도 컨트롤을 할 수는 있다.
  주의해야 할 점은, 조회되는 Field의 수는 Count의 수와 매번 일치히지는 않는다는 점이다.
  이는 Redis 내부에서 처리시간을 고려하여 갯수를 조절하기 때문이라고한다. 
   */
  
> HSCAN user:1 0 COUNT 2
1) "12345"              # 스캔 포인터
2) 1) "name"
   2) "John"
   3) "age"
   4) "30"
   

5. HEXISTS

  • 특정 필드가 존재하는지 확인한다.

  • 필드가 존재하면 특정 로직을 실행하지 않고, 없다면 로직 실행 후 데이터를 설정하는 데 유용하다. 이 접근은 네트워크 및 메모리 효율성을 높인다.

> HEXISTS user:1 email
1

6. HKEYS

  • 모든 필드를 반환한다.
> HKEYS user:1
1) "name"
2) "age"
3) "email"

3. HKEYS 사용 시 주의 사항

Redis는 일단 싱글 스레드 기반이기 때문에 동시에 단 하나의 작업만 가능하다.

예를 들어, Hkeys 작업이 대규모 데이터를 처리하는 동안 다른 작업들은 대기를 하게 된다.
근데 만약 대용량 데이터에 대해서 와일드카드까지 적용하여 모든 키값을 가져오게 된다면, Redis가 아무리 빠르다고 해도 키 값들이 몇십억개인 경우, 해당 작업이 완료될 때 까지 다른 Redis가 작업을 받을 수가 없게된다. ( 즉, 병목 현상이 발생하게 된다. )

보통 Redis는 클러스터 형태로서 여러 개가 사용이 되겠지만 기본적으로 동작을 실행하는 주체는 메인 프로세서 한 개다. 그래서 해당 작업이 완료되기 전 까지 다른 작업은 대기를 할 수 밖에 없는 구조다.
따라서 만약 HKEYS를 사용하고자 한다면, HSCAN을 해서 페이징을 한다음 데이터를 받아와 처리하는 것을 권장한다.

정리

  • Hash는 하나의 키에 여러 필드와 값을 저장할 수 있어 복잡한 데이터를 효율적으로 관리할 수 있다.

  • Redis에서 HSCAN 명령어를 사용하면 해시 필드를 페이징 처리하여 대량 데이터를 효율적으로 조회할 수 있다.

  • HKEYS 명령어는 대규모 데이터 처리 시 병목을 유발할 수 있으므로 HSCAN을 사용하여 데이터를 나누어 가져오는 것이 권장된다.

profile
안녕하세요!! 백엔드 개발자를 희망하는 취준생입니다 !!

0개의 댓글