Redis RDB Format

Redis Server Course Redis Technical Support Redis Enterprise Server

RDB File Format

RDB Version

  • rdb version 6: redis version: ~ 3.0.7
  • rdb version 7: redis version: 3.2.0 ~ 3.2.12
  • rdb version 8: redis version: 4.0.0 ~ 4.0.12
  • rdb version 9: redis version: 5.0.0 ~ 6.2.7
  • rdb version 10: redis version: 7.0.0 ~ 현재

RDB File Format Overview

RDB Version 7 File Format Overview이다.

rdb version 7 file format overview
    그림 1-1   RDB Version 7 File Format Overview
  • magic에는 'REDIS'와 RDB Version '0007'이 들어간다.   합쳐서 'REDIS0007' 총 10바이트이다.   RDB Version은 rdb.h에 '#define RDB_VERSION 7'로 정의되어 있다.
    Loading 시 'REDIS'가 아니거나, 버전이 0 ~ RDB_VERSION 사이가 아니면 에러 메시지를 출력하고 종료한다.
  • 다음은 aux가 저장된다.   aux는 레디스 버전 3.2.0, RDB 버전 7에서 추가된 항목으로 4개 항목으로 구성되며, 항목명은 redis-ver, redis-bits, ctime, used-mem이다.   다음 섹션에서 설명한다.
  • 다음은 DB 별로 데이터가 저장된다.   이 부분이 반복되고, DB 내에 데이터가 없으면 저장되지 않는다.  
  • 다음은 End-of-File로, 'FF' 한 바이트가 저장된다.
  • 마지막으로 Checksum 8 바이트가 저장된다.   이것은 redis.conf에 rdbchecksum yes 일 때 적용된다.   rdbchecksum no 이면 '00'이 8바이트 저장된다.
다음은 실제 저장된 파일의 hex dump에서 magic을 강조해서 표시했다.

rdb version 7 format magic hex
    그림 1-2   RDB Version 7 magic Hex Format

AUX Format

AUX는 RDB version 7 (Redis version 3.2.0)에 추가된 항목이다.

rdb version 7 aux format
    그림 1-3   RDB Version 7 AUX Format
  • 우선 AUX를 나타내는 opcode가 저장된다.   opcode는 'FA'이고, rdb.h에 '#define RDB_OPCODE_AUX   250'으로 정의되어 있다.   aux opcode는 aux 항목마다 앞에 저장된다. 노란 박스로 표시했다.
  • 각 항목은 길이가 저장되고, 다음에 실제 데이터가 저장된다.
  • 항목 1) 'redis-ver'는 레디스 버전을 표시한다.   길이 '09', 데이터 'redis-ver'가 저장되고, 버전 길이 '05', 버전 '3.2.0'이 저장된다.
  • 항목 2) 'redis-bits'는 서버 비트(아키텍처)을 표시한다.   길이(16진수) '0A', 데이터 'redis-bits'가 저장되고, 64 또는 32가 숫자(정수)가 한 바이트 저장된다.   정수일 때 길이는 저장하지 않는다.
    실제 코드: int redis_bits = (sizeof(void*) == 8) ? 64 : 32;
  • 항목 3) 'ctime'은 Linux time을 표시한다.   길이 '05', 데이터 'ctime'가 저장되고, Linux time이 숫자로 5 바이트 저장된다.
  • 항목 4) 'used-mem'은 사용 메모리를 표시한다.   길이 '08', 데이터 'used-mem'가 저장되고, zmalloc_used_memory()로 구한 메모리 사용량이 숫자 5 바이트 저장된다.   info memory의 use_memory도 이 function으로 구한다.
  • AUX 정보는 RDB 파일에서 확인하기 위한 것으로 Loading 시 읽어들이지만 특별히 사용되지는 않는다.
다음은 실제 저장된 파일의 hex dump에서 aux을 강조해서 표시했다.

rdb version 7 format aux hex
    그림 1-4   RDB Version 7 AUX Hex Format

DB Format

rdb version 7 db format
    그림 1-5   RDB DB Format
  • DB Format는 크게 세 부분으로 나누어진다.
    • DB 표시: DB opcode와 DB num이 저장되다.
    • DB size 표시: resizedb opcode와 키 개수, Expire 키 개수가 저장된다.   이 항목은 RDB 버전 7에서 추가되었다.
    • 다음에 Data가 저장된다.
  • DB opcode는 'FE'이고, DB num가 저장된다.
  • RESIZEDB opcode는 'FB'이고, DB size(키 개수)와 Expire 키 개수가 정수로 저장된다.   아래 hex dump에서는 키 개수는 1이고 Expire 키 개수는 0이다.
    이 정보는 레디스 3.2.0(RDB 7)에서 추가된 것으로, 키 개수 정보로 로딩 시 Hash table을 미리 할당해서 로딩 속도를 높이는데 사용된다.
  • Data는 format은 다음 섹션에서 설명한다.
다음은 실제 저장된 파일의 hex dump에서 db을 강조해서 표시했다.

rdb version 7 format db hex
    그림 1-6   RDB Version 7 DB Hex Format

RDB opcode

정의10진수16진수비고
RDB_OPCODE_MODULE_AUX 247F7Module auxiliary data. rdb ver 9
RDB_OPCODE_IDLE 248F8LRU idle time. rdb ver 9
RDB_OPCODE_FREQ 249F9LFU frequency. rdb ver 9
RDB_OPCODE_AUX 250FARDB aux field. rdb ver 7
RDB_OPCODE_RESIZEDB 251FBHash table resize hint. rdb ver 7
RDB_OPCODE_EXPIRETIME_MS 252FCExpire time in milliseconds
RDB_OPCODE_EXPIRETIME 253FDOld expire time in seconds.
과거 버전 호환성, 로드시에만 사용됨.
RDB_OPCODE_SELECTDB 254FEDB number of the following keys.
RDB_OPCODE_EOF 255FFEnd of the RDB file.

Data Format

rdb version 7 data format
    그림 1-7   RDB Data Format
  • 데이터는 크게 다섯 부분으로 구분되어 저장된다.
    • 맨 처음 Data Type이 저장되다.   아래 표에 있다.
      3.0.x에서 Lists는 Linkedlist와 Ziplist 두 가지로 사용되었는데,   3.2.0에서부터 Quicklist 하나만 사용된다.
      Hash에서 Zipmap은 사용되지 않고 Ziplist가 사용된다.
    • 다음에 키 길이가 바이트수로 저장되고, 키가 저장된다.
      길이는 데이터가 압축되었을 때는 세 항목으로 구분되어 저장된다.
    • 이어서 값의 길이와 값이 저장된다.
  • 압축 데이터 길이: 데이터(키, 값 모두)가 20 바이트보다 크면, 압축되는데 이때는 길이가 다시 세 부분으로 나누어 저장된다.
    • 압축코드: 압축했다는 것을 표시하는 한 바이트이다. 'C3'이 저장된다.
    • 다음에 압축 후 길이가 저장된다. 그림에 표시한 것은 16진수 '23'이다.
    • 다음에 압축 전 원래 길이가 저장된다. 원래 길이는 로딩 시 원래 길이만큼 메모리를 할당하기 위해서이다.   그림에 표시한 것은 16진수 '35'이다.
    • 압축 후 길이는 로딩 시 RDB 파일에서 압축된 데이터를 읽어들일 메모리를 할당하는데 사용되고, 압축 전 원래 길이는 압축된 데이터를 풀어서 저장할 메모리를 할당하는데 사용된다.
  • 다음은 실제 저장된 파일의 hex dump에서 data 부분을 강조해서 표시했다.

    rdb version 7 format data hex
        그림 1-8   RDB Version 7 Data Hex Format
    이것은 set key value를 입력한 것으로, 압축되지 않은 데이터이다.
  • RDB Data Type
  • RDB Data Type

    정의Data Type비고
    RDB_TYPE_STRING 0Strings
    RDB_TYPE_LIST 1Linkedlist3.0.7까지 사용
    RDB_TYPE_SET 2Hash Table
    RDB_TYPE_ZSET 3Skiplist
    RDB_TYPE_HASH 4Hash Table
    RDB_TYPE_ZSET_2 5Skiplist, doubles stored in binary4.0.0부터 사용
    RDB_TYPE_MODULE 6Module4.0.0부터 사용
    RDB_TYPE_MODULE_2 7Module value with annotations for parsing without the generating module being loaded.4.0.0부터 사용
    RDB_TYPE_HASH_ZIPMAP 9Zipmap미사용
    RDB_TYPE_LIST_ZIPLIST 10Ziplist of List3.0.7까지 사용
    RDB_TYPE_SET_INTSET 11Intset
    RDB_TYPE_ZSET_ZIPLIST 12Ziplist of Zset
    RDB_TYPE_HASH_ZIPLIST 13Ziplist of Hash
    RDB_TYPE_LIST_QUICKLIST 14Quicklist of List3.2.0부터 사용
    RDB_TYPE_STREAM_LISTPACKS 15Stream listpasks5.0.0부터 사용

EOF Format

파일 끝을 나타내는 End-Of-File(EOF)는 255(FF)가 저장된다.   Checksum이 뒤에 있으므로 실제 파일 끝은 아니다.  

rdb version 7 format eof hex
    그림 1-8   RDB Version 7 EOF Hex Format

Checksum Format

파일 끝에 8 바이트 checksum이 들어간다.   이것은 redis.conf에 rdbchecksum yes 일 때 CRC64 Checksum이 만들어지고, no 일 때는 '00'이 8 바이트 들어간다.

rdb version 7 format data
    그림 1-9   RDB Checksum Format

다음은 실제 저장된 파일의 hex dump에서 Checksum 부분을 강조해서 표시했다.

rdb version 7 format checksum hex
    그림 1-10   RDB Version 7 Checksum Hex Format

<< RDB Bgsave RDB Format RDB Functions >>

Email 답글이 올라오면 이메일로 알려드리겠습니다.