一次JAVA接口优化记录

目录

  • 一次接口优化记录
    • 首先考虑,添加缓存
      • 缓存策略
      • 方案一:本地缓存
      • 方案二:Redis缓存
    • 优化结果
      • 原因分析:
      • 原因验证
    • 接口数据分析
      • 将响应数据返回大小减少
      • compression压缩配置
      • 完美(代指这里的小系统)

一次接口优化记录

背景:一个查询文章的接口,有分页,一台二核四G的小服务器。redis也是这台机子搭的单机Redis.
查询速度:QPS在1-10之间。响应速度在一秒以上,可以说是极其的慢了。压力测试直接压到了100秒以上的响应速度。

在这里插入图片描述

首先考虑,添加缓存

缓存策略

缓存策略
步骤:
1、http请求过来
2、根据查询条件,单表走索引查询结果ID
3、根据结果ID去缓存中查询数据,返回结果集
4、判断是否都有缓存,没有的单独拎出来去查询数据库
5、将数据库查询结果添加到缓存中去。
6、将所有结果返回。

方案一:本地缓存

    public static ConcurrentHashMap<Long, SysArticle> cache = new ConcurrentHashMap<>();private ArrayList<SysArticle> getSysArticlesByMapCache(List<Long> longs){List<Long> noHitIdList = new ArrayList<>();ArrayList<SysArticle> list = new ArrayList<>();// 根据Map从中查找IDfor (Long aLong : longs) {if(cache.containsKey(aLong)){list.add(cache.get(aLong));}else{noHitIdList.add(aLong);}}// 没查询到的从数据库中查询后放入Mapif (noHitIdList != null &&noHitIdList.size() > 0){List<SysArticle> articles = sysArticleService.selectSysArticleByArticleIds(noHitIdList.toArray(new Long[]{}), "");list.addAll(articles);for (SysArticle a : articles){cache.put(a.getArticleId(),a);}}return list;}}

方案二:Redis缓存

    private ArrayList<SysArticle> getSysArticlesByRedisCache(List<Long> longs) {// 文章ID集Set idSet = new HashSet();for (Long aLong : longs) {idSet.add(String.valueOf(aLong));}// 根据ID集查询redis缓存Map<String, Object> articleMap = RedisUtils.getMultiCacheMapValue(CACHE_KEY, idSet);// 查看是否有没有缓存的文章,没有则添加到待查询列表List<Long> noHitIdList = new ArrayList<>(articleMap.size());for (Long id: longs){if (!articleMap.containsKey(String.valueOf(id))){noHitIdList.add(id);}}ArrayList<SysArticle> list = new ArrayList<>();for (Map.Entry<String, Object> longObjectEntry : articleMap.entrySet()) {list.add((SysArticle) longObjectEntry.getValue());}if(noHitIdList.size() > 0) { // 找出不存在的缓存,添加进去// 根据ID直接查询文章List<SysArticle> articles = sysArticleService.selectSysArticleByArticleIds(noHitIdList.toArray(new Long[]{}), "");if (articles != null && articles.size() > 0) {// 添加到缓存,并且添加到返回列表中Map<String, SysArticle> collect = new HashMap<>();for (SysArticle a : articles) {collect.put(String.valueOf(a.getArticleId()), a);}RedisUtils.setCacheMap(CACHE_KEY, collect);list.addAll(articles);}}return list;}

优化结果

优化结果不明显。可以说是一点都没进步。甚至还退步。
主要还是第三个接口的响应时间过久。
在这里插入图片描述

原因分析:

1、线程池线程数量不足?
2、JVM空间不够,频繁回收?
3、Nginx有限制?
4、Redis性能过差?
5、网络带宽过低?

原因验证

线程池线程数量不足?

扩大线程池数量,发现依旧不变。排除,况且业务并不繁忙,仅是简单的查询数据。

JVM空间不够,频繁回收?

使用率基本不超过20%,也排除。

Nginx有限制?

直接访问ip请求,不走nginx,发现速度也没变化

Redis性能过差?

直接在本机搭建Redis,减少网络带宽。况且redis可是能处理过万的并发。我这才几百。依旧没有变化。

网络带宽过低?

可其他接口访问也不低呀,为啥偏偏你就低。

接口数据分析

在这里插入图片描述

我:突然发现,一个接口返回50多KB。这接口返回的什么呀,这么大,

嗯: 返回了一大段的长文本文子。难怪那么大。

我: 看来也不是非必要数据,去除看看效果。

在这里插入图片描述

将响应数据返回大小减少

在这里插入图片描述

这就很舒服了。。。

等等,我觉得这个10kB还能优化。我记得SpringBoot有一个压缩响应的配置的。再运用看看

compression压缩配置

server:compression:#是否对响应数据开启gzip压缩,默认falseenabled: true#对指定的响应类型进行压缩,值是数组,用逗号隔开mime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml

开启压缩后

在这里插入图片描述

再来压测一波

完美(代指这里的小系统)

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

CentOS 的常见命令

CentOS 是一种广泛使用的 Linux 发行版&#xff0c;特别在服务器环境中。本文将详细介绍 CentOS 中常见的命令&#xff0c;以便帮助用户在操作系统中有效地进行各种操作。下面介绍一下文件和目录操作、用户和权限管理、系统信息查看、软件包管理以及网络配置等方面的命令。 一…

应用层协议【HTTP和HTTPS】

1.概念 1.1 协议 协议是指在计算机通信和网络通信中&#xff0c;为了实现数据交换而建立的一套规则、约定或者标准。它定义了通信双方之间的通信格式、传输方式、数据的含义、错误处理等细节&#xff0c;从而确保通信的可靠性、有效性和安全性。 >1在计算机网络中&#x…

注册讲堂 | 体外诊断试剂分类目录的变化

5月11日&#xff0c;千呼万唤的《体外诊断试剂分类目录》&#xff08;2024年第58号&#xff09;终于发布&#xff01; 前世今生 2013年&#xff1a;《6840 体外诊断试剂分类子目录&#xff08;2013版&#xff09;》&#xff08;以下简称2013版目录&#xff09; 2017年&#xff…

苹果永久版安装PD虚拟机:Parallels Desktop 19 一键激活版

Parallels Desktop 19是一款功能强大的虚拟机软件&#xff0c;专为Mac用户设计&#xff0c;允许用户在同一台Mac电脑上同时运行Windows、Linux等多个操作系统&#xff0c;而无需额外的硬件设备。 下载地址&#xff1a;https://www.macz.com/mac/9581.html?idOTI2NjQ5Jl8mMjcuM…

Kubernetes入门:核心概念

集群架构与组件 一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成&#xff0c;每个节点上都会安装不同的组件。 master&#xff1a;集群的控制平面&#xff0c;负责集群的决策 ( 管理 ) api-server : 资源操作的唯一入口&#xff0c;接收用户输入的命令&…

文本控件Text Control示例: 将图像插入 TX 的各种方法

TX Text Control 是一款功能类似于 MS Word 的文字处理控件&#xff0c;包括文档创建、编辑、打印、邮件合并、格式转换、拆分合并、导入导出、批量生成等功能。广泛应用于企业文档管理&#xff0c;网站内容发布&#xff0c;电子病历中病案模板创建、病历书写、修改历史、连续打…

在Linux上面部署ELK

注明&#xff1a;一下的软件需要自己准备 一、准备环境&#xff1a; 1.两台elasticsearch主机4G内存 2.两台elasticsearch配置主机名node1和node2(可以省略) #vim /etc/hostname #reboot 3. 两台elasticsearch配置hosts文件 #vim /etc/hosts 192.168.1.1 node1 192…

RTMP低延迟推流

人总是需要压力才能进步, 最近有个项目, 需要我在RK3568上, 推流到公网, 最大程度的降低延迟. 废话不多说, 先直接看效果: 数据经过WiFi发送到Inenter的SRS服务器, 再通过网页拉流的. 因为是打金任务, 所以逼了自己一把, 把RTMP推流好好捋一遍. 先说说任务目标, 首先是MPP编码…

【Altium】AD-检查原理图中元器件未连接的Passive Pin

1、 文档目标 如何让原理图编译时找出元器件上未连接的Passive Pin 2、 问题场景 当引脚属性&#xff08;Pin type&#xff09;为passive时&#xff0c;原理图编译的默认规则是不会去检查它们是否有连接的。在实际设计过程中&#xff0c;经常会有导线虚连&#xff0c;漏连的事…

医疗传感器种类不断增多 市场规模逐渐扩大

医疗传感器种类不断增多 市场规模逐渐扩大 医疗传感器是将人体的生理信息转换为电信息的变换装置。医疗传感器具有高灵敏度、高精度、实时监测等优点&#xff0c;可以检测佩戴者的心率、呼吸频率、活动量等&#xff0c;从而更加准确地了解身体情况。   经过多年发展&#…

【极简】docker常用操作

镜像images是静态的 容器container是动态的&#xff0c;是基于镜像的&#xff0c;类似于一个进程。 查看docker images&#xff1a; docker images 或者docker image ls 查看docker container情况&#xff1a;docker ps -a&#xff0c;-a意思是--all 运行一个container: doc…

数字水印 | 奇异值分解 SVD 的 Python 代码实现

&#x1f951;原理&#xff1a;数字水印 | 奇异值分解 SVD 的定义、原理及性质 &#x1f951;参考&#xff1a;Python 机器学习笔记&#xff1a;奇异值分解&#xff08;SVD&#xff09;算法 正文 对于一个图像矩阵&#xff0c;我们总可以将其分解为以下形式&#xff1a; 通过…

使用API有效率地管理Dynadot域名,默认将域名隐形转发至其他界面

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

【大模型微调】一文掌握7种大模型微调的方法

本篇文章深入分析了大型模型微调的基本理念和多样化技术&#xff0c;细致介绍了LoRA、适配器调整(Adapter Tuning)、前缀调整(Prefix Tuning)等多个微调方法。详细讨论了每一种策略的基本原则、主要优点以及适宜应用场景&#xff0c;使得读者可以依据特定的应用要求和计算资源限…

openGauss一主两备集群异常断电后不能正常启动的解决过程简记

背景 因异常断电后opengauss 5.0.0版本&#xff0c;一主两备集群启动失败。 报错不是主机&#xff0c;由于当时没有截图&#xff0c;查看日志后发现报错是&#xff1a; 定位过程 Day1 1. 尝试用另外两台机器启动每台机器 发现都报错自己不是主机&#xff0c;像极了唐僧被妖…

哪款桌面便签app能帮助我提升工作效率

作为上班族&#xff0c;我们每天都要处理大量的工作事项&#xff0c;从策划方案到处理邮件&#xff0c;每一个环节都需高效且有条不紊。在这样的工作环境下&#xff0c;提升效率显得尤为重要。而选择一款优秀的桌面便签app&#xff0c;无疑是提高工作效率的关键。 桌面便签app…

【数据结构】数据结构大汇总 {数据结构的分类总结:定义和特性、实现方式、操作与复杂度、适用场景、相关算法、应用实例}

一、线性结构 1.1 顺序表 定义和特性&#xff1a;顺序表是一种线性表的存储结构&#xff0c;它采用一段地址连续的存储单元依次存储线性表中的元素。顺序表具有随机访问的特性&#xff0c;即可以通过元素的下标直接访问元素。 实现方式&#xff1a;顺序表可以通过数组来实现&…

基于51单片机的非接触式无线红外测温

基于51单片机的无线红外测温 &#xff08;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.采用红外温度传感器测温并用LCD1602显示&#xff1b; 2.按键为启动按键、保存按键、显示数据按键&#xff0c;可以实现对温度数值的控制…

【制作100个unity游戏之26】unity2d横版卷轴动作类游戏6(附带项目源码)

最终效果 系列导航 文章目录 最终效果系列导航前言敌人动画配置撞墙判断敌人基本AI逻辑实现 野猪受伤死亡死亡敌人死亡时&#xff0c;还是会对人物产生伤害有限状态机&抽象类多态 定义不同状态的敌人行为防止野猪在悬崖掉下去野猪的追击状态的转换敌人主动查找玩家 追击状态…

基于微信小程序+JAVA Springboot 实现的【智慧乡村旅游服务平台】app+后台管理系统 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称&#xff1a; 基于微信小程序的智慧乡村旅游服务平台的设计与实现 项目技术栈 该项目采用了以下核心技术栈&#xff1a; 后端框架/库&#xff1a; Java SSM框架数据库&#xff1a; MySQL前端技术&#xff1a; 微信开发者工具、uni-app其他技术&#xff1a…