Java活动报名人数统计需准确记录、实时更新、安全并发、支持查询:建sign_up_record表存明细,活动表冗余total_signups并受控更新;实时计数用MySQL行锁或Redis INCR;报名前校验时间、重复、限额;每日对账补偿。
Java中实现活动报名人数统计,核心在于准确记录、实时更新、安全并发、支持查询。不是简单加1减1,而是要结合业务场景设计健壮的统计逻辑。
不要把报名人数直接存在活动表里做字段更新(比如activity.sign_up_count += 1),这容易引发脏读或丢失更新。正确做法是:
sign_up_record表,记录每次报名的用户ID、活动ID、时间、状态(如“成功”“取消”)total_signups)作为冗余字段存在活动表中,但只通过受控逻辑更新用户点击“报名”时需立即反馈当前人数,推荐两种轻量方案:
SELECT ... FOR UPDATE,查出当前人数 → +1 → 更新字段 → 提交事务。适合QPS不高、强一致性要求的场景INCR activity:1001:signup,天然线程安全、毫秒级响应;再异步落库同步明细表。适合高并发、允许短暂最终一致的场景统计准不准,关键在入口控制。每次报名请求必须检查:
sign_up_record where user_id=xxx and activity_id=yyy and status='success')用户取消报名不能只减人数,还要保障状态可追溯:
status改为canceled,而非物理删除DECR(Redis)或带条件的UPDATE(如SET sign_up_count = sign_up_count - 1 WHERE id = ? AND sign_up_count > 0)基本上就这些。统计本身不复杂,但容易忽略并发、校验、回滚和对账环节,补全这四点,系统才真正稳得住。