第 281 题:设计特征存储的数据结构,支持高效CRUD与范围查询。
题目
设计特征存储的数据结构,支持高效CRUD与范围查询。
完整讲解
一、特征存储的需求
- 推荐与模型服务需要高效读写特征:按 key(user_id、item_id 等)查多列特征、支持范围查询(如某时间段、某类目)、支持CRUD 与 TTL。数据结构需在内存/存储与查询延迟间权衡。
二、高效 CRUD
- KV 存储:每 key 对应一个 value(可序列化多列);点查 O(1) 或 O(log n)。Redis、RocksDB 等适合高 QPS 点查;可做分层(热数据内存、冷数据盘)。
- 列式:按特征列存储,适合「按 key 取多列」的批量读;可做列压缩。若需按 key 更新单列,需支持列内索引或行式混合。
- CRUD:Put/Get 为基本;Update 可读-改-写或引擎原生 patch;Delete 可软删(标记)或 compaction 时真删。版本与 TTL 可由 key 设计(如 key=entity_id:version)或引擎支持。
三、范围查询
- 有序存储:key 按字典序或数值序排列,则范围查询 [key_start, key_end] 可顺序扫描或 B+树等索引区间查。RocksDB、LevelDB 支持 range scan。
- 二级索引:若需按「非主 key」范围查(如按时间、类目),可建二级索引(LSM/B+树),或维护 (时间, key) 等复合 key,范围查后回表取特征。
- 倒排+正排:按类目等维度建倒排(类目→key 列表),范围查转化为多 key 取;正排存 key→特征,供 CRUD。适合「按维度筛+按 key 取特征」的推荐场景。
四、推荐场景选型
- 在线推理:高 QPS 点查为主,Redis/自研 KV + 冷热分离;离线或批处理可 HBase/RocksDB 支持大范围 scan。特征版本与回溯可用 (key, version) 或时间分区。
面试要点
- 能说清特征存储对 CRUD 与范围查询的需求,以及 KV、列式、有序存储的适用场景。
- 能说明如何支持范围查询(有序 key、二级索引、倒排+正排)及推荐场景的典型选型。
记忆要点
- 特征存储:高效 CRUD(KV/列式)+ 范围查询(有序、二级索引、倒排正排)。
- 在线高 QPS 用 Redis/KV;离线/批处理用 RocksDB/HBase;版本可用 key 设计或分区。