每日刷新与定时任务
概述
每日 0 点是游戏的"心跳时刻":任务刷新、活跃度清零、签到结算、活动切换都在这一刻发生。系统的难点有三:重置策略(哪些数据该重置、按什么规则)、跨日处理(0 点瞬间在线的玩家不体验异常)、跑批调度(定时任务的可靠与幂等)。本文设计完整的每日刷新体系。
一、每日 0 点重置
1.1 重置清单
每日重置项:
每日任务(重新生成)
活跃度(清零 + 领档状态重置)
签到(新的一天可签)
每日限购(限购计数清零)
每日福利(登录礼包)
不清零项:
货币/道具(玩家资产)
主线/支线任务(一次性进度)
成就进度(长期累积)1.2 重置策略
重置方式:
全量重置:直接生成新数据(任务/签到)
计数重置:清零每日计数(限购)
滚动重置:窗口滑动(连续天数结算)
重置标识:
数据带日期字段(resetDate)
按日期判断是否需要重置(幂等)// 按日期惰性重置(登录时检查)
private void checkDailyReset(Player player) {
String today = LocalDate.now().format(ISO_DATE);
if (!today.equals(player.getDailyResetDate())) {
doDailyReset(player); // 执行重置
player.setDailyResetDate(today);
}
}二、跨日处理
2.1 0 点在线玩家
跨日瞬间:
玩家在线,0 点任务刷新
客户端展示需要平滑过渡
处理:
服务器 0 点执行重置
推送"每日刷新"通知(红点/弹窗)
玩家操作时按新日期数据执行(惰性重置兜底)
避免刷新瞬间操作冲突(加锁/串行)2.2 跨日一致性
关键点:
重置以服务器日期为准(统一时区)
客户端倒计时与服务端一致
跨日瞬间的结算归属旧日(如对战开始时间)
防"卡点刷次数"(如 23:59 刷 3 场 + 0 点再刷)防卡点刷:
每日任务计数带日期
跨日按"完成时间"归属
限购按日期重置(23:59 买的 0 点后可再买,属正常)
特殊限制:结算归属以开战时间计三、跑批任务调度
3.1 调度框架
方案对比:
Quartz:Java 原生调度,进程内,功能全
XXL-Job:分布式调度中心,多节点执行,带 UI
Spring @Scheduled:轻量,适合单机
选型建议:
单服/小规模 → Spring @Scheduled
集群/需要可视化管理 → XXL-Job
运维巡检 → 分布式调度中心XXL-Job 特性:
调度中心 + 执行器
分片广播(多节点各处理一部分)
失败重试 + 告警
任务日志可视化3.2 常见跑批任务
每日任务清单:
00:00 每日重置(任务/活跃/签到)
00:05 排行榜日榜结算(若有)
01:00 邮件过期清理
02:00 数据库归档/备份
03:00 日志清理
整点:活动状态检查(到点开关)四、任务幂等执行
4.1 幂等设计
跑批任务可能重复执行(重试/多节点):
重复执行不能造成重复发奖/重复扣减
幂等手段:
分布式锁(Redis setIfAbsent):同一时间仅一节点执行
业务幂等键:批次号/日期(唯一索引)
可重入:重置类任务天然幂等(按日期判断)// 分布式锁防止多节点重复执行
boolean lock = redis.setIfAbsent("lock:daily:reset", "1",
Duration.ofMinutes(10));
if (!lock) {
return; // 其他节点已执行
}
try {
dailyResetService.execute();
} finally {
redis.delete("lock:daily:reset");
}4.2 失败处理
失败重试:
单任务失败 → 记录 + 重试(指数退避)
重试上限 → 告警人工介入
部分失败 → 记录批次进度,续跑
执行保障:
任务日志(开始/结束/耗时/结果)
异常告警(钉钉/企微,见运维章节)
人工补跑入口(运营后台)数据一致性:
重置先落库后清缓存(防缓存脏数据)
或先清缓存后落库(防读到旧数据)
推荐:事务内更新 → 提交后失效缓存五、实现要点
核心接口:
dailyReset(playerId) // 单玩家惰性重置
executeDailyJob() // 全服跑批
checkActivitySwitch() // 活动状态检查
retryFailedJob(jobId) // 失败重试工程注意:
统一服务器时间(避免时区错乱)
锁粒度(全局锁 vs 分片锁)
任务超时保护(超时自动失败)
监控(任务耗时/成功率)常见坑:
重复执行重复发奖 → 分布式锁 + 幂等键
0 点在线玩家卡顿 → 惰性重置 + 平滑推送
跨时区/夏令时 → 固定 UTC 基准
任务积压 → 分级执行 + 告警与其他系统衔接:
每日重置 → 任务/签到/限购/活跃
活动切换 → 活动框架
排行榜结算 → 排行榜系统
监控告警 → 运维章节