Redis SET vs HSET

김지원·2022년 7월 17일
0
post-thumbnail

이 비교를 하는 이유

redis를 사용하다보면 같은 주제로 여러 값들을 저장할 때가 있다.
개발을 진행하던 중 한 주제에 관련된 여러 key와 value를 저장해야 되는 일이 있었다.
(ex. 외부 api에서 가져온 값을 캐싱하는 작업 정도??)
근데 set으로 저장하게 되면 너무나도 많은 key가 저장되고 깔끔하게 관리되지 않을 수 있기 때문에 hset을 사용했었다.

hset으로 저장을 하고 관리를 하다가 key를 한번에 볼 수 없다는 불편함 때문에 그냥 set으로 저장한 후 get한 경우가 있었는데
속도차이가 꽤나 컷었다. (아마 value값이 너무 커서 그랬나..?)

그래서 어떤 차이가 있을지 알아보았다.

둘의 개념

  1. GET/SET

말 그대로 key와 value값을 가져 그대로 저장하는 방식이다.
불러올 때도 key를 가지고 불러오면 된다.

keyvalue
APPLE:M1Pro123dckodoe
APPLE:M2Air123dfv2dfdf
APPLE:IPhone8sdfdf2dd
  1. HGET/HSET

하나의 key에 여러개의 field와 value를 저장하는 방식이다.
mysql의 테이블이라고 생각하면 이해하기 편할 것 같다.

fieldkeyvalue
APPLEM1Pro123dckodoe
APPLEM2Air123dfv2dfdf
APPLEIPhone8sdfdf2dd

찾아본 결과

https://stackoverflow.com/questions/12779372/hset-vs-set-memory-usage

위의 스택오버플로우를 보면 질문자가 hget은 거의 O(1)에 충분히 가깝지만 CPU 사용량이 월등히 높다. 이것을 이해할 수 없다는 질문을 하였고 (사실 O(1)은 아니지만 그렇게 많이 알려져 있다.)

답변에는 HSET은 키 문자열을 한번 짧은 길이로 바꿔서 저장하기 때문에 맵핑하는 계산이 한번 더 들어간다.
그리고 이 시간은 최대 ziplist 크기만큼 든다. ziplist에 적용될 때 HSET작업이 실제로는 O(N)복잡도를 가지고 있다는 것이다.

  • 여기서 ziplist는 키 encode/decode할때 쓰는 redis 내부의 리스트인듯 하다.

결론

사실 HGET/HSET과 GET/SET의 성능이나 속도차이가 눈에 띄일 정도로 많이 나지는 않다. (난 왜..?)
그렇지만 성능이나 속도면에서는 당연히 hash화를 하지않는 GET/SET이 좋을 것이다.

그래도 많은 value값이 들어가지 않고 관리 측면을 더 신경쓴다면 HGET/HSET을 사용하는 것이 좋다는 결론을 낼 수 있을 것 같다.

일단 저는 성능을 우선으로 하기 때문에 차라리 REDIS의 한 데이터베이스에 한 종류의 데이터를 넣고 세분화는 keyPrefix로 넣어 진행하게 될 것 같다.

profile
backend-developer

2개의 댓글

comment-user-thumbnail
2022년 8월 3일

ziplist에 대한 좀더 상세한 포스트입니다 ㅎㅎ
http://redisgate.kr/redis/configuration/ds_ziplist_hashes.php

1개의 답글