数据汇总从20s优化至2s(小经验)

news2024/11/20 3:22:32

目录

项目背景:

数据汇总访问时间长的问题:

解决方案:

1.创建参与访问表

2.使用redis进行优化

总结:


项目背景:

        一个简单的抽奖系统,当要统计每天的参与访问,总的参与访问

数据汇总访问时间长的问题:

        每次访问都会遍历整个订单表进行查询,当数据库数据多的时候会对数据库造成压力,也会更加耗时,初始查询20秒

解决方案:

        新建一张数据汇总表,例如拿总参与,总访问,每日参与,每日访问来说,遍历订单表查询是不太合理的,会占用大量的系统资源,可以利用redis的缓存递增来做,将一些数据临时放入redis里面,数据汇总的时候在持久化到mysql数据库中

1.创建参与访问表

sql语句:

CREATE TABLE `sb_access_count` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
  `created` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `access_count` int DEFAULT NULL COMMENT '当日访问量',
  `user_count` int NOT NULL DEFAULT '0' COMMENT '当天参与量',
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;

① 创建参与访问表,作为日数据的保存,每次访问我们的接口都在这个表里面累加1

         但是每次访问我们的接口,都会对数据库造成吃就会,也会对数据库造成压力,不合理,这里我们可以用redis进行优化

2.使用redis进行优化

①将每日参与访问保存至redis

        定义一个固定的Key加上当日的时间作为redis的key,value的值为每日的参与和访问,第一次访问的时候先查询一下看redis里面是否有值,没有的话就是存进去,然后是1,如果有值就redis缓存递增1

    public void activityDayAccessCount(String itemCode) {
        ActivityDO activityDO = activityDao.getActivityByCode(itemCode);
        if (activityDO == null) {
            logger.info("增加每日访问数量,查询不到该活动= " + itemCode);
            return;
        }
        RedisUtils redisUtils = MyApplicationContext.getBean(RedisUtils.class);
        Date date = new Date();
        String time = DateUtils.datePathyyyymmdd(date);
        //活动访问key
        String accessesKey = itemCode + MyConstant.DAY_ACCESSES + time;
        Integer sum = (Integer) redisUtils.get(accessesKey);
        if (sum == null) {
            int expireTime = 2 * 24 * 60 * 60;
            redisUtils.set(accessesKey, 1, expireTime);
        } else {
            //缓存递增
            redisUtils.incr(accessesKey, 1);
        }
    }

②持久化到数据库

有两种情况下会持久化到数据库

        第一种:写一个定时任务,每天定时持久化到数据库

        第二种:点击数据汇总的时候调用此方法,将redis最新的数据拉取到本地,在进行数据汇总

    public void task() {
        logger.info("参与访问数据落库========>");
        Date date = new Date();
        String time = DateUtils.datePathyyyymmdd(date);
        String acessKey = MyConstant.ACCESS_SUM_KEY + time;
        String userCanyuKey = MyConstant.PARTICIPAT_SUM_KEY + time;
        System.out.println("acessKey = " + acessKey);
        System.out.println("userCanyuKey = " + userCanyuKey);
        Integer accessCount = (Integer) redisUtils.get(acessKey);
        System.out.println("accessCount = " + accessCount);
        Integer userCount = (Integer) redisUtils.get(userCanyuKey);
        System.out.println("userCount = " + userCount);
        Date dayStart = DateUtils.getDayStart(date);
        Date dayEnd = DateUtils.getDayEnd(date);

        QueryWrapper<AccessCountDO> queryWrapper = new QueryWrapper();
        queryWrapper.ge("created", dayStart);
        queryWrapper.le("created", dayEnd);
        AccessCountDO accessCountDO = accessCountMapper.selectOne(queryWrapper.orderByDesc("id").last("limit 1"));
        if (accessCountDO == null) {
            accessCountDO = new AccessCountDO();
            if (accessCount == null) {
                accessCountDO.setAccessCount(0);
            } else {
                accessCountDO.setAccessCount(accessCount);
            }
            if (userCount == null) {
                accessCountDO.setUserCount(0);
            } else {
                accessCountDO.setUserCount(userCount);
            }
            accessCountMapper.insert(accessCountDO);
        } else {
            accessCountDO.setAccessCount(accessCount);
            accessCountDO.setUserCount(userCount);
            accessCountMapper.updateById(accessCountDO);
        }
}

        以上方法不用每次都查询订单表,尤其是订单表数据量过大的时候会很耗时,给用户造成不好的体验

总结:

        需要善用redis,redis作为缓存数据库性能非常高,尽量不要与mysql数据库进行交互,把一些非实时的数据缓存至redis,查询效率非常高!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/495636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运维高可用架构的 6 大常规方案

在介绍高可用架构的方案之前&#xff0c;先说一下什么是高可用架构&#xff0c;高可用架构应具备但不限于以下特征&#xff1a; 主从切换 很好理解&#xff0c;当其中一台机器的服务宕机后&#xff0c;对于服务调用者来说&#xff0c;能够迅速的切换到其他可用服务&#xff0c;…

俩小伙一晚上写了个 AI 应用,月入两万??(文末附开发教程)

开发出一款能够与 AI 对话生成和编辑思维导图的工具&#xff0c;听起来似乎只能是一群专业的 AI 背景团队花费大量的时间和精力训练模型&#xff0c;打磨应用才能完成的事情。 但是&#xff0c;两名大学生却在一夜之间完成了&#xff0c;就像炼金术士将庸俗的材料转化成黄金一…

吃掉脂肪,狂减33斤!午餐菜单一次性公开!

一周高效减脂蔬菜沙拉&#xff5c;上班族学生党减脂备餐便当 &#x1f618;我是4个月瘦30斤&#xff0c;减脂迫在眉睫&#xff0c;巨掉秤好吃的蔬菜沙拉来咯&#xff01;肉类提前备好放冷冻&#xff0c;工作日只需10分钟搞定&#xff0c;做减脂早午晚餐都可以哦&#xff5e; …

Mysql 中left join时 on、and、where区别

1、准备两张表student与class表 student class 2、left join on左连接 select * from student s left join class c on s.classId c.id 左表数据全部显示&#xff0c;关联到的右表数据显示&#xff0c;没有显示null 3、left join on ... and对左表student进行条件筛选 …

解决echarts图表随窗口宽度变化而改变图表的大小

文章目录 前言一、演示前后对比效果二、解決方法1.在代码结尾加上监听方法2.示例 三、总结扩展问题 前言 很多同学在使用echarts时遇到了浏览器窗口大小发生变化时&#xff0c;图表大小没有自适应窗口的宽度&#xff0c;下面我将对比演示随着窗口大小变化&#xff0c;echarts图…

(四)【平衡小车制作】陀螺仪MPU6050

一、硬件结构 1.什么是陀螺仪&#xff1f; 陀螺仪是用于测量或维护方位和角速度的设备。它是一个旋转的轮子或圆盘&#xff0c;其中旋转轴可以不受影响的设定在任何方向。当旋转发生时&#xff0c;根据角动量守恒定律&#xff0c;该轴的方向不受支架倾斜或旋转的影响。 2.MPU…

在Ubuntu18.04中安装uWebSockets库

目录 1.下载uWebSockets库2.下载uSockets3.安装openssl开发包4.编译首先说明这里使用的Ubuntu版本为18.04。 1.下载uWebSockets库 下载uWebSockets库有两种方式,一是终端,从Github中克隆uWebSockets库到Ubuntu本地文件夹,二是打开uWebSockets库下载链接自己下载到Windows,然…

Python实现将快手个人主页的视频进行无水印下载

前言 本文是该专栏的第26篇,后面会持续分享python的各种干货知识,值得关注。 笔者之前有详细介绍快手滑块验证码的识别方法(Python如何解决“快手滑块验证码”(4)),感兴趣的同学可往前翻阅查看。需要注意的是,滑块验证码的缺失距离需要根据你自己电脑的分辨率进行微调,…

STM32 i2c 驱动0.42寸OLED

STM32 i2c 驱动0.42寸OLED&#xff0c;这是个项目中使用的方案&#xff0c;调试也是比较费劲&#xff0c;主要是取字模和代码的匹配&#xff0c;下个篇章中详解一下取字模的过程&#xff0c;在这个方案中的使用。 本文使用的测试代码 STM32i2c驱动0.42寸OLED&#xff0c;SSD1…

体验 ChatGLM-6B

体验 ChatGLM-6B 1. 什么是 ChatGLM-6B2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 ChatGLM-6B6. 启动 ChatGLM-6B7. 访问 ChatGLM-6B8. API部署9. 命令行部署10. 其他&#xff0c;修改使用显存大小 1. 什么是 ChatGLM-6B ChatGLM-6B 是一个开源的、支持中英双语…

面了一个4年经验的测试工程师,自动化都不会也要18k,我真是醉了...

在深圳这家金融公司也待了几年&#xff0c;被别人面试过也面试过别人&#xff0c;大大小小的事情也见识不少&#xff0c;今天又是团面的一天&#xff0c; 一百多个人都聚集在一起&#xff0c;因为公司最近在谈项目出来面试就2个人&#xff0c;无奈又被叫到面试房间。 整个过程…

音频焦点使用及原理

音频焦点使用及原理 本博客代码基于Android 10源码 为什么会有音频焦点这一概念&#xff1f; 在Android音频领域中&#xff0c;应用层所有的App播放音频&#xff0c;最终都是走到音频回播线程PlaybackThread中&#xff0c;如果多个App都走到同一个PlaybackThread中去&#xff0…

chat错误代码1020是什么原因导致的-解决chat错误代码1020

ChatGPT拒绝访问1020是什么原因 ChatGPT拒绝访问1020可能是因为服务器故障、网络连接问题或者人工智能模型正在进行训练或调整等原因所致。一般来说&#xff0c;ChatGPT会在进行维护、升级或训练时暂停服务&#xff0c;这可能导致用户在访问ChatGPT时遇到拒绝访问的情况。在该…

2023年淮阴工学院五年一贯制专转本财务管理基础考试大纲

2023年淮阴工学院五年一贯制专转本财务管理基础考试大纲 一、考核对象 本课程的考核对象为五年一贯制高职专转本财务管理专业入学考试普通在校生考生。 二、考核方式 本课程考核采用闭卷笔试的方式。 三、命题依据及原则 1、命题依据 本课程考核命题教材为靳磊编著&…

2023年会展服务研究报告

第一章 行业概况 会展行业是指一系列与会议、展览、展示相关的服务和经济活动的总称&#xff0c;是加强企业间交流、促进合作和推动经济发展的重要手段。该行业涉及广泛&#xff0c;包括会议和展览的组织、场地租赁和设计、活动策划和执行、展品运输和咨询服务等各个环节。随着…

每个人都可以用来提高生产力的「项目管理策略」

与以往相比&#xff0c;越来越多的公司为员工提供混合办公&#xff08;办公室工作远程办公&#xff09;和远程办公的选择&#xff0c;这实际是出于对效率的强需求。 尽管员工的工作时间增加了&#xff0c;但办公室等工作场所的工作效率正在以几十年来最快的速度下降。专家们列…

一起了解可以用手机操作显示的BOD水质检测仪

什么叫BOD&#xff08;生化需氧量&#xff09;&#xff1a; BOD是指表示水中有机化合物等需氧物质含量的一个综合指标。当水中所含有机物与空气接触时&#xff0c;由于需氧微生物的作用而分解&#xff0c;使之无机化或气体化时所需消耗的氧量。 生化需氧量&#xff0c;以毫克/升…

震惊,为了学会泛型类竟做这种事?!

上一节&#xff0c;我们基本学会了Java泛型类的用法。 传送门&#xff1a;彻底弄懂Java的泛型 - 泛型类 这一节&#xff0c;我们转变一下风格&#xff0c;具体是什么风格呢&#xff0c;你马上就懂了。 宝子们&#xff0c;欢迎大家来到我们的泛型直播间&#xff0c;这一讲呢&a…

通过gulp+rollup从零到一搭建前端组件库

核心要点 通过 webpack 搭建运行环境通过 gulp 执行编译流程通过 rollup 编译组件代码编写 组件测试 组件打包 编译组件上传 npm 1、通过 webpack 搭建运行环境 这里主要是创建一个可以运行的测试的组件的环境&#xff0c;全局安装vue-cli脚手架&#xff0c;并初始化项目 v…

代码提交格式化工具---prettier的使用与配置

为什么要格式化代码 我们在合作写项目的时候&#xff0c;因为每个人的代码书写习惯以及编辑器的配置都不相同&#xff0c;这样就可能导致我们写的代码的格式都完全不一样&#xff0c;有的代码格式看起来也比较难以阅读&#xff0c;那么prettierd就由此产生了。 Prettier是一个…