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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,倚天版 1GB 1个月
简介: 一、某数据日报思路增加type字段1.日报核对每一个字段,缺少的就增加2.改造每个查询sql为查时间段,后面可以重复利用3。先做月报,新建定时任务,自己百度cron表达式,每月1号凌晨一点执行月报定时任务4.做周报,新建定时任务,每周一凌晨1点执行二、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();
    }
}
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
16天前
|
存储 Oracle 安全
揭秘Java并发核心:深入Hotspot源码腹地,彻底剖析Synchronized关键字的锁机制与实现奥秘!
【8月更文挑战第4天】在Java并发世界里,`Synchronized`如同导航明灯,确保多线程环境下的代码安全执行。它通过修饰方法或代码块实现独占访问。在Hotspot JVM中,`Synchronized`依靠对象监视器(Object Monitor)机制实现,利用对象头的Mark Word管理锁状态。
27 1
|
4天前
|
存储 安全 Java
"Java编码魔法:揭秘图片与文件的Base64神秘转换术,让数据在指尖跳跃!"
【8月更文挑战第16天】Base64编码在Java开发中常用于将二进制数据如图片转换为ASCII字符串以便传输。编码使用64个字符及等号填充,每3字节数据编码为4个字符。Java利用`java.util.Base64`类实现此功能:读取图片或文件为字节数组后进行编码。解码时将Base64字符串还原为字节数组并写入文件。需注意编码效率降低、不提供安全性及特殊字符兼容性等问题。掌握这些技巧有助于解决Web开发中的数据传输需求。
17 4
|
3天前
|
存储 SQL 关系型数据库
深入MySQL锁机制:原理、死锁解决及Java防范技巧
深入MySQL锁机制:原理、死锁解决及Java防范技巧
|
6天前
|
监控 Java
Java文件夹复制解决方案:优化大文件与大量数据的处理
Java中复制文件夹及其内容,尤其是当处理大文件或文件夹(如几个GB)时,需要特别注意内存使用和性能优化。以下是一个详细的指导,包括如何避免内存溢出异常,并确保复制过程的高效性。
15 1
|
9天前
|
消息中间件 负载均衡 Java
"Kafka核心机制揭秘:深入探索Producer的高效数据发布策略与Java实战应用"
【8月更文挑战第10天】Apache Kafka作为顶级分布式流处理平台,其Producer组件是数据高效发布的引擎。Producer遵循高吞吐、低延迟等设计原则,采用分批发送、异步处理及数据压缩等技术提升性能。它支持按消息键值分区,确保数据有序并实现负载均衡;提供多种确认机制保证可靠性;具备失败重试功能确保消息最终送达。Java示例展示了基本配置与消息发送流程,体现了Producer的强大与灵活性。
28 3
|
15天前
|
存储 安全 Java
揭秘Java序列化神器Serializable:一键解锁对象穿越时空的超能力,你的数据旅行不再受限,震撼登场!
【8月更文挑战第4天】Serializable是Java中的魔术钥匙,开启对象穿越时空的能力。作为序列化的核心,它让复杂对象的复制与传输变得简单。通过实现此接口,对象能被序列化成字节流,实现本地存储或网络传输,再通过反序列化恢复原状。尽管使用方便,但序列化过程耗时且存在安全风险,需谨慎使用。
27 7
|
19天前
|
监控 前端开发 JavaScript
|
5天前
|
前端开发 Java
如何实现 Java SpringBoot 自动验证入参数据的有效性
如何实现 Java SpringBoot 自动验证入参数据的有效性
14 0
|
5天前
|
存储 缓存 Java
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中的数据的问题如何解决
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中的数据的问题如何解决