internal_stream
Redis Steam
Steam
데이터 구조
Stream struct : 40 bytes
Data Type | Name | Size | Description |
rax | *rax | 8 bytes | Id, data(field, value) Rax 포인터 |
uint64_t | length | 8 bytes | total data entry 수 |
streamID | last_id | 16 bytes | 마지막 id |
rax | *cgroups | 8 bytes | Consumer Group Rax 포인터 |
StreamID struct : 16 bytes
Data Type | Name | Size | Description |
uint64_t | ms | 8 bytes | Unix time in milliseconds |
uint64_t | seq | 8 bytes | Sequence number |
Rax->key
master_id: ms, seq
Listpack
master entry | data entries |
fields | data entry-1 | ... | data entry-N |
- Listpack size: 4kb 또는 100 entries 이하로 구성
- data entry가 삭제되어도 바로 메모리를 해제하지 않고
listpack 내에 모든 data entry가 삭제되면 listpack 메모리를 해제한다.
Master entry
Listpack 내에서 처음 입력된 데이터의 필드를 저장합니다.
count | deleted | num-fields | fields | lp-count |
count | deleted | num-fields | field-1 |
... | field-N | 0 |
- count: listpack 내에서 유효한 entry 수
- deleted: listpack 내에서 삭제된 entry 수
- listpack 내에서 총 entry 수: count + deleted
- lp-count: 0, listpack을 역 방향으로 탐색할 때 master entry 임을 나타낸다.
Data entry: same field
데이터가 master entry의 필드와 같으면 value만 저장합니다.
flags | entry-id | values | lp-count |
same | ms | seq | value-1 | ... |
value-N | N+3 |
- flags: same/deleted
- ms: delta, current id.ms - master_id.ms
- seq: delta, current id.seq - master_id.seq
- lp-count: N+3, lp-count를 제외한 필드수
Data entry: diff field
데이터가 master entry의 필드와 같지 않으면 field, value를 저장합니다.
flags | entry-id | num-fields |
fields & values | lp-count |
diff | ms | seq | num-fields | field-1 | value-1 | ... |
field-N | value-N | N*2+4 |
- flags: diff/deleted
- ms: delta, current id.ms - master_id.ms
- seq: delta, current id.seq - master_id.seq
- lp-count: N*2+4, lp-count를 제외한 필드수
Stream 구성도