在电商系统中,商家需要获取其店铺内销量排名前 50 的商品,该如何设计和实现该功能?
考察说明
考查候选人设计数据统计与排行榜功能的能力,涉及数据流、存储选型、实时性与性能取舍。
回答思路
- 【回答框架 1】核心需求是统计每个商品在一段时间内的销量并排序取前 50。实现上可采用离线或实时两条路径:T+1 离线计算可用 Hive/Spark 按日聚合销量,存入 MySQL/ES 供查询;实时场景可用 Flink 或 Storm 对订单流实时聚合,结果写入 Redis 或内存表。
- 【回答框架 2】存储选型需权衡读写性能与一致性。对 TopN 查询,Redis 的 Sorted Set 是常用方案:key 为店铺维度,member 为商品 ID,score 为销量,通过 ZREVRANGE 可快速获取前 50。若数据量大或需要持久化,可用 MySQL 冗余汇总表并定期更新,或采用预聚合的 OLAP 引擎如 Doris、ClickHouse。
- 【回答框架 3】对于高并发读取,可增加本地缓存或多级缓存,如使用 Caffeine 缓存 Top 50 列表并设置过期时间;同时要处理数据延迟:实时计算通常有秒级或分钟级延迟,需要明确业务对实时性的要求。
- 【回答框架 4】还需要考虑边界:库存状态、退款、脏数据等,例如退款订单不应计入销量,或需按业务规则调整。成本与复杂度也是关键,简单的解决方案如每日定时任务扫描订单表按店铺商品分组排序也足以应对中小规模场景。
- 【关键点 1】明确需求:统计周期、实时性要求、店铺维度、TopN 规则。
- 【关键点 2】离线方案可用定时任务+主从数据库或大数据平台聚合。
- 【关键点 3】实时方案可采用 Flink/Storm 聚合订单流,输出到 Redis Sorted Set。
- 【关键点 4】Redis 的 ZADD、ZREVRANGE 适合 TopN 查询,注意过期时间与持久化策略。
- 【关键点 5】需处理退款、取消订单等异常数据,确保统计口径一致。
- 【易错点 1】不要直接用数据库 ORDER BY 在大表上频繁查询,性能差。
- 【易错点 2】Redis 数据丢失或过期需考虑降级策略,如回源数据库。
- 【易错点 3】实时与离线数据不一致问题:需明确数据一致性级别,避免业务误解。