前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个业务场景的性能优化方案:并发+缓存

一个业务场景的性能优化方案:并发+缓存

作者头像
明明如月学长
发布2021-08-31 15:17:46
5310
发布2021-08-31 15:17:46
举报
文章被收录于专栏:明明如月的技术专栏

一、背景

有一个功能,提供两个接口,一个是A服务查询列表某天的数据,一个是B服务查询列表中单个对象某天的数据。

需要实现的效果是,

(1)调用A服务得到今天的数据

(2)然后再次调用A服务查询昨天的数据,

(3)然后循环A服务获取的数据依次调用B服务,查询每个对象的其他属性,然后获取某个中间结果。

(4)然后根据上面的中间结果和第依次调用A服务的结果组装最后结果(postLogic)。

整体的活动图,大致如下:

假如服务A调用时间为800ms,服务B调用getData的平均时间为300ms(假设10次), 则在执行postLogic前耗时约为800ms *2 + 300ms*10=4.6s。 

二、方案

如果服务A的两次请求和服务B的一次请求,服务提供方可以包装成一次,当然效率会更高,但是无法提供。

那么,肿么办?

服务A的两次是可以异步并发请求的,而服务B依赖于服务A的第一次请求结果,因此如果服务A两次异步并发请求,则理想条件下耗时为800ms。

服务B的10次也可以异步并发请求,则服务器B的耗时理想状态下为300ms。

异步方案使用线程池执行Callable任务,返回值为Future对象。(带返回值的异步任务)

则postLogic之前总耗时被优化为800ms+300ms = 1.1s。

然后可以再优化,对结果进行缓存,如果缓存有数据直接返回,如果没有查询并计算后再缓存。

可以使用Redis,设置缓存失效时间。(典型的空间换时间)

这样不仅第一次请求耗时尽可能缩短,而且第二次以后请求超快(10-50ms)。

三、常见思路

我们要想想耗时的常见因素,主要是

  1. IO
  2. 网络
  3. 服务器性能
  4. 资源的创建和释放:线程的创建和销毁、连接(数据库连接、网络连接)的创建和销毁
  5. 转换:字符到字节转换等
  6. 算法的时间复杂度高(如多层for循环,而且数据量很大)
  7. 数据库查询条件复杂没命中索引等

因此我们思考的角度是

  1. 将串行变为并行或并发
  2. 同步操作变异步操作
  3. 多个请求合并成一个请求
  4. 用空间换时间
  5. 算法时间复杂度的优化
  6. 提高机器性能(CUP/内存/宽带/磁盘等)
  7. 利用各种池,如数据库连接池、缓存连接池等
  8. 数据库索引优化

如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景
  • 二、方案
  • 三、常见思路
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档