文章目录
- 前言
- 第一次优化
- 第二次优化
- 第三次优化
- 第四次优化
- 第五次优化
前言
分类树查询功能,在各个业务系统中可以说随处可见,特别是在电商系统中。
而在实际工作中,这样一个分类树查询,我们都不断的改进了好几次。这是为什么呢?
由于当时这个是从
第一次优化
我们将该接口部署到开发
我们第一个想到的是:加
流程图如下:
于是暂时这样优化了一下:
- 用户访问接口获取分类树时,先从
Redis 中查询数据。 - 如果
Redis 中有数据,则直接返回数据。 - 如果
Redis 中没有数据,则再从数据库中查询数据,拼接成分类树返回。 - 将从数据库中查到的分类树的数据,保存到
Redis 中,设置过期时间5 分钟。 - 将分类树返回给用户。
我们在
经过这样优化之后,测试环境的联调和自测顺利完成了。
第二次优化
我们将这个功能部署到预览(
于是,我们马上进行了第
我们决定使用
当然为了保险起见,防止
于是,流程图改成了这样:
增加了一个旁路定时
此外,
通过这次优化之后,预览环境就没有再出现过分类树查询的性能问题了。
第三次优化
测试了一段时间之后,整个网站的功能快要上线了。为了保险起见,我们需要对网站首页做一次压力测试。果然测出问题了,网站首页最大的
我们需要做第
该怎么优化呢?
答:
在
改造后的流程图如下:
- 用户访问接口时改成先从本地缓存分类数查询数据。
- 如果本地缓存有,则直接返回。
- 如果本地缓存没有,则从
Redis 中查询数据。 - 如果
Redis 中有数据,则将数据更新到本地缓存中,然后返回数据。 - 如果
Redis 中也没有数据(说明Redis 挂了或者调度平台挂了),则从数据库中查询数据,更新到Redis 中(万一Redis 恢复了呢),然后更新到本地缓存中,返回数据。
需要注意的是,需要给本地缓存设置一个过期时间,这里设置的
这样优化之后,再次做网站首页的压力测试,
第四次优化
之后,这个功能顺利上线了。使用了很长一段时间没有出现问题。两年后的某一天,有用户反馈说,网站首页有点慢。我们排查了一下原因发现,分类树的数据太多了,一次性返回了上万个分类。原来在系统上线的这两年多的时间内,运营同学在系统后台增加了很多分类。
我们需要做第
这时要如何优化呢?限制分类树的数量?
答:也不太现实,目前这个业务场景就是有这么多分类,不能让用户选择不到他想要的分类吧?
这时我们想到最快的办法是开启
这样简单的优化之后,性能提升了一些。
第五次优化
经过上面优化之后,用户很长一段时间都没有反馈性能问题。但有一天公司同事在排查
我们不得不做第
为了优化在
1. 只保存需要用到的字段。
例如:
type Category struct { Id int64 `json:"id"` Name string `json:"name"` ParentId int64 `json:"parent_id"` // 父节点 InDate time.Time `json:"in_date"` // 分类添加的日期 InUserId int64 `json:"in_user_id"` // 添加该分类的运营id InUserName string `json:"in_user_name"` // 添加该分类的运营名字 Children []Category `json:"children"` // 子节点 }
像这个分类对象中
2. 修改字段名称。
例如:
type Category struct { Id int64 `json:"i"` Name string `json:"n"` ParentId int64 `json:"p"` // 父节点 Children []Category `json:"c"` // 子节点 }
由于在一万多条数据中,每条数据的字段名称是固定的,他们的重复率太高了。由此,可以在
这还不够,我们还可以对存储的数据做压缩。
先将
这样优化之后,保存到