2020-11-16 Swoole Table内部结构 Swoole Table内部结构还是比较复杂的,这里做一个记录: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455┌───────────────────┐ │ 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 ... │ │ │ └───────────────────────────────┘ │ │ └────────────────────────────────────────────┘ Newer MacOS下pwrite无法O_APPEND的问题 Older PHP内核编译if语句