rdb_format
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이다.
- 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바이트 저장된다.
AUX Format
AUX는 RDB version 7 (Redis version 3.2.0)에 추가된 항목이다.
- 우선 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 시 읽어들이지만 특별히 사용되지는 않는다.
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은 다음 섹션에서 설명한다.
정의 | 10진수 | 16진수 | 비고 |
---|---|---|---|
RDB_OPCODE_MODULE_AUX | 247 | F7 | Module auxiliary data. rdb ver 9 |
RDB_OPCODE_IDLE | 248 | F8 | LRU idle time. rdb ver 9 |
RDB_OPCODE_FREQ | 249 | F9 | LFU frequency. rdb ver 9 |
RDB_OPCODE_AUX | 250 | FA | RDB aux field. rdb ver 7 |
RDB_OPCODE_RESIZEDB | 251 | FB | Hash table resize hint. rdb ver 7 |
RDB_OPCODE_EXPIRETIME_MS | 252 | FC | Expire time in milliseconds |
RDB_OPCODE_EXPIRETIME | 253 | FD | Old expire time in seconds. 과거 버전 호환성, 로드시에만 사용됨. |
RDB_OPCODE_SELECTDB | 254 | FE | DB number of the following keys. |
RDB_OPCODE_EOF | 255 | FF | End of the RDB file. |
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 부분을 강조해서 표시했다.
그림 1-8 RDB Version 7 Data Hex Format 이것은 set key value를 입력한 것으로, 압축되지 않은 데이터이다. - RDB Data Type
정의 | 값 | Data Type | 비고 |
---|---|---|---|
RDB_TYPE_STRING | 0 | Strings | |
RDB_TYPE_LIST | 1 | Linkedlist | 3.0.7까지 사용 |
RDB_TYPE_SET | 2 | Hash Table | |
RDB_TYPE_ZSET | 3 | Skiplist | |
RDB_TYPE_HASH | 4 | Hash Table | |
RDB_TYPE_ZSET_2 | 5 | Skiplist, doubles stored in binary | 4.0.0부터 사용 |
RDB_TYPE_MODULE | 6 | Module | 4.0.0부터 사용 |
RDB_TYPE_MODULE_2 | 7 | Module value with annotations for parsing without the generating module being loaded. | 4.0.0부터 사용 |
RDB_TYPE_HASH_ZIPMAP | 9 | Zipmap | 미사용 |
RDB_TYPE_LIST_ZIPLIST | 10 | Ziplist of List | 3.0.7까지 사용 |
RDB_TYPE_SET_INTSET | 11 | Intset | |
RDB_TYPE_ZSET_ZIPLIST | 12 | Ziplist of Zset | |
RDB_TYPE_HASH_ZIPLIST | 13 | Ziplist of Hash | |
RDB_TYPE_LIST_QUICKLIST | 14 | Quicklist of List | 3.2.0부터 사용 |
RDB_TYPE_STREAM_LISTPACKS | 15 | Stream listpasks | 5.0.0부터 사용 |
EOF Format
파일 끝을 나타내는 End-Of-File(EOF)는 255(FF)가 저장된다. Checksum이 뒤에 있으므로 실제 파일 끝은 아니다.
Checksum Format
파일 끝에 8 바이트 checksum이 들어간다. 이것은 redis.conf에 rdbchecksum yes 일 때 CRC64 Checksum이 만들어지고, no 일 때는 '00'이 8 바이트 들어간다.
다음은 실제 저장된 파일의 hex dump에서 Checksum 부분을 강조해서 표시했다.
<< RDB Bgsave | RDB Format | RDB Functions >> |
---|
Email
답글이 올라오면 이메일로 알려드리겠습니다.