[Redis] Sorted Set의 내부 저장 구조 - Zip List와 Skip List

hwwwa·2023년 1월 25일
0
post-thumbnail

Sorted Set 저장 형식

  • Sorted Set은 데이터가 정렬되어 저장되는데, 이때 내부적으로 두 가지 데이터 구조로 저장됨
  • member 모두 64 byte 이하이며 member 수가 128개 이하이면 Zip List 데이터 구조로 저장
  • member 중 하나라도 65byte 이상이거나 member 수가 129개 이상이면 Skip List 데이터 구조로 변환하여 저장
  • 해당 기준은 redis.conf 설정 파일의 ADVANCDE CONFIG 파트에서 zset-max-ziplist-entries, zset-max-ziplist-value 옵션을 통해 원하는 값으로 변경할 수 있음

Zip List

  • 메모리 절약에 최적화된 구조. default로 사용됨

  • 성능보다 메모리를 적게 사용하는 것이 중요한 경우 사용

  • 포인터를 저장하지 않고 기존에 할당 받은 메모리를 resize하여 데이터를 저장

  • Data Structure

  • 실 데이터를 제외한 zip list의 오버헤드는 총 11byte에 불과함 (포인터는 하나에 8byte)

  • 삽입, 삭제 시 기존 할당된 메모리를 resize하는 과정이 필요하여 데이터가 늘어날수록 성능 감소

Skip List

  • Sorted Set을 위한 메인 데이터 구조
  • 성능이 중요한 경우 사용
  • 데이터가 많을 수록 Zip List에 비해 탐색 시간이 훨씬 적게 걸림
  • 레벨에 저장되는 forward 포인터, span 값, backward 포인터 등 관리용 데이터로 인해 메모리 오버헤드 발생
  • 데이터가 많을 수록 삭제하는 데 시간이 오래 걸림

참고
http://redisgate.kr/redis/configuration/internal_zset_ziplist.php
http://redisgate.kr/redis/configuration/internal_skiplist.php

0개의 댓글