
1) 【一句话结论】广告投放系统中,用户行为日志因高并发写入与多维度查询需求,采用HBase(时序+宽列存储)并设计时间+用户ID+广告ID联合索引;广告素材元数据用MySQL(主键+多列索引)存储,实际文件存对象存储(如MinIO),兼顾数据一致性与存储扩展性,同时明确业务对用户行为日志的一致性要求(强/最终)并说明HBase的适用性。
2) 【原理/概念讲解】用户行为日志是广告投放的核心数据,包含用户ID、广告ID、行为类型(点击、浏览等)、时间戳、设备信息等多维度信息,具有**高并发写入(秒级)、多维度查询(按时间、用户、广告筛选)**的特点。广告素材是静态文件(图片、视频),包含文件元数据(ID、类型、大小、上传时间)和实际文件(存对象存储)。
数据库选择需匹配数据特性:
3) 【对比与适用场景】
| 数据库类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| MySQL | 关系型数据库 | 事务支持、ACID、结构化存储 | 广告素材元数据(结构化、需事务)、用户行为日志的少量结构化数据(如统计报表) | 写入性能受限于单机,不适合海量写入;强一致性场景需额外事务方案 |
| HBase | Hadoop生态列式存储 | 海量、可伸缩、时序/宽列、最终一致性(默认) | 用户行为日志(高并发写入、多维度查询)、日志数据 | 需Hadoop集群,写入延迟可能较高;强一致性需分布式事务(如两阶段提交),影响性能 |
| ES | 分布式搜索引擎 | 全文搜索、实时索引 | 广告素材内容检索(如图片搜索)、用户行为日志的全文查询(如关键词搜索) | 不适合结构化数据的高并发写入;索引维护成本较高 |
4) 【示例】
user_action_logactions(存储行为类型,如click、view)、metadata(存储设备信息,如device_type、os_version)user_id:ad_id:timestamp(如1001:2001:20230101000000)1001:2001:20230101000000
actions:clickmetadata:device_type=mobile,os_version=11.0SCAN row => '1001:2001:20230101', row => '1001:2001:20230107', columns => ['actions:click']ad_materialmaterial_id(PK)、material_type(VARCHAR)、size(INT)、upload_time(TIMESTAMP)、storage_url(VARCHAR)material_id(PK)、material_type(INDEX)material_id=1001, material_type=image, size=1024, upload_time=20230101000000, storage_url=minio://ad-materials/1001.jpgSELECT * FROM ad_material WHERE material_type='image'5) 【面试口播版答案】在广告投放系统中,用户行为日志和广告素材的存储方案要分场景设计。用户行为日志因高并发写入和多维度查询需求,采用HBase(时序+宽列存储),通过时间+用户ID+广告ID的联合索引优化查询效率;广告素材元数据用MySQL(主键+多列索引)存储,实际文件存对象存储(如MinIO),兼顾数据一致性与存储扩展性。同时,明确业务对用户行为日志的一致性要求(强/最终),若需强一致性,可结合HBase与分布式事务(如两阶段提交),但需权衡性能。
6) 【追问清单】
version字段,每次更新时递增版本号;对象存储中保留历史版本(如MinIO的版本控制),或通过API实现版本回滚。7) 【常见坑/雷区】