首页 > 其他分享 >接口性能优化之路

接口性能优化之路

时间:2024-06-20 20:46:15浏览次数:23  
标签:异步 事务 缓存 性能 接口 查询 优化 可以

1.批处理
批量思想:批量操作数据库,这个很好理解,在循环插入场景的接口中,可以在批处理执行完成后一次性插入或更新数据库,避免多次IO。

//批量入库
batchInsert()
//redis管道操作
_, err = a.rc.TxPipelined(func(p redis.Pipeliner) error {   p.HSet(key, field, json.Marshal(&info))   p.Expire(key, tkTime.RedisRandomExpire(tkTime.Week))   return nil })

2.异步处理
异步思想:针对耗时比较长且不是结果必须的逻辑,可以考虑放到异步执行,这样能降低接口耗时。
例如:
1)一个理财的申购接口,入账和写入申购文件是同步执行的,因为是T+1交易,后面这两个逻辑其实不是结果必须的,并不需要关注它的实时结果,所以考虑把入账和写入申购文件改为异步处理。
2)go func()
至于异步的实现方式,可以用线程池,也可以用消息队列,还可以用一些调度任务框架。
3.空间换时间 (缓存)
一个很好理解的空间换时间的例子是合理使用缓存,针对一些频繁使用且不频繁变更的数据,可以提前缓存起来,需要时直接查缓存,避免频繁地查询数据库或者重复计算。
需要注意的事,这里用了合理二字,因为空间换时间也是一把双刃剑,需要综合考虑使用场景,毕竟缓存带来的数据一致性问题,也挺令人头疼。
这里的缓存可以是R2M,也可以是本地缓存、memcached,或者Map。
举一个股票工具的查询例子:
因为策略轮动的调仓信息,每周只更新一次,所以原来的调接口就去查库的逻辑并不合理,而且拿到调仓信息后,需要经过复杂计算,最终得出回测收益和跑赢沪深指数这些想要的结果。如果把查库操作和计算结果放入缓存,可以节省很多的执行时间。
4.预处理
也就是预取思想,就是提前要把查询的数据,提前计算好,放入缓存或者表中的某个字段,使用时会大幅提高接口性能。跟上面那个例子很像,但关注点不同。
举个简单的例子:理财产品,会有根据净值计算年化收益率的数据展示需求,利用净值去套用年化收益率计算公式计算的逻辑可以采用预处理,这样每一次接口调用直接取对应字段就可以了。
5.池化思想
开发者一般都用过数据库连接池,线程池等,这就是池思想的体现,它们解决的问题就是避免重复创建对象或创建连接,可以重复利用,避免不必要的损耗,毕竟创建销毁也会占用时间。
池化思想包含但并不局限于以上两种,总的来说池化思想的本质是预分配与循环使用,明白这个原理后,即使是在做一些业务场景的需求时,也可以利用起来。
比如:对象池
6.串行改并行
串行就是当前执行逻辑必须等上一个执行逻辑结束之后才执行,并行就是两个执行逻辑互不干扰,所以并行相对来说就比较节省时间,当然是建立在没有结果参数依赖的前提下。
比如,理财的持仓信息展示接口,既需要查询用户的账户信息,也需要查询商品信息和banner位信息等等来渲染持仓页,如果是串行,基本上接口耗时就是累加的。如果是并行,接口耗时将大大降低。
7.索引
加索引能大大提高数据查询效率,这个在接口设计之出也会考虑到,这里不再多赘述。
8.避免大事务
所谓大事务问题,就是运行时间较长的事务,由于事务一致不提交,会导致数据库连接被占用,影响到别的请求访问数据库,影响别的接口性能。
为避免大事务问题,可以通过以下方案规避:
1)RPC调用不放到事务里面
2)查询操作尽量放到事务之外
3)事务中避免处理太多数据
9.优化程序结构
程序结构问题一般出现在多次需求迭代后,代码叠加形成。会造成一些重复查询、多次创建对象等耗时问题。在多人维护一个项目时比较多见。解决起来也比较简单,需要针对接口整体做重构,评估每个代码块的作用和用途,调整执行顺序。
10.深分页问题
深分页问题比较常见,一般最先想到的就是limit ,为什么会慢,可以看下这个SQL:
select * from purchase_record where productCode = 'PA9044' and status=4 and id > 100000 limit 200
这样优化的好处是命中了主键索引,无论多少页,性能都还不错,但是局限性是需要一个连续自增的字段
11.SQL优化
sql优化能大幅提高接口的查询性能,可以结合索引、分页等关注点考虑优化方案。
12.锁粒度避免过粗
锁一般是为了在高并发场景下保护共享资源采用的一种手段,但是如果锁的粒度太粗,会很影响接口性能。
关于锁粒度:就是要锁的范围有多大,不管是synchronized还是redis分布式锁,只需要在临界资源处加锁即可,不涉及共享资源的就不必要加锁,就好比要上卫生间,只需要把卫生间的门锁上就可以,不需要把客厅的门也锁上。

标签:异步,事务,缓存,性能,接口,查询,优化,可以
From: https://www.cnblogs.com/beatle-go/p/18259468

相关文章

  • 免费调用微信推送接口
    注册测试公众号https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login扫码开通后,将会出现后台页面,拿到这四个值appIDappsecret接受消息者,扫码拿到openId,也就是接受者的id号template_id模板内容固定格式,演示的content是将要推送消息的key推送消息......
  • Hive怎么调整优化Tez引擎的查询?在Tez上优化Hive查询的指南
    目录在Tez上优化Hive查询的指南调优指南理解Tez中的并行化理解mapper数量理解reducer数量并发案例1:未指定队列名称案例2:指定队列名称并发的指南/建议容器复用和预热容器容器复用预热容器一般Tez调优参数在Tez上优化Hive查询的指南在Tez上优化Hive查询无法采用一刀切的方法。查询......
  • JAVA基础——接口(全网最详细教程)
    概述我们已经学完了抽象类,抽象类中可以用抽象方法,也可以有普通方法,构造方法,成员变量等。那么什么是接口呢?接口是更加彻底的抽象,JDK7之前,包括JDK7,接口中全部是抽象方法。接口同样是不能创建对象的。  把特有的方法(行为)写成接口,要用的时候调用接口就行了,除了狗和青蛙......
  • 记录--单页面首屏优化,打包后大小减少64M,加载速度快了13.6秒
     ......
  • chatGPT帮我优化代码-2024.06.20
    改成面向对象源代码defret_roi_value_dict(txt_path):output=[]line_number=0withopen(txt_path,'r')asfile:forlineinfile:line_number+=1#使用正则表达式提取case_name和pixel_valuematch=......
  • Pointnet++改进即插即用系列:全网首发FastKAN|即插即用,提升特征提取模块性能
    简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入FastKAN,提升性能。3.专栏持续更新,紧随最新的研究内容。目录1.理论介绍2.修改步骤2.1步骤一     2.2步骤二     2.3步......
  • RAG优化技巧|7大挑战与解決方式|提高你的LLM能力
    在当今快速发展的人工智能领域,大型语言模型(LLM)已经成为无处不在的技术,它们不仅改变了我们与机器交流的方式,还在各行各业中发挥着革命性的影响。然而,尽管LLM+RAG的能力已经让人惊叹,但我们在使用RAG优化LLM的过程中,还是会遇到许多挑战和困难,包括但不限于检索器返回不准确或......
  • 【Java】如何提升RocketMQ顺序消费性能?
    一、问题解析我们先来了解一下RocketMQ顺序消费的实现原理。RocketMQ支持局部顺序消息消费,可以保证同一个消费队列上的消息顺序消费。例如,消息发送者向主题为ORDER_TOPIC的4个队列共发送12条消息,RocketMQ可以保证1、4、8这三条按顺序消费,但无法保证消息4和消息......
  • webpack项目开发完后,如何优化打包速度?
    Gzip压缩前端页面文件缓存我们先来简单回顾下http缓存的知识:HTTP1.0是通过Expires(文件过期时间)和Last-Modified(最近修改时间)来告诉浏览器进行缓存的,这两个字段都是UTC时间(绝对时间)。Expires过期控制不稳定,因为浏览器端可以随意修改本地时间,导致缓存使用不精准。而且L......
  • 测试之前端性能问题定位学习文档
    一、h5网页加载原理H5与native区别维度H5native原生 渲染方式 1、从服务器端下载html2、加载框架渲染依赖的js、css、图片3、请求接口数据4、调用浏览器内核渲染以上对网络要求比较高 1、静态资源提前打包到app,直接从本地读取静态资源2、请求接口数据......