首页 >国际 > > 正文

分类树,我从2s优化到0.1s 世界快资讯

苏三说技术 2023-05-15 09:31:00
前言

分类树查询功能,在各个业务系统中可以说随处可见,特别是在电商系统中。


(资料图片)

但就是这样一个简单的分类树查询功能,我们却优化了5次。

到底是怎么回事呢?

背景

我们的网站使用了SpringBoot推荐的模板引擎:Thymeleaf,进行动态渲染。

它是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发。

它提供了一个用于整合SpringMVC的可选模块,在应用开发中,我们可以使用Thymeleaf来完全代替JSP或其他模板引擎,如Velocity\FreeMarker等。

前端开发写好Thymeleaf的模板文件,调用后端接口获取数据,进行动态绑定,就能把想要的内容展示给用户。

由于当时这个是从0-1的新项目,为了开快速开发功能,我们第一版接口,直接从数据库中查询分类数据,组装成分类树,然后返回给前端。

通过这种方式,简化了数据流程,快速把整个页面功能调通了。

第1次优化

我们将该接口部署到dev环境,刚开始没啥问题。

随着开发人员添加的分类越来越多,很快就暴露出性能瓶颈。

我们不得不做优化了。

我们第一个想到的是:加Redis缓存。

流程图如下:

于是暂时这样优化了一下:

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

我们在Redis中定义一个了key,value是一个分类树的json格式转换成了字符串,使用简单的key/value形式保存数据。

经过这样优化之后,dev环境的联调和自测顺利完成了。

第2次优化

我们将这个功能部署到st环境了。

刚开始测试同学没有发现什么问题,但随着后面不断地深入测试,隔一段时间就出现一次首页访问很慢的情况。

于是,我们马上进行了第2次优化。

我们决定使用Job定期异步更新分类树到Redis中,在系统上线之前,会先生成一份数据。

当然为了保险起见,防止Redis在哪条突然挂了,之前分类树同步写入Redis的逻辑还是保留。

于是,流程图改成了这样:

增加了一个job每隔5分钟执行一次,从数据库中查询分类数据,封装成分类树,更新到Redis缓存中。

其他的流程保持不变。

此外,Redis的过期时间之前设置的5分钟,现在要改成永久。

通过这次优化之后,st环境就没有再出现过分类树查询的性能问题了。

第3次优化

测试了一段时间之后,整个网站的功能快要上线了。

为了保险起见,我们需要对网站首页做一次压力测试。

果然测出问题了,网站首页最大的qps是100多,最后发现是每次都从Redis获取分类树导致的网站首页的性能瓶颈。

我们需要做第3次优化。

该怎么优化呢?

答:加内存缓存。

如果加了内存缓存,就需要考虑数据一致性问题。

内存缓存是保存在服务器节点上的,不同的服务器节点更新的频率可能有点差异,这样可能会导致数据的不一致性。

但分类本身是更新频率比较低的数据,对于用户来说不太敏感,即使在短时间内,用户看到的分类树有些差异,也不会对用户造成太大的影响。

因此,分类树这种业务场景,是可以使用内存缓存的。

于是,我们使用了Spring推荐的caffine作为内存缓存。

改造后的流程图如下:

用户访问接口时改成先从本地缓存分类数查询数据。如果本地缓存有,则直接返回。如果本地缓存没有,则从Redis中查询数据。如果Redis中有数据,则将数据更新到本地缓存中,然后返回数据。如果Redis中也没有数据(说明Redis挂了),则从数据库中查询数据,更新到Redis中(万一Redis恢复了呢),然后更新到本地缓存中,返回返回数据。

需要注意的是,需要改本地缓存设置一个过期时间,这里设置的5分钟,不然的话,没办法获取新的数据。

这样优化之后,再次做网站首页的压力测试,qps提升到了500多,满足上线要求。

第4次优化

之后,这个功能顺利上线了。

使用了很长一段时间没有出现问题。

两年后的某一天,有用户反馈说,网站首页有点慢。

我们排查了一下原因发现,分类树的数据太多了,一次性返回了上万个分类。

原来在系统上线的这两年多的时间内,运营同学在系统后台增加了很多分类。

我们需要做第4次优化。

这时要如何优化呢?

限制分类树的数量?

答:也不太现实,目前这个业务场景就是有这么多分类,不能让用户选择不到他想要的分类吧?

这时我们想到最快的办法是开启nginx的GZip功能。

让数据在传输之前,先压缩一下,然后进行传输,在用户浏览器中,自动解压,将真实的分类树数据展示给用户。

之前调用接口返回的分类树有1MB的大小,优化之后,接口返回的分类树的大小是100Kb,一下子缩小了10倍。

这样简单的优化之后,性能提升了一些。

第5次优化

经过上面优化之后,用户很长一段时间都没有反馈性能问题。

但有一天公司同事在排查Redis中大key的时候,揪出了分类树。之前的分类树使用key/value的结构保存数据的。

我们不得不做第5次优化。

为了优化在Redis中存储数据的大小,我们首先需要对数据进行瘦身。

只保存需要用到的字段。

例如:

@AllArgsConstructor@Datapublic class Category {    private Long id;    private String name;    private Long parentId;    private Date inDate;    private Long inUserId;    private String inUserName;    private List children;}

像这个分类对象中inDate、inUserId和inUserName字段是可以不用保存的。

修改自动名称。

例如:

@AllArgsConstructor@Datapublic 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 children;}

由于在一万多条数据中,每条数据的字段名称是固定的,他们的重复率太高了。

由此,可以在json序列化时,改成一个简短的名称,以便于返回更少的数据大小。

这还不够,需要对存储的数据做压缩。

之前在Redis中保存的key/value,其中的value是json格式的字符串。

其实RedisTemplate支持,value保存byte数组。

先将json字符串数据用GZip工具类压缩成byte数组,然后保存到Redis中。

再获取数据时,将byte数组转换成json字符串,然后再转换成分类树。

这样优化之后,保存到Redis中的分类树的数据大小,一下子减少了10倍,Redis的大key问题被解决了。

上一篇:楚环科技陈步东:在恶臭治理的“小切口”里寻找“大可为” 下一篇:最后一页
x
推荐阅读

分类树,我从2s优化到0.1s 世界快资讯

2023-05-15

楚环科技陈步东:在恶臭治理的“小切口”里寻找“大可为”

2023-05-15

【时快讯】中信建投:市场本周有望止跌回升,内需是否持续复苏是关键

2023-05-15

失业保险申请有时间限制吗

2023-05-15

环球观热点:比亚迪老板王传福,不买豪宅,吃食堂,经常穿着一身工作服

2023-05-15

但愿人长久 千里共婵娟_但愿

2023-05-15

新宇宙_关于新宇宙简介

2023-05-15

焦点速读:五一假期后终端需求量缩减 本周生猪价格重回跌势

2023-05-14

【世界热闻】今年牛市的大方向

2023-05-14

维汉词典电子书下载 维汉词典-每日讯息

2023-05-14

雪天盐业投资2亿新公司

2023-05-14

【pixiv】每日排行榜(每期都有50张呐)352

2023-05-14

西藏旅游强劲复苏 今日讯

2023-05-14

世界看点:洲明科技董秘回复:公司已与微软达成合作协议,正式成为微软 ISV 合作伙伴

2023-05-14

dnf纹章怎么获得2020_dnf纹章怎么得

2023-05-14

2023湖北宜昌百里荒滑翔伞邀请赛开幕_今日热门

2023-05-14

白水炖羊肉的做法? 环球通讯

2023-05-14

天天微资讯!美财长:“或动摇美元地位 ”

2023-05-14

山西平遥200多亩耕地何以变成粉煤灰填埋场?

2023-05-14

全球热点评!青海海西:变电站“智慧大脑”运维管理更智慧

2023-05-14

世界速看:“PE超25倍我基本不买!”广发基金程琨:像企业家那样挑生意 像商人那样挑剔价格

2023-05-14

含羞草成人_含羞草为什么一碰叶子就会收起来

2023-05-14

看点:《西游记》演员程伟兵病逝,是六小龄童大师兄,讣告曝光

2023-05-14

世界播报:闪光布鲁克克技能(闪光布鲁克克)

2023-05-14

小鸡宝宝考考你唐朝时春游盛行下列哪项是唐朝女性在春游时常做的

2023-05-13

全球焦点!德邦物流上门取件电话_顺丰上门取件电话

2023-05-13

鸡炖山药儿童吃有什么好处-天天快播

2023-05-13

去沐足会所上班怎么样_水疗会所

2023-05-13

什么是片段教学

2023-05-13

新不良人手游万毒巫师流策略

2023-05-13

砷铂矿 环球速看

2023-05-13

新青年的自由率性主义,CHINISM X MATNUT联名鞋款设计-每日热点

2023-05-13

马士基:集运市场正常化正在按预期发展,班轮公司表现更“理性” | 航运界

2023-05-13

散文诗|王 山:汉口江滩|世界球精选

2023-05-13

blood c无修百度云_blood c无修

2023-05-13

【全球热闻】11.83亿!极兔收购顺丰下属公司,扩大估值储备竞争力

2023-05-13

大益普洱茶最新价格2023年05月13日_前沿资讯

2023-05-13

全球视点!1tbhdd多少钱 1tbhdd

2023-05-13

德高望重的下一句_德高望重

2023-05-13

热门:成都门诊费用可以异地就医跨省直接结算吗

2023-05-13

中坚科技: 关于控股股东部分股份质押的公告|世界热点评

2023-05-13

学生汇 环球新要闻

2023-05-13

焦点播报:ps3游戏机多少钱 ps3游戏机价格及详细评测

2023-05-12

刚度 当前热讯

2023-05-12

美国债务上限僵局持续 两党相互指责

2023-05-12

每日短讯:血小板减少症症状表现_血小板减少症的症状有哪些

2023-05-12

可孚医疗关于公司商誉相关情况,已在2022年报财务报表附注中披露,敬请查看 世界新视野

2023-05-12

威帝股份: 独立董事关于第五届董事会第十次会议相关议案的独立意见

2023-05-12

《第七史诗》灵活搭配阵容 共同击败威胁世界的强大敌人!|热门

2023-05-12

新生婴儿名字大全女孩,1997年中国新生婴儿名字大全 每日速递

2023-05-12

全球关注:桂林电子科技大学应用型本科位置(桂林电子科技大学应用型本科)

2023-05-12

7万人状告白宫

2023-05-12

克什克腾旗气象台发布雷电黄色预警【III级/较重】【2023-05-12】

2023-05-12

信息:农村低保标准由 确定_农村低保标准

2023-05-12

全球讯息:收评: A股缩量大跌,底在何方?4连阴之后,是否还有最后一跌?老手提醒:准备好大麻袋!今天我又打了90分。

2023-05-12

头条:火爆!人工智能ETF(BOTZ.US)触及52周新高,年初至今上涨23%

2023-05-12

当前热讯:青岛中能宣布朱炯任主帅_青岛中能宣布主帅

2023-05-12

【时快讯】剑网三捏脸数据保存在哪_剑网3捏脸数据如何导入

2023-05-11

菜鸟国际快递、五粮液和上海电气入选“中国品牌全球行”案例

2023-05-11

【速看料】2023年花溪区石榴花志愿者招募计划

2023-05-11

缩量整理周末长阳突袭_全球速讯

2023-05-11

粤港澳大湾区高水平人才高地建设的几点思考 全球资讯

2023-05-11

俄外交部:美国面临债务违约风险已成美式仪式 视焦点讯

2023-05-11

5月11日中南文化涨停分析:影视,知识产权,直播/短视频概念热股|最新快讯

2023-05-11

水果市场调研 水果市场消费趋势及发展前景分析

2023-05-11

快讯:天创时尚涨停 报于4.79元-天天热闻

2023-05-11

《政府工作报告》解读(十) 滚动

2023-05-11

【新股】一图读懂英特科技

2023-05-11

12月25日是什么日子_12月25日的日子介绍

2023-05-11

铠甲勇士激斗传视频 铠甲勇士地虎激斗传2|天天亮点

2023-05-11

兰州市七里河区彭家坪镇贾家山村安全饮水管道维修改造工程中标候选人公示 焦点热议

2023-05-11

2023年5月11日国内稻米价格行情日报|环球热点评

2023-05-11

每日速递:聚赛龙(301131):2022年度网上业绩说明会投资者关系活动记录表

2023-05-11

最新资讯:传媒板块再度活跃,荣信文化涨停再创新高,华策影视等大涨

2023-05-11

消防火灾应急预案范本_消防火灾应急预案 环球快消息

2023-05-11

今日报丨生活更方便 群众更幸福(深阅读)

2023-05-11

逻辑狗怎么样情景导入 逻辑狗怎么样

2023-05-11

浙师大硕士生入选全球前1%高被引科学家 导师称“绝无仅有”

2023-05-11

经济形势严峻 微软宣布今年不会为全职员工加薪

2023-05-11

超强带货小哥天舟六号升空-全球热文

2023-05-11

与施从事书文言文阅读答案(与施从事书阅读答案)_焦点短讯

2023-05-11

世界新动态:巴黎人的怨言:法国公共服务在退步

2023-05-11

利亚德(300296):5月10日北向资金减持42.96万股

2023-05-11

word打开文档时提示遇到错误_Word2003每次打开都说 ldquo 遇到问题需要关闭 rdquo 怎么回事|环球快资讯

2023-05-11

开小超市需要多少钱在哪里进货_开小超市需要多少钱

2023-05-10

出口额与交货值背离的谜底

2023-05-10

申万行业指数编制方法|天天通讯

2023-05-10

支付宝转账记录曝光,男子被刑事拘留!

2023-05-10

国家区块链技术创新中心落地中关村

2023-05-10

每日观察!荒野大镖客2:救赎v1436.28中文免steam最新版

2023-05-10

“女子地铁上隔空收到不雅照”?杭州警方最新回应

2023-05-10

全球微速讯:刚刚披露:增加到60000000000!

2023-05-10

今日报丨2023年杭州钱塘区小微企业工会经费返还申报条件一览

2023-05-10

世界报道:网络语尿性是什么意思_尿性是哪里的方言

2023-05-10

快报:鹤壁:创新警务模式 提升群众满意度

2023-05-10

当前热文:孟羽童称靠别人永远不如靠自己 格力删除孟羽童视频

2023-05-10

推荐2本重生爽文,1本系统文娱,1本商业职场,质量不错值得瞅瞅

2023-05-10

一生聪明,却输给爱情的5大星座?

2023-05-10

环球快播:中国品牌日|美的置业:以服务内容驱动场景,用户品牌行动持续迭代

2023-05-10

高德红外:因客户采购计划变化导致部分项目出现订单签署推迟

2023-05-10