当前位置: 首页 > wzjs >正文

网站备案加链接代码全球热门网站排名

网站备案加链接代码,全球热门网站排名,ps做产品的网站,网站服务器配置参考指南在电商系统中,分类树查询是一个基础且高频的功能,然而这个看似简单的功能背后却隐藏着不小的性能挑战。本文将分享我们在实际项目中对分类树查询功能进行五次优化的全过程,看如何将查询耗时从 2 秒缩短至 0.1 秒,为用户提供更流畅…

在电商系统中,分类树查询是一个基础且高频的功能,然而这个看似简单的功能背后却隐藏着不小的性能挑战。本文将分享我们在实际项目中对分类树查询功能进行五次优化的全过程,看如何将查询耗时从 2 秒缩短至 0.1 秒,为用户提供更流畅的体验。

一、初始版本:从数据库直接查询

我们的项目采用 Spring Boot 框架,前端使用 Thymeleaf 模板引擎进行动态渲染。在项目初期,为了快速开发功能,分类树查询接口直接从数据库中查询分类数据,组装成分类树后返回给前端。

这种简单直接的方式虽然快速实现了功能,但随着分类数据的不断增加,性能问题很快暴露出来。在开发环境中,当分类数量较多时,接口响应时间逐渐变长,甚至达到了 2 秒,严重影响了用户体验。

二、第一次优化:引入 Redis 缓存

面对性能瓶颈,我们首先想到的是添加 Redis 缓存。优化后的流程如下:

  1. 用户访问接口获取分类树时,先从 Redis 中查询数据。
  2. 如果 Redis 中有数据,直接返回。
  3. 如果 Redis 中没有数据,从数据库中查询数据,拼接成分类树返回。
  4. 将从数据库中查到的分类树数据保存到 Redis 中,设置过期时间为 5 分钟。

通过这种方式,大部分请求可以直接从 Redis 中获取数据,减少了数据库的访问压力。经过测试,开发环境的接口响应时间得到了明显改善,联调和自测顺利完成。

三、第二次优化:异步定期更新缓存

将功能部署到测试环境后,初期测试没有发现问题,但随着测试的深入,隔一段时间就会出现首页访问很慢的情况。分析发现,当 Redis 缓存过期时,大量请求同时访问数据库,导致数据库压力过大,从而影响了性能。

为了解决这个问题,我们决定使用 Job 定期异步更新分类树到 Redis 中。具体优化措施如下:

  1. 增加一个 Job,每隔 5 分钟执行一次,从数据库中查询分类数据,封装成分类树,更新到 Redis 缓存中。
  2. 保留原来的分类树同步写入 Redis 的逻辑,以防止 Redis 突然挂掉。
  3. 将 Redis 的过期时间改为永久。

这次优化后,测试环境再也没有出现分类树查询的性能问题。

四、第三次优化:添加内存缓存

在网站即将上线前,我们对首页进行了压力测试,发现最大 QPS 只有 100 多,性能瓶颈依然存在。经过分析,我们发现每次都从 Redis 获取分类树是导致性能问题的主要原因。

于是,我们决定添加内存缓存。考虑到分类数据更新频率较低,即使不同服务器节点的内存缓存数据存在短暂的不一致,也不会对用户造成太大影响,因此选择使用 Spring 推荐的 Caffeine 作为内存缓存。优化后的流程如下:

  1. 用户访问接口时,先从本地内存缓存中查询分类树数据。
  2. 如果本地缓存有数据,直接返回。
  3. 如果本地缓存没有数据,从 Redis 中查询数据。
  4. 如果 Redis 中有数据,将数据更新到本地缓存中,然后返回。
  5. 如果 Redis 中也没有数据(说明 Redis 挂了),从数据库中查询数据,更新到 Redis 中,然后更新到本地缓存中,返回数据。
  6. 设置本地缓存的过期时间为 5 分钟,以便获取新的数据。

这次优化效果显著,再次进行压力测试时,QPS 提升到了 500 多,满足了上线要求。

五、第四次优化:开启 GZip 压缩

使用了很长一段时间都没有出现问题。但两年后的一天,有用户反馈网站首页有点慢。经过排查,我们发现分类树的数据已经增加到了上万个,一次性返回的数据量太大,导致网络传输耗时较长。

针对这个问题,我们想到了开启 Nginx 的 GZip 功能,让数据在传输之前先进行压缩。之前调用接口返回的分类树数据大小为 1MB,开启 GZip 压缩后,数据大小缩小到了 100KB,一下子缩小了 10 倍,性能得到了明显提升。

六、第五次优化:优化 Redis 存储

在一次 Redis 大 key 排查中,分类树数据被揪了出来。原来,我们一直使用简单的 key/value 结构在 Redis 中保存分类树数据,随着分类数量的增加,这个 value 变得越来越大,成为了 Redis 中的大 key,影响了 Redis 的性能。

为了解决这个问题,我们从以下几个方面进行了优化:

  1. 数据瘦身:只保存需要用到的字段,去除了如 inDate、inUserId 和 inUserName 等不必要的字段。
  2. 修改字段名称:在 JSON 序列化时,将字段名称改为简短的名称,减少数据量。例如,将 id 改为 i,name 改为 n 等。
  3. 数据压缩:使用 GZip 工具类将 JSON 字符串压缩成 byte 数组,然后保存到 Redis 中。获取数据时,再将 byte 数组解压并转换成 JSON 字符串。

例如

@AllArgsConstructor
@Data
public class Category {private Long id;private String name;private Long parentId;private Date inDate;private Long inUserId;private String inUserName;private List<Category> children;
}

例如

@AllArgsConstructor
@Data
public class Category {/*** 分类编号*/@JsonProperty("i")private Long id;/*** 分类层级*/@JsonProperty("l")private Integer level;/*** 分类名称*/@JsonProperty("n")private String name;/*** 父分类编号*/@JsonProperty("p")private Long parentId;/*** 子分类列表*/@JsonProperty("c")private List<Category> children;
}

经过这些优化,保存到 Redis 中的分类树数据大小减少了 10 倍,成功解决了 Redis 的大 key 问题。

七、优化成果总结

通过这五次优化,分类树查询的性能得到了显著提升:

  • 初始版本:响应时间约 2 秒
  • 最终版本:响应时间约 0.1 秒
  • QPS 从 100 多提升到 500 多
  • 数据传输量从 1MB 减少到 100KB 左右
  • Redis 中的数据存储量减少了 10 倍

八、经验启示

  1. 性能优化是一个持续的过程:随着业务的发展和数据量的增加,原来的优化措施可能会逐渐失效,需要持续关注性能问题并进行优化。
  2. 缓存策略的选择很重要:根据数据的特点和业务需求,选择合适的缓存策略,如 Redis 缓存、内存缓存等,并合理设置缓存过期时间。
  3. 数据压缩不容忽视:在数据传输和存储过程中,合理使用数据压缩技术可以有效减少数据量,提高性能。
  4. 数据库操作要谨慎:数据库是系统的瓶颈之一,应尽量减少对数据库的访问,避免大量并发请求同时访问数据库。
  5. 代码优化细节决定成败:在实际开发中,一些看似微小的优化,如字段名称的简化、不必要字段的去除等,累积起来也能带来显著的性能提升。
http://www.dtcms.com/wzjs/514403.html

相关文章:

  • 怎样推广自己做的网站怎么样进行网络推广
  • 小程序登录不了怎么办福州seo代理商
  • 购物网站建设的必要性郑州seo优化外包顾问
  • 网站制作公司 郑州新东方烹饪学校学费价目表
  • 淘宝客网站建设教程seo综合查询接口
  • 新乡网站建设设计5118关键词查询工具
  • 门户网站的主要特点手机系统流畅神器
  • 中国包装设计网seo排名工具
  • 网址导航网站制作工具优化排名工具
  • wordpress做定制T恤的网站网站优化推广平台
  • 北京工商登记服务平台乐山网站seo
  • 网站建设规划怎么写互联网销售包括哪些
  • 山东省建设发展研究院网站百度seo优化怎么做
  • 微软手机做网站服务器吗谷歌网站收录提交入口
  • 哪些做营销型网站做的好济南竞价托管公司
  • 百度景安空间网站seo搜索引擎优化期末及答案
  • 公司做网站app入什么科目快手刷粉网站推广
  • 买了虚拟主机怎么建设网站网站关键词优化排名
  • 南昌市网站建设推广人大常委会委员长
  • 集团企业网站建设文案打开百度一下网页版
  • 做网站的人 优帮云最近时事热点新闻评论及点评
  • 广元建设银行网站自己想开个网站怎么弄
  • 梧州网站平台建设公司百度大数据官网
  • 商贸有限公司怎么注销西安seo外包
  • 做网站安全维护是什么东东百度app登录
  • 门户网站模板源码下载观看b站的广告网站平台
  • 那些网站是做生鲜的seo关键词排名优化教程
  • 网站独立空间是什么意思数据网站
  • 哪个网站有适合小学生做的题目百度搜索关键词规则
  • 有哪些网站或者公司招募做视频的关键词查询网站的工具