一、某数据日报思路
增加type字段
1.日报核对每一个字段,缺少的就增加
2.改造每个查询sql为查时间段,后面可以重复利用
3。先做月报,新建定时任务,自己百度cron表达式,每月1号凌晨一点执行月报定时任务
4.做周报,新建定时任务,每周一凌晨1点执行
二、Java汇总每日每周每月用户数据定时任务+锁
@Configuration
@EnableScheduling
@Log4j2
class UserVisitTimer {
@Autowired
private IDailyAnalyzeService dailyAnalyze;
@Autowired
private RedisLockRegistry redisLockRegistry;
private String key = "ANALYZE_DAILY";
@Scheduled(cron = "0 0 2 * * ?")
private void dailyData() {
log.info("处理日报数据 start");
if (getLock(key)) {
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DATE, -1);
String dateStr = format.format(calendar.getTime());
Integer type = 1;
DetailsReq detailsReq = new DetailsReq();
detailsReq.setDate(dateStr);
detailsReq.setType(type);
detailsReq.setPlatform("sscm");
//生成每日详情数据
dailyAnalyze.dailyDetails(detailsReq);
//生成每日汇总数据
dailyAnalyze.dailySummary(dateStr);
//生成每日sku数据
dailyAnalyze.dailyGoods(dateStr);
log.info("dailyData:统计{}的数据汇总完成", dateStr);
//手动统计首单用户数据
dailyAnalyze.firstPayAnalyze(dateStr);
log.info("dailyData:处理{}的首单数据完成");
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
}
releaseLock(key);
} else {
log.info("处理日报数据 未获取到锁 end");
}
}
/**
通俗的说就是多个线程,也可以说多个方法同时对一个资源进行访问时,如果不加锁会造成线程安全问题。
举例:比如有两张票,但是有5个人进来买,买了一张票数就减1,在他们进门的时候会判断是否还有票,但是在他们进门的那一刻,
票还一张都没有买走。但是他们都已经进门了,过了是否有票的校验了,所以最后票数为被减成负3,显然是不对的,
因为票不能小于0,所以需要加一个锁,在同一时刻只能有一个人进门去买票,也就是同一个资源同一个时刻只能有一个线程进行操作,
这样在第三个人进门的时候就能判断出票数已经卖完了,不会产生票数成负数的情况。
* @param key
* @return
*/
//获取锁
private boolean getLock(String key) {
Lock lock = redisLockRegistry.obtain(key);
if (lock.tryLock()) {
return true;
} else {
return false;
}
}
//释放锁
private void releaseLock(String key) {
Lock lock = redisLockRegistry.obtain(key);
lock.unlock();
}
}