精华内容
下载资源
问答
  • 接口优化

    2018-02-06 16:28:00
    概述 推荐的分库分表中间件mycat 秒杀接口优化 ...

    概述

    img_c5194ef13a1a92d4a09dfb75f9e13181.png

    img_8e91a5a5cab41d45b18f075cb690e237.png

    推荐的分库分表中间件mycat


    img_24d0ab2764acdffe952b0c7626fa45e3.png

    秒杀接口优化

    img_cbcf81abb9c305d5e690dfea6d102e5c.png

    img_f82fb09d68de6d710e7cf6466f24e36c.png
    展开全文
  • 在这里结合优化过程,总结了接口优化的八个要点,希望对大家有帮助呀~数据量比较大,批量操作数据入库耗时操作考虑异步处理恰当使用缓存优化程序逻辑、代码SQL优化压缩传输内容考虑使用文件/MQ等其他方式暂存,异步...

    前言

    最近对外接口偶现504超时问题,原因是代码执行时间过长,超过nginx配置的15秒,然后真枪实弹搞了一次接口性能优化。在这里结合优化过程,总结了接口优化的八个要点,希望对大家有帮助呀~

    数据量比较大,批量操作数据入库

    耗时操作考虑异步处理

    恰当使用缓存

    优化程序逻辑、代码

    SQL优化

    压缩传输内容

    考虑使用文件/MQ等其他方式暂存,异步再落地DB

    跟产品讨论需求最恰当,最舒服的实现方式

    嘻嘻,先看一下我们对外转账接口的大概流程吧

    411274

    1.数据量比较大,批量操作数据入库

    优化前://for循环单笔入库

    for(TransDetail detail:list){

    insert(detail);

    }

    优化后:// 批量入库,mybatis demo实现

    insert into trans_detail( id,amount,payer,payee) values

    (

    #{item.id},#{item.amount},

    #{item.payer},#{item.payee}

    )

    性能对比:

    解析批量插入性能更好,更加省时间,为什么呢?打个比喻:假如你需要搬一万块砖到楼顶,你有一个电梯,电梯一次可以放适量的砖(最多放500),

    你可以选择一次运送一块砖,也可以一次运送500,你觉得哪种方式更方便,时间消耗更少?

    2.耗时操作考虑异步处理

    耗时操作,考虑用异步处理,这样可以降低接口耗时。本次转账接口优化,匹配联行号的操作耗时有点长,所以优化过程把它移到异步处理啦,如下:

    优化前:

    411274

    优化后

    匹配联行号的操作异步处理

    411274

    性能对比:

    假设一个联行号匹配6ms

    解析:因为联行号匹配比较耗时,放在异步处理的话,同步联机返回可以省掉这部分时间,大大提升接口性能,并且不会影响到转账主流程功能。

    除了这个例子,平时我们类似功能,如用户注册成功后,短信邮件通知,也是可以异步处理的,这个优化建议香饽饽的~

    所以,太耗时的操作,在不影响主流程功能的情况下,可以考虑开子线程异步处理的啦。

    3.恰当使用缓存

    在适当的业务场景,恰当地使用缓存,是可以大大提高接口性能的。这里的缓存包括:Redis,JVM本地缓存,memcached,或者Map等。

    这次转账接口,使用到缓存啦,举个简单例子吧~

    优化前

    以下是输入用户账号,匹配联行号的流程图

    411274

    优化后:

    恰当使用缓存,代替查询DB表,流程图如下:

    411274

    解析:把热点数据放到缓存,不用每次查询都去DB拉取,节省了这部分查SQL的耗时,美滋滋呀~

    当然,不是什么数据都适合放到缓存的哦,访问比较频繁的热点数据才考虑缓存起来呢~

    4. 优化程序逻辑、代码

    优化程序逻辑、程序代码,是可以节省耗时的。

    我这里就本次的转账接口优化,举个例子吧~

    优化前:

    优化前,联行号查询了两次(检验参数一次,插入DB前查询一次),如下伪代码:punlic void process(Req req){

    //检验参数,包括联行号(前端传来的payeeBankNo可以为空,但是如果后端没匹配到,会抛异常)

    checkTransParams(Req req);

    //Save DB

    saveTransDetail(req);

    }

    void checkTransParams(Req req){

    //check Amount,and so on.

    checkAmount(req.getamount);

    //check payeebankNo

    if(Utils.isEmpty(req.getPayeeBankNo())){

    String payeebankNo = getPayeebankNo(req.getPayeeAccountNo);

    if(Utils.isEmpty(payeebankNo){

    throws Exception();

    }

    }

    }

    int saveTransDetail(req){

    String payeebankNo = getPayeebankNo(req.getPayeeAccountNo);

    req.setPayeeBankNo(payeebankNo);

    insert(req);

    ...

    }

    优化后:

    优化后,只在校验参数的时候插叙一次,然后设置到对象里面~ 入库前就不用再查啦,伪代码如下:void checkTransParams(Req req){

    //check Amount,and so on.

    checkAmount(req.getamount);

    //check payeebankNo

    if(Utils.isEmpty(req.getPayeeBankNo())){

    String payeebankNo = getPayeebankNo(req.getPayeeAccountNo);

    if(Utils.isEmpty(payeebankNo){

    throws Exception();

    }

    }

    //查询到有联行号,直接设置进去啦,这样等下入库不用再插入多一次

    req.setPayeeBankNo(payeebankNo);

    }

    int saveTransDetail(req){

    insert(req);

    ...

    }

    解析:对于优化程序逻辑、代码,是可以降低接口耗时的。以上demo只是一个很简单的例子,就是优化前payeeBankNo查询了两次,但是其实只查一次就可以了。很多时候,我们都知道这个点,但就是到写代码的时候,又忘记了呀~所以,写代码的时候,留点心吧,优化你的程序逻辑、代码哦。

    除了以上demo这点,还有其它的点,如优化if复杂的逻辑条件,考虑是否可以调整顺序,或者for循环,是否重复实例化对象等等,这些适当优化,都是可以让你的代码跑得更快的。

    之前我这篇文章,也提了几个优化点噢,有兴趣的朋友可以看一下哈~

    5. 优化你的SQL

    很多时候,你的接口性能瓶颈就在SQL这里,慢查询需要我们重点关注的点呢。

    我们可以通过这些方式优化我们的SQL:加索引

    避免返回不必要的数据

    优化sql结构

    分库分表

    读写分离

    有兴趣的朋友可以看一下我这篇文章呢,很详细的SQL优化点:

    6.压缩传输内容

    压缩传输内容,文件变得更小,因此传输会更快啦。10M带宽,传输10k的报文,一般比传输1M的会快呀;打个比喻,一匹千里马,它驮着一百斤的货跑得快,还是驮着10斤的货物跑得快呢?

    解析:如果你的接口性能不好,然后传输报文比较大的话,这时候是可以考虑压缩文件内容传输的,最后优化效果可能很不错哦~

    7. 考虑使用文件/MQ等其他方式暂存数据,异步再落地DB

    如果数据太大,落地数据库实在是慢的话,可以考虑先用文件的方式保存,或者考虑MQ,先落地,再异步保存到数据库~

    优化前:

    优化前,1000笔先落地DB数据库,再异步转账,如下:

    411274

    优化后:

    先保存数据到文件,再异步下载下来,插入数据库,如下:

    411274

    解析:如果你的耗时瓶颈就在数据库插入操作这里了,那就考虑文件保存或者MQ或者其他方式暂存吧,文件保存数据,对比一下耗时,有时候会有意想不到的效果哦。

    8.跟产品讨论需求最恰当,最舒服的实现方式

    这点个人觉得还是很重要的,有些需求需要好好跟产品沟通的。

    总结

    本文呢,基于一次对外接口耗时优化的实践,总结了优化接口性能的八个点,希望对大家日常开发有帮助哦~嘻嘻,有兴趣可以逛逛我的github哈,本文会收藏到github里滴哈

    公众号

    欢迎关注我个人公众号,交个朋友,一起学习哈~

    展开全文
  • 原标题:记一次 Python Web 接口优化,性能提升25倍!

    原标题:记一次 Python Web 接口优化,性能提升25倍!

    展开全文
  • NVMe基于PCIe SSD的接口优化,作为PCIe的应用延伸阅读
  • DRF之接口优化

    2019-08-28 22:05:25
    Mixins 进行接口优化 from rest_framework.generics import GenericAPIView from rest_framework.mixins import (ListModelMixin, CreateModelMixin, ...

    Mixins 进行接口优化

    from rest_framework.generics import GenericAPIView
    from rest_framework.mixins import (ListModelMixin,
                                       CreateModelMixin,
                                       DestroyModelMixin,
                                       UpdateModelMixin,
                                       RetrieveModelMixin)
    
    from .app_serializer import *
    
    
    class BookView(ListModelMixin, CreateModelMixin, GenericAPIView):
        queryset = Book.objects.all() 
        # 告诉需要使用的数据库查询
        serializer_class = BookSerializer
    	# 告诉使用的序列化组件
        
        def get(self, request):
            return self.list(request)
    
        def post(self, request):
            return self.create(request)
      
    
    class BookFilterView(DestroyModelMixin, UpdateModelMixin, RetrieveModelMixin, GenericAPIView):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
    
        def get(self, request, *args, **kwargs):
            return self.retrieve(request, *args, **kwargs)
    
        def put(self, request, *args, **kwargs):
            return self.update(request, *args, **kwargs)
    
        def delete(self, request, *args, **kwargs):
            return self.destroy(request, *args, **kwargs)
    
    • Django程序启动,开始初始化,读取 urls.py, 读取 settings, 读取视图类
    • 执行 as_view(),BookView没有,需要到父类中找
    • 几个ModelMixin也没有,GenericAPIView中没有,继续到GenericAPIView(APIView)中找
    • 在APIView中找到,与前面的逻辑一样,在 GenericAPIview 中定义了查找 queryset 和serializer——class 类的方法
    • as_view() 方法返回重新封装的视图函数,开始建立 url 和视图函数之间的映射关系
    • 等待用户请求
    • 执行视图函数的 dispatch 方法(因为视图函数的返回值是:return self.dispatch()
    • dispatch 分发请求,查找到视图类的五个方法中的某个
    • 开始执行,例如 post 请求,返回 self.create(), 自己没有,去父类找。
    • 最后在 CreateModelMixin 中查找
    • 执行 create() 方法,获取 queryset 和 serializer_class
    • 返回数据

    断言进行判断

    assert  a in b 
    # assert 就是断言
    

    使用 generics 进行接口逻辑优化

    from rest_framework import generics
    
    
    class BookView(generics.ListCreateAPIView):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
    
    
    class BookFilterView(generics.RetrieveUpdateDestroyAPIView):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
    
    

    使用viewset进行接口逻辑优化

    对比上面,再次封装(不是我),利用 mixins 进行分发请求,找到对应的函数。

    from rest_framework.viewsets import ModelViewSet
    
    
    class BookView(ModelViewSet):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
    
    • 与上面一样加载后,进行 as_view() 函数中,因为路由中配置了参数,携带 actions参数 到函数中执行

    • Django程序启动,开始与上述一样的操作

    • 遵循自己没有,找父类,找到了ModelViewSet 中找

    • ModelViewSet 继承了 mixins 的几个 ModelMixin 和 GenericViewSet,最终只有GenericViewSet ,它继承了 ViewSetMixin 和 generic.GenericAPIView (这个我们已经认识了)

    • 先去 ViewSetMixin 中查找,找到了 as_view() 类方法,在重新封装 view 函数的过程中,有一个 self.action_map = actions

    • 这个 actions 就是我们给 as_view() 传递的参数

    • 绑定 url 和视图函数(actions)之间的映射关系

    • 等待用户请求

    • 接收到用户请求,根据 url 找到视图函数

    • 执行视图函数的 dispatch 方法(因为视图函数的返回值是: return self.dispatch())

    • dispatch 分发请求,查找到视图类的五个方法的某个

    • 开始执行,例如 post 请求,返回:self.creat(), 自己没有,去父类

    • 最后找到 CreateModelMixin 中,执行create方法,获取queryset和serializer_class ,返回数据

    展开全文
  • 秒杀系统 高并发秒杀接口优化

    多人点赞 2020-05-08 20:01:21
    高并发秒杀接口优化 接口优化(核心思路:减少对数据库的访问) Redis预减库存减少对数据库的访问 内存标记减少Redis的访问 请求先入队缓冲,异步下单,增强用户体验 RabbitMQ安装与SpringBoot的集成(目的:同步...
  • 今天小编就为大家分享一篇关于JAVA下单接口优化实战TPS性能提高10倍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • Java高并发秒杀之接口优化

    千次阅读 多人点赞 2020-08-08 11:30:34
    接口优化 Redis预减库存减少数据库的访问 内存标记减少redis访问 请求先入队缓冲,异步下单,增强用户体验 RabbitMQ安装与Spring Boot集成 1、Redis预减库存减少数据库的访问 顾名思义,Redis预减库存减少数据库的...
  • 借用我老大的话,接口优化其实主要是提高代码质量和执行效率,无非就是从三个方面入手:1、检查代码中SQL语句,优化SQL; 2、数据库层面优化,比如加索引等; 3、检查代码逻辑,尤其是for循环、递归等; 我这次优化...
  • 高并发秒杀接口优化 接口优化(核心思路:减少对数据库的访问) Redis预减库存减少对数据库的访问 内存标记减少Redis的访问 请求先入队缓冲,异步下单,增强用户体验 RabbitMQ安装与SpringBoot的集成(目的:同步...
  • 接口优化方法

    2018-07-04 18:11:21
    接口响应慢,主要的瓶颈在于(1)数据库查询方式优化;(2)接口太频繁了,浪费了大量的网络IO;(3)
  • 接口优化策略

    2017-12-20 18:45:00
    那么对于一个典型的后台服务接口,我们可以从那些方面入手进行优化呢? 接口拆分 接口垂直拆分 垂直拆分可以简单理解为微服务化,把一个大而复杂的服务拆分成多个相互独立,职能单一的服务,单独部署。 更细粒度...
  • 接口优化总结

    千次阅读 2017-12-27 10:50:58
    上周用了很长时间优化了一个接口,前天上线修复了一些bug,现在正常了。这里总结一下遇到的一些问题。优化的原因是接口响应时间太长了。优化之前平均是100多毫秒,优化之后平均是30~40多毫秒。优化的过程中使用到了...
  • 高并发下的接口优化

    千次阅读 2018-07-22 19:22:00
    高并发下的接口优化 Redis预减库存减少对数据库的访问 内存标记减少对Redis的访问 请求入队缓存,异步下单,增强用户体验(MQ) Nginx水平扩展 分库分表(MyCat) Redis预减库存减少对...
  • 接口优化了的观察者模式

    千次阅读 2017-03-15 19:52:33
    接口优化了的观察者模式: 实现的效果优化了接口过后的观察者模式,可以实现让继承自 Subject 的类对普通类进行通知的功能,可以动态的绑定和卸载绑定的响应函数。
  • Elaticsearch索引数据大批量删除接口优化一、需求二、索引数据删除接口2.1使用到的elasticsearch核心接口2.2封装删除脚本2.3封装接口实现三、Lucene分段处理的优化3.1、refersh3.2、flush3.3、合并策略3.4、存储限流...
  • 记一次接口优化! 转载:https://mp.weixin.qq.com/s/0u21nbicAzsoVRFUeuOALg 针对本次优化的总结 1、一定要绝对避免循环查数据库和缓存(PS:循环里面就不能有查询缓存,更不能有查询数据库的操作,因为循环的...
  • 项目退出功能实现以及部分接口优化 一.退出功能实现: 1》添加退出按钮,并实现退出登录的接口: navheader.vue: 2》此时退出功能没有完全实现,我们需要把在navheader渲染的用户名称和购物车数量清空: 清空...
  • 接口优化实践

    2021-05-11 14:29:38
    在这里结合优化过程,总结了接口优化的八个要点,希望对大家有帮助呀~ 数据量比较大,批量操作数据入库 耗时操作考虑异步处理 恰当使用缓存 优化程序逻辑、代码 SQL优化 压缩传输内容 考虑使用文件/MQ等其他方式暂...
  • 1 优化工具与措施2 优化标准3 发现优化点并优化4 放水接口5 子业务相互独立 优化工具与措施 CAT(Central Application Tracking):是基于Java开发的实时应用监控平台,为大众点评网提供了全面的监控服务和...
  • 秒杀接口优化

    2019-04-09 22:37:00
    转载于:https://www.cnblogs.com/gaoqiaoliangjie/p/10680356.html
  • 三层优化加入接口建议面向接口开发:先接口-再实现类service、dao加入接口接口与实现类的命名规范起名例子接口:interface实体类ServiceIStudentService实现类:implements实体类ServiceImplStudentServicelmpl接口...
  • 本项目采用 flask + mongodb速度贼慢先上图network上的查看 TTFB 请求时间过长POSTMAN 中 查看同样是8秒多因此 我们要找找问题在哪解决方法首先查明是TTFB时间过长,是后端服务器导致的接口速度过慢。单个接口单次...
  • SpringBoot学习之高并发接口优化—–秒杀接口地址隐藏(验证码)+接口限流防刷 秒杀接口地址隐藏 思路:秒杀开始之前,先去请求接口获取秒杀地址。 - 接口改造,带上PathVariable参数 - 添加生成地址的接口 - ...
  • 接口优化笔记

    2016-09-26 14:33:06
    问题提出:erp系统使用者提出erp界面响应慢;卡顿; 问题分析:通过chrome浏览器分析问题得出 ...2: 接口响应速度也比较慢,几百ms, 解决问题方案: 1 :通过过滤器配置 Gzip , 压缩css,j...
  • 好记性不如烂笔头,记录下来的才是永恒!这里是JavaQ大本营,诚邀关注。笔者,不断反思的年轻人。今天的内容聊一下刚参加工作时遇到的一个查询接口优化的内容。先聊背景线上某系统的用户中心页面...
  • 4 放水接口 5 子业务相互独立 优化工具与措施 CAT(Central Application Tracking):是基于Java开发的实时应用监控平台,为大众点评网提供了全面的监控服务和决策支持。更多介绍可以查看链接:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,132
精华内容 8,052
关键字:

接口优化