Swoole Table内部结构

Swoole Table内部结构还是比较复杂的,这里做一个记录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
┌───────────────────┐                                                                                                                                                                
│ GlobalMemory │──────────────────▶┌────────────────────────────────────────────┐ ┌───▶───────────────────────────────┐
└───────────────────┘ │ │ │ │ TableColumn │
│ │ │ │ │
│ │ │ ├───────────────────────────────┤
┌───────────────────┐ │ │ │ │enum Type type - int, string...│
│ MemoryBlock │──────────────────▶├────────────────────────────────────────────┤ │ ├───────────────────────────────┤
├───────────────────┤ │ │ │ │ uint32_t size │
│ uint32_t size │─────────────────▶ │ size of memory │ │ ├───────────────────────────────┤
├───────────────────┤ │ │ │ │ std::string name │
│ char memory[0] │─────────┬────────▶├────────────────────────────────────────────┤ │ ├───────────────────────────────┤
└───────────────────┘ │ │ swoole::Table │ │ │ size_t index │
│ │ │ │ └───────────────────────────────┘
│ ├────────────────────────────────────────────┤ │
│ │ std::unordered_map *column_map │────┤ ┌───────────────────────────────┐
│ ├────────────────────────────────────────────┤ │ │ │
│ │ std::vector *column_list │────┘ │ memory_size = size * │
│ ├────────────────────────────────────────────┤ │ sizeof(TableRow *) │
│ │ size_t size - construct size │ │ │
│ ├────────────────────────────────────────────┤ │ memory_size += row_num * │
│ │ size_t memory_size │───────▶│(sizeof(TableRow) + item_size) │
│ ├────────────────────────────────────────────┤ │ │
│ │ size_t item_size - all column size of row │ │ │
│ ├────────────────────────────────────────────┤ │ │
│ │ sw_atomic_t row_num │ │ │
│ ├────────────────────────────────────────────┤ └───────────────────────────────┘
│ │ TableIterator *iterator │
│ ├────────────────────────────────────────────┤
│ │ Mutex *mutex │
│ ├────────────────────────────────────────────┤
│ │ void *memory - save the all rows │─────────▶───────────────────────────────┐
│ ├────────────────────────────────────────────┤ │ size * sizeof(TableRow *) │
│ │ TableRow **rows ├───┐ │ │
│ ├────────────────────────────────────────────┤ │ │ to foreach table │
│ │ │ │ ├───────────────────────────────┤
└─────────▶────────────────────────────────────────────┤ └────▶│ TableRow1 * │──┐ ┌─────────────────────────────────────────┐
│ │ ├───────────────────────────────┤ │ │ TableRow │
│ │ │ TableRow2 * │ │ │ │
│ │ ├───────────────────────────────┤ │ │ sw_atomic_t lock_ │
│ │ │ .... │ │ │ │
│ │ ├───────────────────────────────┤ │ │ uint8_t active - whether the row init │
│ │ │ row_num * (sizeof(TableRow) + │ │ │ │
│ │ │ item_size) │ │ │ uint8_t key_len │
│ │ │ │ │ │ │
│ │ ├───────────────────────────────┤ │ │ TableRow *next │
│ │ │ TableRow 1 │◀─┘ │ │
│ │ ├───────────────────────────────┤ │ char key[SW_TABLE_KEY_SIZE] │
│ │ │ TableRow 2 │ │ │
│ │ ├───────────────────────────────┤ │ char data[0] │
│ │ │ TableRow 3 │ │ │
│ │ ├───────────────────────────────┤ └─────────────────────────────────────────┘
│ │ │ TableRow ... │
│ │ └───────────────────────────────┘
│ │
└────────────────────────────────────────────┘