一、为什么签到系统值得认真设计
“签到”看似只是一个简单按钮,真正落到业务中,通常会同时承载以下目标:
• 提升 DAU 与留存
• 驱动积分、经验值、优惠券等激励发放
• 支撑连续签到、补签、签到日历、月度活动等玩法
• 与消息推送、任务中心、会员体系联动
一旦用户规模上来,签到系统很快就不再是“写一条记录”这么简单,而会演变为一个典型的高频读写系统。
常见业务诉求包括:
• 用户每天只能签到一次
• 需要快速判断今天是否已签到
• 需要查询本月签到日历
• 需要计算连续签到天数
• 需要支持签到奖励异步发放
• 需要支持活动期间的大促流量峰值
• 需要在 Redis 故障、服务重启、消息重复投递等情况下保证正确性
如果仍然使用传统关系型表一条一条存储签到记录,在百万级 DAU、数千到数万 QPS 场景下,很快会暴露几个问题:
• 存储量大,索引膨胀明显
• 查询月历或连续签到统计成本高
• 高峰期写入容易集中打到数据库
• 奖励逻辑、签到逻辑、活动逻辑耦合在一起,扩展困难