
1) 【一句话结论】:在投放系统中,通过分层数据库架构(Redis缓存+MySQL主从+MongoDB日志),结合分库分表(按广告ID/用户ID拆分)和索引优化(复合索引、覆盖索引),实现高并发请求处理与海量用户行为数据存储,核心是平衡性能与数据一致性,通过缓存加速热点访问,关系型数据库保障核心数据一致性,文档型数据库灵活存储行为日志。
2) 【原理/概念讲解】:面试官问如何处理海量广告请求和用户行为数据,本质是解决高并发读写与海量数据存储的矛盾。
3) 【对比与适用场景】:
| 数据库类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Redis | 内存数据库,支持键值、列表等 | 高并发读写、低延迟、支持事务(部分)、持久化 | 缓存热点数据、实时计数、会话管理 | 内存依赖,需定期持久化,不适合复杂查询 |
| MySQL | 关系型数据库,遵循ACID | 事务支持、主从复制、索引优化 | 核心业务数据(广告主、用户画像、策略表) | 单表数据量过大时性能下降,需分库分表 |
| MongoDB | 文档型数据库,BSON存储 | 文档结构灵活、支持聚合查询、副本集 | 用户行为日志、点击流数据、非结构化数据 | 查询复杂度较高时性能可能下降,索引维护成本高 |
4) 【示例】:以广告请求处理为例,分库分表和索引优化。
SELECT * FROM ad_request WHERE ad_id = 101 AND user_id = 102 AND request_time > NOW() - INTERVAL 1 MINUTE ORDER BY request_time DESC LIMIT 10;(索引覆盖查询,无需回表)。5) 【面试口播版答案】:在投放系统中处理海量广告请求和用户行为数据,核心是构建分层数据库架构并优化存储策略。首先,缓存层用Redis存储热点数据(如广告位实时库存、热门广告信息),通过内存访问实现亚毫秒级响应,缓解数据库压力。然后,核心业务数据用MySQL主从复制,存储广告主信息、用户画像、投放策略等结构化数据,通过事务保证数据一致性,并按广告ID分库、按用户ID分表,水平拆分数据,提升并发能力。对于用户行为日志,用MongoDB存储点击、曝光、转化等非结构化数据,文档结构灵活,便于后续分析。具体优化:在MySQL中为广告请求表创建复合索引(ad_id, user_id, request_time),用于快速查询最近请求;在MongoDB中为用户行为表创建索引(user_id, action_time, action_type),支持按用户ID和事件时间查询行为序列。分库分表时,按ad_id哈希分库、按user_id范围分表,避免热点数据集中。这样,缓存加速热点访问,关系型数据库保障核心数据一致性,文档型数据库灵活存储行为日志,整体实现高并发处理和海量数据存储。
6) 【追问清单】:
7) 【常见坑/雷区】: