一个业务场景的性能优化方案:并发+缓存
2019-05-15 22:01
302 查看
版权声明:原创文章欢迎转载,转载请注明出处 https://blog.csdn.net/w605283073/article/details/90244201
一、背景
有一个功能,提供两个接口,一个是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)。
三、常见思路
我们要想想耗时的常见因素,主要是
- IO
- 网络
- 服务器性能
- 资源的创建和释放:线程的创建和销毁、连接(数据库连接、网络连接)的创建和销毁
- 转换:字符到字节转换等
- 算法的时间复杂度高(如多层for循环,而且数据量很大)
- 数据库查询条件复杂没命中索引等
因此我们思考的角度是
- 将串行变为并行或并发
- 同步操作变异步操作
- 多个请求合并成一个请求
- 用空间换时间
- 算法时间复杂度的优化
- 提高机器性能(CUP/内存/宽带/磁盘等)
- 利用各种池,如数据库连接池、缓存连接池等
- 数据库索引优化
如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。
相关文章推荐
- java(优化25) Redis缓存加索引处理数据库百万级并发的方案
- mysql性能优化(五) mysql中SELECT+UPDATE处理并发更新问题解决方案
- 【性能诊断】四、单功能场景的性能分析(RedGate,找到同一个客户端的并发请求被串行化问题)
- 数据库性能优化方案---缓存和结构
- 两亿多用户,六大业务场景,知乎AI用户模型服务性能如何优化?
- 并发环境下的缓存容器性能优化(下):性能测试
- 并发环境下的缓存容器性能优化
- 简述性能优化tomcat配置(从内存、并发、缓存方面)优化及压力测试
- Tomcat服务器优化方案:内存优化、线程优化(并发优化)、缓存优化
- 系统性能优化几个着手点(根据实际遇到业务场景)
- 并发环境下的缓存容器性能优化(上):不可变的哈希表
- GNU Linux高并发性能优化方案
- Tomcat性能优化,如何优化tomcat配置(从内存、并发、缓存4个方面)优化
- 史上最强大型分布式架构汇总:高并发+性能优化+缓存+存储+微服务
- GNU Linux高并发性能优化方案
- 报表性能优化方案之数据集缓存与共享
- PHP性能优化四(业务逻辑中使用场景)
- 并发环境下的缓存容器性能优化(下):性能测试
- 性能优化(一个)Hibernate 使用缓存(一个、两、查询)提高系统性能
- 黄聪:MYSQL5.6缓存性能优化my.ini文件配置方案