KittenDB Texts 技术解析:高效存储海量文本数据的系统架构
kphp-kdb VK-KittenPHP/DB/Engine suite 项目地址: https://gitcode.com/gh_mirrors/kph/kphp-kdb
概述
KittenDB Texts 是一个专为存储海量文本数据设计的分布式存储系统,特别适合处理个人消息、社交网络动态等场景下的文本内容。该系统采用独特的数据组织方式,在保证高性能的同时实现了灵活的查询能力。
核心架构设计
消息与信箱模型
系统采用"信箱-消息"的二级结构组织数据:
- 信箱:每个用户拥有独立的消息容器,通过uid(user_id)标识
- 消息:存储在特定信箱中的文本内容,具有多种属性
这种设计实现了数据的逻辑隔离,每个用户的消息操作互不影响,便于分布式部署和水平扩展。
消息属性详解
每条消息包含以下核心元数据:
| 属性 | 类型 | 描述 | |------|------|------| | uid | uint32 | 所属信箱的用户ID | | local_id | uint32 | 信箱内唯一递增ID,删除不回收 | | flags | uint8/16 | 状态标志位(见下文详解) | | date | unixtime | 创建时间戳 | | global_id | uint64 | 全局唯一ID(跨所有信箱) | | legacy_id | uint32 | 兼容旧系统的备用ID | | peer_id | uint32 | 关联用户ID(如发件人/收件人) | | peer_msg_id | int32 | 关联消息ID(正数为local_id,负数为legacy_id) | | text | string | 消息正文(可含主题和内容,用制表符分隔) |
扩展字段机制
系统支持灵活的扩展字段配置:
- 32位整型字段:最多8个(extra0-extra7)
- 64位整型字段:最多4个(Extra8-Extra11)
这些字段需要在初始化时预先定义,运行时修改需要异步处理(最长延迟24小时)。
高级特性
消息标志位系统
flags字段采用位掩码设计,支持组合状态标记:
| 标志值 | 名称 | 含义 | |--------|------|------| | 0x1 | UNREAD | 未读状态 | | 0x2 | OUTBOX | 发件箱消息 | | 0x4 | REPLIED | 已回复 | | 0x8 | IMPORTANT | 重要标记 | | 0x10 | CHAT | 聊天消息 | | ... | ... | ... |
完整标志位包含16种状态,可组合使用(如0x3表示未读的发件箱消息)。
子列表查询
基于标志位系统,KittenDB Texts实现了高效的子列表查询机制:
and_mask:xor_mask
技术原理:
- and_mask指定需要检查的标志位
- xor_mask指定这些位的期望值
示例:
130:2
→ OUTBOX=1且DELETED=0的消息131:1
→ UNREAD=1且OUTBOX=0且DELETED=0的消息
附加数据(Cludges)
系统支持在消息正文前存储结构化附加数据:
格式规范:
[\x1|\x2]<名称>\x20<值>\t
特性:
- \x2标记表示该值参与全文检索
- 存储时直接追加到文本前
- 查询时需显式请求才会返回
典型应用场景
-
即时通讯系统:
- 使用peer_id标识会话对方
- 通过OUTBOX标志区分收发方向
- UNREAD标志实现未读计数
-
社交网络动态:
- 每个用户的动态作为独立信箱
- IMPORTANT标志标记置顶内容
- 通过子列表实现分页加载
-
邮件系统:
- EMAIL标志标识邮件消息
- 使用extra字段存储邮件特有属性
性能优化设计
- 局部ID连续分配:local_id永不回收,避免写入放大
- 全局ID单调递增:便于实现跨信箱的时间线查询
- 标志位索引:支持快速过滤和子列表查询
- 附加数据延迟解析:减少不必要的解析开销
KittenDB Texts通过这些精心设计的数据结构和查询机制,在保证功能丰富性的同时,实现了对海量文本数据的高效存储和检索。
kphp-kdb VK-KittenPHP/DB/Engine suite 项目地址: https://gitcode.com/gh_mirrors/kph/kphp-kdb
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考