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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 一、某数据日报思路增加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
相关文章
|
12天前
|
Java
Java中ReentrantLock释放锁代码解析
Java中ReentrantLock释放锁代码解析
25 8
|
29天前
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
21 1
|
1月前
|
存储 Java
JAVA字符串与其他类型数据的转换
JAVA字符串与其他类型数据的转换
27 4
|
12天前
|
Java 调度
Java中常见锁的分类及概念分析
Java中常见锁的分类及概念分析
15 0
|
29天前
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
15 1
|
5天前
|
安全 Java 调度
Java并发编程:深入理解线程与锁
【4月更文挑战第18天】本文探讨了Java中的线程和锁机制,包括线程的创建(通过Thread类、Runnable接口或Callable/Future)及其生命周期。Java提供多种锁机制,如`synchronized`关键字、ReentrantLock和ReadWriteLock,以确保并发访问共享资源的安全。此外,文章还介绍了高级并发工具,如Semaphore(控制并发线程数)、CountDownLatch(线程间等待)和CyclicBarrier(同步多个线程)。掌握这些知识对于编写高效、正确的并发程序至关重要。
|
6天前
|
Java
浅谈Java的synchronized 锁以及synchronized 的锁升级
浅谈Java的synchronized 锁以及synchronized 的锁升级
8 0
|
8天前
|
存储 缓存 Java
线程同步的艺术:探索 JAVA 主流锁的奥秘
本文介绍了 Java 中的锁机制,包括悲观锁与乐观锁的并发策略。悲观锁假设多线程环境下数据冲突频繁,访问前先加锁,如 `synchronized` 和 `ReentrantLock`。乐观锁则在访问资源前不加锁,通过版本号或 CAS 机制保证数据一致性,适用于冲突少的场景。锁的获取失败时,线程可以选择阻塞(如自旋锁、适应性自旋锁)或不阻塞(如无锁、偏向锁、轻量级锁、重量级锁)。此外,还讨论了公平锁与非公平锁,以及可重入锁与非可重入锁的特性。最后,提到了共享锁(读锁)和排他锁(写锁)的概念,适用于不同类型的并发访问需求。
38 2
|
9天前
|
Java 程序员 编译器
Java中的线程同步与锁优化策略
【4月更文挑战第14天】在多线程编程中,线程同步是确保数据一致性和程序正确性的关键。Java提供了多种机制来实现线程同步,其中最常用的是synchronized关键字和Lock接口。本文将深入探讨Java中的线程同步问题,并分析如何通过锁优化策略提高程序性能。我们将首先介绍线程同步的基本概念,然后详细讨论synchronized和Lock的使用及优缺点,最后探讨一些锁优化技巧,如锁粗化、锁消除和读写锁等。
|
10天前
|
Java 编译器
Java并发编程中的锁优化策略
【4月更文挑战第13天】 在Java并发编程中,锁是一种常见的同步机制,用于保证多个线程之间的数据一致性。然而,不当的锁使用可能导致性能下降,甚至死锁。本文将探讨Java并发编程中的锁优化策略,包括锁粗化、锁消除、锁降级等方法,以提高程序的执行效率。
13 4

热门文章

最新文章