一、某数据日报思路
增加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(); } }