1️⃣ 개요
Hash형(Hash type)은
“하나의 키(key)에 여러 개의 필드(field)와 값(value)을 짝으로 저장”하는 자료구조입니다.
프로그래밍 언어의 딕셔너리(Dictionary) 또는 Map 구조와 유사합니다.
key: {
field1: value1,
field2: value2,
...
}
특징
필드와 값의 쌍으로 저장
문자열만 허용
메모리 절약 (적은 수의 필드를 가질 때 효율적)
최대 2³² - 1개의 필드 저장 가능
주요 유스케이스
사용자 정보 저장 (예: user:1 → { name, age, email })
상품 정보, 게시글 정보, 설정 값 등 객체 단위 데이터
2️⃣ 기본 명령어
명령어 설명 시간 복잡도
HSET key field value 필드에 값 저장 (필드가 없으면 추가, 있으면 덮어씀) O(1)
HGET key field 지정한 필드 값 반환 O(1)
HDEL key field 필드 삭제 O(N)
HEXISTS key field 필드 존재 여부 확인 (1/0 반환) O(1)
HGETALL key 모든 필드와 값 반환 O(N)
HKEYS key 모든 필드명 반환 O(N)
HVALS key 모든 값만 반환 O(N)
HLEN key 필드 개수 반환 O(1)
3️⃣ 여러 필드 처리 관련 명령어
명령어 설명
HMSET key field1 value1 field2 value2 ... 여러 필드에 한 번에 값 저장
HMGET key field1 field2 ... 여러 필드의 값 반환
HSCAN key cursor [MATCH pattern][COUNT count] 커서 기반 반복 탐색 (대량 데이터 탐색용)
4️⃣ 숫자형 필드 조작
명령어 설명 예시
HINCRBY key field increment 정수형 값 증가 HINCRBY user:1 age 1 → age +1
HINCRBYFLOAT key field increment 실수형 값 증가 HINCRBYFLOAT user:1 score 0.5
5️⃣ 추가 명령어 및 보충
명령어 설명
HSETNX key field value 존재하지 않을 때만 값 저장
HSTRLEN key field 필드의 값 길이 반환
HRANDFIELD key [count][WITHVALUES] 랜덤 필드 반환 (개수 지정 가능)
6️⃣ 실행 예시
예제 1: 사용자 정보 저장
127.0.0.1:6379> HSET user:1 name "Taro"
(integer) 1
127.0.0.1:6379> HSET user:1 age 30 sex male email taro@example.com
OK
조회:
127.0.0.1:6379> HGET user:1 name
"Taro"
127.0.0.1:6379> HGETALL user:1
1) "name"
2) "Taro"
3) "age"
4) "30"
5) "sex"
6) "male"
7) "email"
8) "taro@example.com"
삭제:
127.0.0.1:6379> HDEL user:1 age
(integer) 1
127.0.0.1:6379> HGET user:1 age
(nil)
필드 목록:
127.0.0.1:6379> HKEYS user:1
1) "name"
2) "sex"
3) "email"
값 목록:
127.0.0.1:6379> HVALS user:1
1) "Taro"
2) "male"
3) "taro@example.com"
7️⃣ 성능 관련 주의사항
⚠️ 요소 수가 많을 때
필드가 너무 많으면(수천~수만 개) HGETALL, HKEYS, HVALS 등은 시간 복잡도 O(N)
대량 데이터에서는 HSCAN 사용 권장
⚠️ HDEL 실행 시간
필드 수가 많을 경우 HDEL은 오래 걸림 (O(N))
Hash형 전체 크기가 큰 경우, 삭제 시 스키마 잠금(blocking) 발생 가능
→ HSCAN 기반으로 점진적 삭제가 안전
⚠️ 필드 크기(요소 개수)가 너무 큰 경우
너무 큰 Hash는 클러스터 샤딩(sharding) 시 분산이 어려움
이 경우 String key로 세분화 관리가 더 안전함
8️⃣ 활용 예시
객체 저장 예시 (상품)
HSET item:1001 name "Keyboard" price 25000 stock 12
HSET item:1002 name "Mouse" price 12000 stock 30
→ HGETALL item:1001
1) "name"
2) "Keyboard"
3) "price"
4) "25000"
5) "stock"
6) "12"
9️⃣ 성능 향상을 위한 팁
필드 수가 적은 작은 해시 구조는 메모리 효율적
너무 많은 필드를 한 해시에 몰지 말 것
hash-max-ziplist-entries, hash-max-ziplist-value 설정으로 내부 인코딩 조절 가능
큰 Hash는 HSCAN 으로 순차 처리