
1) 【一句话结论】
针对淘天海量用户行为数据,采用“时序数据库(实时行为流)+宽列存储(聚合分析)+关系型数据库(元数据)+缓存(热点数据)”的混合架构,通过用户ID虚拟分片(分散热点)、冷热数据分离(时序数据库存实时,宽列存归档),结合Kafka事务缓冲(保证写入顺序)和Redis热点缓存(TTL控制),实现高查询效率与数据一致性平衡,满足实时推荐对数据实时性的需求。
2) 【原理/概念讲解】
数据模型设计上,定义user_behavior_log表,字段包括:
behavior_id:主键,自增,唯一标识行为记录;user_id:用户唯一标识,用于分片(虚拟分片);session_id:会话标识,区分同一用户不同会话(如手机/电脑行为属于不同session);device_type:设备类型(“mobile”“pc”),记录行为发生的设备;item_id:商品ID;action_type:行为类型(枚举,如“click”“browse”“purchase”“search”);action_time:毫秒级时间戳(用于时间索引);search_keyword:搜索词(JSON,辅助分析兴趣);page_position:页面位置(如“首页推荐位”“搜索结果第3页”),记录行为发生的页面位置;timestamp_ms:时间戳(与action_time一致,用于时间范围查询)。类比:就像日志系统,按时间顺序记录每个用户每个会话对商品的操作,上下文信息(如session_id、设备)像日志的备注,帮助分析行为发生的具体场景(如手机搜索“iPhone”与电脑浏览的行为属于不同会话,需单独分析)。
存储技术选型:
action_time)加速按时间范围查询(如最近7天用户行为),适合存储点击流、浏览日志等连续行为流。索引设计:
behavior_id(快速插入);action_time(按时间范围查询,如WHERE action_time BETWEEN 'start' AND 'end');user_id(按用户ID查询,实时推荐用);session_id(按会话ID查询,分析会话内行为序列)。分片策略:
user_id哈希值映射到多个分片(如分片0-99对应不同服务器),避免热点分片(如用户ID=1001分散到分片0、1、2)。day_20231027)分片,便于归档旧数据(保留30天数据,删除更早数据)。数据一致性保证:
3) 【对比与适用场景】
| 数据库类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 时序数据库(如Tair时序模块) | 专为时间序列设计,支持高并发写入和按时间查询 | 写入性能高(<100ms),时间索引高效 | 点击流、浏览日志,按时间范围查询 | 不支持复杂关联查询,数据结构固定 |
| 宽列存储(如ClickHouse) | 列式存储,适合大规模数据聚合 | 查询性能高(聚合延迟<200ms),支持复杂聚合函数 | 用户行为聚合(如点击数、购买转化率),分析型查询 | 写入延迟较高(<1s),适合批量写入 |
| 关系型数据库(如MySQL) | 传统关系型,支持ACID事务 | 强一致性,支持复杂关联查询,数据结构灵活 | 用户元数据(如用户画像、商品属性)、系统配置 | 写入性能低(<1000 QPS),不适合海量写入 |
| 缓存(如Redis) | 基于内存的键值存储,支持高并发读写 | 响应快(毫秒级),适合热点数据 | 热门用户行为数据(如最近7天点击商品),减少数据库压力 | 数据易丢失(需持久化),TTL控制数据过期 |
4) 【示例】
INSERT INTO user_behavior_log (user_id, session_id, device_type, item_id, action_type, action_time, search_keyword, page_position)
VALUES (1001, 'session_20231027_001', 'mobile', 101, 'click', '2023-10-27 10:30:00', '{"keyword": "iPhone 15"}', '首页推荐位');
SELECT * FROM user_behavior_log
WHERE user_id = 1001
AND session_id = 'session_20231027_001'
AND action_time BETWEEN '2023-10-27 10:00:00' AND '2023-10-27 11:00:00';
5) 【面试口播版答案】
“面试官您好,针对淘天海量用户行为数据存储,我设计一个混合架构方案。首先,数据模型上,我们定义用户行为日志表,包含用户ID、会话ID、设备类型、商品ID、行为类型、时间戳、搜索词等字段,记录每个用户每个会话的行为。存储技术选型上,采用时序数据库(如自研Tair时序模块)存储实时行为流,支持毫秒级写入和按时间范围查询;宽列存储(如ClickHouse)存储聚合数据,用于分析用户行为模式;关系型数据库(如MySQL)存储用户元数据和商品属性;Redis缓存热门用户行为数据(如用户最近7天点击的商品)。索引设计上,主键是行为ID,时间戳和用户ID、会话ID作为二级索引,加速查询。分片策略按用户ID虚拟分片(哈希取模后映射到多个分片,分散热点),按时间分片(按天归档,保留30天数据)。数据一致性采用最终一致性,通过Kafka事务性消息缓冲(确保写入顺序),写入时序数据库后异步写入宽列存储;Redis缓存(TTL=5分钟)减少数据库压力,每天凌晨全量同步保证一致性。这样既能满足实时推荐对数据实时性的要求,又能高效处理海量数据。”
6) 【追问清单】
7) 【常见坑/雷区】