某数据日报思路和Java汇总每日每周每月用户数据定时任务+锁

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


}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习微站公众平台

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值