原文连接https://github.com/OpenAtomFoundation/pikiwidb/discussions/20521.要点首先提出:上一方案每种数据类型对应一个RocksDB导致不同数据类型可以重名的问题同时业务集中使用一种数据类型造成负载不均衡和资源浪费。新的存储架构中Pika 实例存储引擎包括内存缓存和硬盘持久存储 RocksDB。每个 Pika 实例由一个内存缓存和多个 RocksDB 实例构成每个数据分片对应一个 RocksDB 实例。同一个Pika实例的多个 RocksDB 实例共享同一个 compaction 和 flush 线程池。2.Zset数据类型讨论Zset由两部分组成:元数据(meta_key, meta_value)和普通数据(data_key,data_value)元数据存储Zset集合member的数量以及当前Zset集合的版本号和过期时间普通数据存储: Zset集合的每个成员(membeer)及对应的分数(score)因为Zset需要按照member排序耶需要按照score排序所以有两种格式member to score和score to member3.kvrocks向量存储向量的存储格式分为 Metadata 和 Data 两部分1. Metadata元数据向量字段元数据[1 byte] flag (noindex:1 bit | type:4 bits | reserved:3 bits) [1 byte] vector_type (1 FLOAT64) [2 bytes] dim (向量维度) [1 byte] distance_metric (0L2, 1IP, 2COSINE) [4 bytes] initial_cap (初始容量) [2 bytes] m (每层最大邻居数) [4 bytes] ef_construction (构建时候选数) [4 bytes] ef_runtime (查询时候选数) [8 bytes] epsilon (范围查询因子) [2 bytes] num_levels (HNSW图层数)HNSW节点元数据[2 bytes] num_neighbours (邻居数量) [2 bytes] dim (向量维度) [dim * 8 bytes] vector (FLOAT64 向量数据)2. Data键格式HNSW节点键[1 byte] ns_size (命名空间长度) [ns_size bytes] ns (命名空间) [1 byte] type (3 SearchSubkeyType::FIELD) [4 bytes] index_size (索引名长度) [index_size bytes] index (索引名) [4 bytes] field_size (字段名长度) [field_size bytes] field (字段名) [2 bytes] level (HNSW层级) [1 byte] level_type (1 HnswLevelType::NODE) [4 bytes] key_size (数据键长度) [key_size bytes] key (数据键)HNSW边键[1 byte] ns_size [ns_size bytes] ns [1 byte] type (3 FIELD) [4 bytes] index_size [index_size bytes] index [4 bytes] field_size [field_size bytes] field [2 bytes] level [1 byte] level_type (2 EDGE) [4 bytes] key1_size [key1_size bytes] key1 [4 bytes] key2_size [key2_size bytes] key2值格式节点值[2 bytes] num_neighbours (邻居数量) [2 bytes] dim (向量维度) [dim * 8 bytes] vector (FLOAT64 向量数据)边值(空) - 边的值是一个空的 Slice所有信息都存储在键中4.redis 向量存储格式1.meta datatypedef struct hnswNode { uint32_t level; // 节点的最大层级 uint64_t id; // 唯一标识符 void *vector; // 向量数据指针 float quants_range; // 量化范围-quants_range 到 quants_range float l2; // 归一化前的 L2 范数 uint64_t visited_epoch[HNSW_MAX_THREADS]; // 访问时间戳每个线程一个 void *value; // 关联的用户值vsetNodeVal struct hnswNode *prev, *next; // 双向链表指针 hnswNodeLayer layers[]; // 各层的邻居链接柔性数组 } hnswNode;2.data