Spring Boot接口请求响应慢,超过10秒以上,如无法优化SQL或代码的情况下,建议写入数据库或缓存中,请求接口时从数据库或缓存中读取返回

举例

@Override
public Map<String, Object> getCockpitStaffAttendanceTask() {Map<String, Object> map = new HashMap<>();int chuqin = 0; //出勤int queqin = 0; //缺勤int chidao = 0; //迟到int zaotui = 0; //早退//获取所有设备卡号 并且已经绑定了人List<CardDeviceInfo> cardDeviceInfoList = cardDeviceInfoService.list(new LambdaQueryWrapper<CardDeviceInfo>().isNotNull(CardDeviceInfo::getStaffId).eq(CardDeviceInfo::getCardStatus,0));for (CardDeviceInfo cardDeviceInfo : cardDeviceInfoList) {if (StringUtils.isNotEmpty(cardDeviceInfo.getLandId()) && StringUtils.isNotEmpty(cardDeviceInfo.getJobTimeId())){//判断当天是否有轨迹CardDeviceTrajectoryInfo cardDeviceTrajectoryInfosToDay = sanitationJobStatisticsMapper.selectToDayTrajectory(cardDeviceInfo.getImei());if (ObjectUtils.isNotEmpty(cardDeviceTrajectoryInfosToDay)){chuqin += 1;}else{queqin += 1;}//先处理作业地块和作业时间String landId = cardDeviceInfo.getLandId();String[] jobTypeSplit = cardDeviceInfo.getJobTimeId().split(",");List<String> jobTypeStartTimeList = new ArrayList<>();List<String> jobTypeEndTimeList = new ArrayList<>();List<String> geomList = sanitationJobStatisticsMapper.getGeomByLandId(Integer.parseInt(landId));for (String jobTypeId : jobTypeSplit) {// (防止多个时间段)根据作业类型编号 获取 作业时间段的开始时间以及结束时间 xml中使用forEach提取List<SanitationRoadOperationTimeInfo> list = sanitationRoadOperationTimeInfoService.lambdaQuery().eq(SanitationRoadOperationTimeInfo::getPid, Integer.parseInt(jobTypeId)).list();list.forEach(l -> {jobTypeStartTimeList.add(l.getStartTime().toString());jobTypeEndTimeList.add(l.getEndTime().toString());});}//获取最早的一条CardDeviceTrajectoryInfo chuQinTrajectory = sanitationJobStatisticsMapper.getChuQinCdTrajectory(cardDeviceInfo.getImei(), geomList);//获取最晚的一条CardDeviceTrajectoryInfo chuQinTrajectoryDesc = sanitationJobStatisticsMapper.getChuQinTrajectoryDesc(cardDeviceInfo.getImei(), geomList);//判断是否迟到if (ObjectUtils.isNotEmpty(chuQinTrajectory)){Boolean ifChiDao = sanitationJobStatisticsMapper.ifChiDao(chuQinTrajectory.getGpsTime(), jobTypeStartTimeList);if (ifChiDao){chidao += 1;}}//如果时间到达晚上17点30 则统计是否有早退人员LocalTime now = LocalTime.now(); // 获取当前时间if (now.isAfter(LocalTime.of(17, 30))) {CardDeviceTrajectoryInfo chuQinTrajectoryZt = sanitationJobStatisticsMapper.getChuQinZtTrajectory(cardDeviceInfo.getImei(), geomList);//判断是否早退if (ObjectUtils.isNotEmpty(chuQinTrajectoryZt)){Boolean ifZaoTui = sanitationJobStatisticsMapper.ifZaoTui(chuQinTrajectoryDesc.getGpsTime(), jobTypeEndTimeList);if (ifZaoTui){zaotui += 1;}}}}}map.put("chuqin",chuqin);map.put("queqin",queqin);map.put("chidao",chidao);map.put("zaotui",zaotui);return map;
}

查询消耗了38秒左右

在这里插入图片描述

1、定时写入数据库,从数据库中读取

如果数据量较大,字段较多,需要存储历史记录,则存入数据库会好些,存入数据库就是基本的insert语句,接口直接调用select查询出来就行了!

2、定时写入Redis缓存、从缓存中读取

如果数据量较少,字段较少,不需要存储历史记录的,可以直接存到Redis缓存里,接口需要的时候直接从Redis中取出即可!

package com.yutu.garden.task;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.yutu.garden.entity.CardDeviceInfo;
import com.yutu.garden.entity.CardDeviceTrajectoryInfo;
import com.yutu.garden.entity.SanitationRoadOperationTimeInfo;
import com.yutu.garden.mapper.gardens.SanitationJobStatisticsMapper;
import com.yutu.garden.service.CardDeviceInfoService;
import com.yutu.garden.service.SanitationRoadOperationTimeInfoService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;@Component
@EnableScheduling
//@ConditionalOnProperty(name = "scheduled.tasks.enabled", havingValue = "true")
@EnableAsync
public class CockpitStaffAttendanceTask {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Resourceprivate CardDeviceInfoService cardDeviceInfoService;@Resourceprivate SanitationJobStatisticsMapper sanitationJobStatisticsMapper;@Resourceprivate SanitationRoadOperationTimeInfoService sanitationRoadOperationTimeInfoService;//缓存到Redis中//每5分钟执行一次@Scheduled(cron = "0 */5 * * * ?")public void cockpitStaffAttendanceTask() {int chuqin = 0; //出勤int queqin = 0; //缺勤int chidao = 0; //迟到int zaotui = 0; //早退//获取所有设备卡号 并且已经绑定了人List<CardDeviceInfo> cardDeviceInfoList = cardDeviceInfoService.list(new LambdaQueryWrapper<CardDeviceInfo>().isNotNull(CardDeviceInfo::getStaffId).eq(CardDeviceInfo::getCardStatus,0));for (CardDeviceInfo cardDeviceInfo : cardDeviceInfoList) {if (StringUtils.isNotEmpty(cardDeviceInfo.getLandId()) && StringUtils.isNotEmpty(cardDeviceInfo.getJobTimeId())){//判断当天是否有轨迹CardDeviceTrajectoryInfo cardDeviceTrajectoryInfosToDay = sanitationJobStatisticsMapper.selectToDayTrajectory(cardDeviceInfo.getImei());if (ObjectUtils.isNotEmpty(cardDeviceTrajectoryInfosToDay)){chuqin += 1;}else{queqin += 1;}//先处理作业地块和作业时间String landId = cardDeviceInfo.getLandId();String[] jobTypeSplit = cardDeviceInfo.getJobTimeId().split(",");List<String> jobTypeStartTimeList = new ArrayList<>();List<String> jobTypeEndTimeList = new ArrayList<>();List<String> geomList = sanitationJobStatisticsMapper.getGeomByLandId(Integer.parseInt(landId));for (String jobTypeId : jobTypeSplit) {// (防止多个时间段)根据作业类型编号 获取 作业时间段的开始时间以及结束时间 xml中使用forEach提取List<SanitationRoadOperationTimeInfo> list = sanitationRoadOperationTimeInfoService.lambdaQuery().eq(SanitationRoadOperationTimeInfo::getPid, Integer.parseInt(jobTypeId)).list();list.forEach(l -> {jobTypeStartTimeList.add(l.getStartTime().toString());jobTypeEndTimeList.add(l.getEndTime().toString());});}//获取最早的一条CardDeviceTrajectoryInfo chuQinTrajectory = sanitationJobStatisticsMapper.getChuQinCdTrajectory(cardDeviceInfo.getImei(), geomList);//获取最晚的一条CardDeviceTrajectoryInfo chuQinTrajectoryDesc = sanitationJobStatisticsMapper.getChuQinTrajectoryDesc(cardDeviceInfo.getImei(), geomList);//判断是否迟到if (ObjectUtils.isNotEmpty(chuQinTrajectory)){Boolean ifChiDao = sanitationJobStatisticsMapper.ifChiDao(chuQinTrajectory.getGpsTime(), jobTypeStartTimeList);if (ifChiDao){chidao += 1;}}//如果时间到达晚上17点30 则统计是否有早退人员LocalTime now = LocalTime.now(); // 获取当前时间if (now.isAfter(LocalTime.of(17, 30))) {CardDeviceTrajectoryInfo chuQinTrajectoryZt = sanitationJobStatisticsMapper.getChuQinZtTrajectory(cardDeviceInfo.getImei(), geomList);//判断是否早退if (ObjectUtils.isNotEmpty(chuQinTrajectoryZt)){Boolean ifZaoTui = sanitationJobStatisticsMapper.ifZaoTui(chuQinTrajectoryDesc.getGpsTime(), jobTypeEndTimeList);if (ifZaoTui){zaotui += 1;}}}}}redisTemplate.opsForValue().set("schuqin", String.valueOf(chuqin));redisTemplate.opsForValue().set("squeqin", String.valueOf(queqin));redisTemplate.opsForValue().set("schidao", String.valueOf(chidao));redisTemplate.opsForValue().set("szaotui", String.valueOf(zaotui));}//打印测试@Scheduled(cron = "0 */1 * * * ?")public void getRedisValue(){String chuqin = (String) redisTemplate.opsForValue().get("chuqin");String queqin = (String) redisTemplate.opsForValue().get("queqin");String chidao = (String) redisTemplate.opsForValue().get("chidao");String zaotui = (String) redisTemplate.opsForValue().get("zaotui");System.out.println("打印出勤:"+chuqin);System.out.println("打印缺勤:"+queqin);System.out.println("打印迟到:"+chidao);System.out.println("打印早退:"+zaotui);}
}

不到1秒,从Redis中提取
在这里插入图片描述

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

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

相关文章

MS-DETR: Efficient DETR Training with Mixed Supervision论文学习笔记

论文地址&#xff1a;https://arxiv.org/pdf/2401.03989.pdf 代码地址&#xff08;中稿后开源&#xff09;&#xff1a;GitHub - Atten4Vis/MS-DETR: The official implementation for "MS-DETR: Efficient DETR Training with Mixed Supervision" 摘要 DETR 通过迭代…

微调您的Embedding模型以最大限度地提高RAG管道中的相关性检索

英文原文地址&#xff1a;https://betterprogramming.pub/fine-tuning-your-embedding-model-to-maximize-relevance-retrieval-in-rag-pipeline-2ea3fa231149 微调您的Embedding模型以最大限度地提高RAG管道中的相关性检索 微调嵌入前后的 NVIDIA SEC 10-K 文件分析 2023 年…

高效工作法:占位图片生成工具助力项目快速迭代

在现代设计和开发项目中&#xff0c;图片资源的重要性不言而喻。然而&#xff0c;项目中经常会遇到寻找合适图片、调整图片尺寸和格式等问题&#xff0c;这些问题不仅耗时耗力&#xff0c;还可能影响到项目的进度和质量。此时&#xff0c;占位图片生成工具应运而生&#xff0c;…

Jmeter 测试脚本录制器-HTTP 代理服务器

Jmeter 测试脚本录制器-HTTP 代理服务器 Jmeter 配置代理服务器代理服务器获取请求地址示例图配置步骤 浏览器配置代理Google 浏览器插件配置代理windows 本地网络配置代理 启动录制&#xff0c;生成证书生成证书导入证书Jmeter 配置证书 浏览器点击页面&#xff0c;录制请求地…

【算法与数据结构】343、LeetCode整数拆分

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;博主做这道题的时候一直在思考&#xff0c;如何找到 k k k个正整数&#xff0c; k k k究竟为多少合适。…

linux终端查看文件

ls 命令&#xff1a;ls 命令用于列出当前目录下的文件和子目录。默认情况下&#xff0c;它以字母顺序列出文件和目录的名称。例如&#xff0c;要列出当前目录下的所有文件和目录&#xff0c;可以运行以下命令&#xff1a; ls ls -l 命令&#xff1a;ls -l 命令以长格式显示文件…

Nacos 高级详解

一 、服务集群 1 需求 服务提供者搭建集群 服务调用者&#xff0c;依次显示集群中各服务的信息 2 搭建 1&#xff09;修改服务提供方的controller&#xff0c;打印服务端端口号 package com.czxy.controller;import org.springframework.web.bind.annotation.*;import …

数据结构学习 jz39 数组中出现次数超过一半的数字

关键词&#xff1a;排序 摩尔投票法 摩尔投票法没学过所以没有想到&#xff0c;其他的都自己想。 题目&#xff1a;库存管理 II 方法一&#xff1a; 思路&#xff1a; 排序然后取中间值。因为超过一半所以必定在中间值是我们要的结果。 复杂度计算&#xff1a; 时间复杂度…

大数据Doris(五十六):SQL函数之地理位置函数

文章目录 SQL函数之地理位置函数 一、​​​​​​​ST_AsText(GEOMETRY geo)

电阻表示方法和电路应用

电阻 电阻的表示方法 直标法 直标法是将电阻器的类别及主要技术参数的数值直接标注在电阻器表面上 通常用3位阿拉伯数字来标注片状电阻的阻值&#xff0c;其中第1位数代表阻值的第1位有效数&#xff1b;第2位数代表阻值的第二位有效数字&#xff1b;第3位数代表阻值倍率&…

L1-025 正整数A+B(Java)

题的目标很简单&#xff0c;就是求两个正整数A和B的和&#xff0c;其中A和B都在区间[1,1000]。稍微有点麻烦的是&#xff0c;输入并不保证是两个正整数。 输入格式&#xff1a; 输入在一行给出A和B&#xff0c;其间以空格分开。问题是A和B不一定是满足要求的正整数&#xff0…

Oracle常见操作

知识点1&#xff1a;格式化日期 select to_char(sysdate,yyyy-MM-dd HH:mm:ss) as time from dual;运行截图&#xff1a; 知识点2&#xff1a;解锁用户 alter user test account unlock;知识点3&#xff1a;修改密码 alter user test identified by test2;知识点4&#xff…

【分布式技术专题】「架构实践于案例分析」盘点互联网应用服务中常用分布式事务(刚性事务和柔性事务)的原理和方案

微服务架构的分布式事务解决方案 前提介绍知识系统回顾事务ACID事务的难点刚性事务和柔性事务 刚性事务优点局限 分布式事务全局事务&#xff08;DTP模型&#xff09;— 标准分布式事务全局事务(DTP模型) — XAXA接口的实现XA的2PC机制2PC机制的分析 2PC机制的局限 JavaEE平台中…

城市信息模型平台顶层设计与实践-CIM-读书笔记

城市信息模型平台顶层设计与实践-CIM-读书笔记 1、地理空间框架 GB/T 30317—2013《地理空间框架基本规定》规定地理空间框架为&#xff1a;“地理信息数据及其采集、加工、交换、服务所涉及的政策、法规、标准、技术、设施、机制和人力资源的总称&#xff0c;由基础地理信息…

小程序中使用微信同声传译插件实现语音识别、语音合成、文本翻译功能----语音合成(二)

官方文档链接&#xff1a;https://mp.weixin.qq.com/wxopen/plugindevdoc?appidwx069ba97219f66d99&token370941954&langzh_CN#- 要使用插件需要先在小程序管理后台的设置->第三方设置->插件管理中添加插件&#xff0c;目前该插件仅认证后的小程序。 语音合成…

排序算法之八:计数排序

1.计数排序思想 计数排序&#xff0c;顾名思义就是计算数据的个数 计数排序又称非比较排序 思想&#xff1a;计数排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用。 操作步骤&#xff1a; 统计相同元素出现次数 根据统计的结果将序列回收到原来的序列中 计数…

HNU-算法设计与分析-实验2

算法设计与分析实验2 计科210X 甘晴void 202108010XXX 目录 文章目录 算法设计与分析<br>实验21 用动态规划法实现0-1背包问题重述想法代码验证算法分析 2 用贪心算法求解背包问题问题重述想法代码验证算法分析 3 半数集问题&#xff08;实现题2-3&#xff09;问题重述…

Ubuntu 22.04 安装Fail2Ban

Fail2Ban是一种用来防止暴力破解的工具&#xff0c;一般要和iptables配合使用。其原理是读取系统日志&#xff0c;并通过正则表达式匹配&#xff0c;监控IP在一段时间内的登录尝试、身份验证失败日志等并进行计数。超过阈值则进行IP封禁&#xff0c;过一段时间后再解封。 总的…

ant design vue Tree组件叶子节点横向排列

antdesignvue的树形组件要实现组件叶子节点横向排列有点坑&#xff0c;没有 配置属性&#xff0c;需要自己想办法。 要实现的效果 看tree组件的dom结构&#xff0c;父元素flex竖向布局&#xff0c;子项不论节点层级都在同一层&#xff01;&#xff01;&#xff01; 难点在于想…

8个 Python 开发者必备的 PyCharm 插件

这8个顶级插件保证了更快、更轻松、更愉悦的开发过程。 在 PyCharm 插件列表中&#xff0c;我们发现了几个瑰宝插件&#xff0c;它们各自以独特的方式帮助开发者快速、简便、愉悦地开发。 今天我就给大家逐个介绍它们。 1. Key Promoter X 【下载链接】&#xff1a;https://…