
1) 【一句话结论】
针对数百万用户行为数据的高并发写入与实时查询需求,采用“时序数据库(如InfluxDB)存储行为日志、关系型数据库(如MySQL)存储结构化数据、Redis缓存实时统计结果”的混合方案,通过消息队列(如Kafka)实现行为日志写入与实时统计的最终一致性,结合分库分表、索引优化保障高并发与实时性。
2) 【原理/概念讲解】
移动端用户行为数据分为两类:行为日志(时间序列特征,如点击、安装、卸载,需按时间顺序存储并支持历史查询)和实时统计(需快速响应,如活跃用户数,需毫秒级读取)。时序数据库(如InfluxDB)专为时间序列设计,支持按时间切片存储(如按天、小时),通过时间索引实现高效聚合查询;关系型数据库(如MySQL)保证用户信息、设备信息的强一致性,支持复杂事务;Redis作为内存缓存,利用高并发读写特性,缓存实时统计结果,实现毫秒级响应。类比:行为日志像时间轴上的事件流,时序数据库按时间顺序记录,类似日志系统按时间归档;实时统计像仪表盘的数值,Redis像缓存仪表盘的当前数值,快速读取,避免每次查询都去数据库。
3) 【对比与适用场景】
| 数据库类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 时序数据库(如InfluxDB) | 专为时间序列数据设计的数据库 | 高写入吞吐量(支持批量写入)、时间切片索引、支持聚合查询(如sum、count)、数据压缩(如ZSTD) | 行为日志(点击、安装、卸载)、设备日志、性能指标 | 需按时间分片(如按天),避免单表过大;写入延迟可能几秒(最终一致性);查询历史数据时需指定时间范围 |
| 关系型数据库(如MySQL) | 结构化数据存储,支持ACID | 强一致性、事务支持、复杂查询(多表连接)、主从复制 | 用户信息(ID、设备号、注册时间)、设备信息、行为分类表 | 写入性能受限于单表并发(如每秒万级写入),复杂查询延迟较高;需分库分表应对数据量增长 |
| Redis | 内存键值存储,支持多种数据结构 | 毫秒级读写、高并发、缓存、发布/订阅 | 实时统计(活跃用户数)、热点数据、会话缓存 | 依赖内存,需定期持久化(RDB/AOF);数据量受限于内存,需集群扩展;缓存一致性需通过消息队列或事件驱动实现 |
4) 【示例】
-- InfluxDB的表结构(measurement)
CREATE MEASUREMENT user_behavior
TAGS (user_id, device_type)
FIELDS (behavior_type VARCHAR, timestamp BIGINT, device_info JSON)
INDEX idx_user_behavior (user_id, timestamp)
索引策略:按时间戳分片后,每个分片表按用户ID+时间戳创建复合索引(如idx_user_behavior),加速按用户查询历史行为。
-- 事件触发后,更新活跃用户数
SET active_user_count 100000 EX 300 # 设置5分钟过期时间
5) 【面试口播版答案】
“针对数百万用户行为数据的高并发写入与实时查询需求,我会采用混合数据库方案。行为日志(如点击、安装)用时序数据库(如InfluxDB),因为它专为时间序列设计,支持按时间切片存储,能高效处理高写入(通过批量写入优化),通过时间索引实现快速查询;实时统计(如活跃用户数)用Redis,利用内存缓存实现毫秒级响应。表结构上,行为日志表按天分片,包含行为类型、用户ID、时间戳等字段,按时间戳+用户ID创建复合索引;实时表存储用户ID和最后活跃时间,通过用户ID+活跃时间索引加速查询。索引策略方面,行为表按时间戳分片,实时表用复合索引,确保高并发写入和实时查询效率。同时,通过关系型数据库(如MySQL)存储用户信息,保证数据一致性。对于缓存一致性,Redis缓存实时统计结果并设置5分钟过期时间,结合Kafka实现行为日志写入与缓存更新的最终一致性(如行为记录写入InfluxDB后,通过Kafka触发Redis更新)。分片查询优化方面,时序数据库按天分片后,查询历史数据时通过时间范围索引快速定位分片;关系型数据库按用户ID哈希分表,加速用户信息查询。这样既能满足高并发写入与实时查询需求,又能保证数据一致性。”
6) 【追问清单】
7) 【常见坑/雷区】