[redis] hash

cochocho·2026년 4월 20일

hash

하나의 key(자료구조)에 대해 여러 field - value의 쌍을 가짐

주로 하나의 객체를 표현하는 데 사용

hash의 field, value는 모두 문자열임

따라서 \0, 즉 널 문자를 포함하더라도 binary safe하다
어떤 데이터든 저장할 수 있는 것이다

인코딩의 방식

레디스에서 해시의 인코딩 방식은 크게 두 종류이다

  • list pack
  • hash table
  1. list pack
    redis 7.0 이전에는 ziplist 였음

list pack의 경우

  • hash field 개수 적음 (512)
  • 모든 field, value 크기가 작음 (64)

이와 같은 두 조건 중 하나를 위반 시
hash table을 활용해 인코딩하게 된다

  1. hash table
    당연하게 hash table은
  • 충돌 시 체이닝 등의 작업을 위한 포인터
  • 빈 버킷 할당 (실제 데이터를 해당 버킷에 배정하지 않더라도)
    와 같은 내용으로 list pack보다 더 큰 저장공간을 소요함

그러나 list와 다르게 모든 요소 조회 없이 hash 함수를 거쳐 O(1)로 요소를 검색 가능

string vs hash

string을 사용 시 같은 사용자에 대해 정보를 저장 시
user:1000:name
user:1000:age
user:1000:email
이와 같이 각자 문자열을 저장하며, 해당 문자열에 대해 메타데이터를 포함하는 헤더를 함께 저장해야한다

그러나 hash 의 경우
hset user:1000 name Alice age 20
와 같이 동시에 저장 가능하다

명령어

  • hset : hash에 대해 field value 설정

  • hget : hash의 key, field value 조회
    hget user:1000 name

  • hmset (deprecated)
    set을 통해 동시에 여러 field 추가 가능하기 때문에 hset을 권장

  • hmget : 배열 반환
    일일히 get하는 것보다 효율적임(네트워크 전송 시)
    hmget user:1000 name email age

*이와 같이 여러 필드 - value 대상 set, get 시 레디스는 싱글 스레드 기반임에 따라 원자성을 보장해줌

  • hincrby, hincrbyfloat : 증가 연산

  • hexists : field 존재 유무 확인

  • hkeys : 모든 필드 반환 (순서 보장 안됨)

  • hvals : 모든 value 반환

0개의 댓글