【DRF性能优化】

一、背景

项目中有一个查询脚本的接口,查询20条数据需要5min,性能很差,需要优化
在这里插入图片描述

二、问题排查

查看代码发现,serializers中,发现了一个奇怪的查询
查询脚本时,关联的脚本版本的一些字段也需要查询出来,代码中用了一种奇怪的查询方式,每个字段都重新查询一遍版本表,导致性能损耗。

    def get_bk_os_type(self, instance):
        return self.return_job_version_data(instance=instance, column_data="bk_os_type")

    def get_bk_os_type_cn(self, instance):
        return self.return_job_version_data(instance=instance, column_data="bk_os_type_cn")

    def get_language_cn(self, instance):
        return self.return_job_version_data(instance=instance, column_data="language_cn")

    def get_language(self, instance):
        return self.return_job_version_data(instance=instance, column_data="language")

    def get_content(self, instance):
        return self.return_job_version_data(instance=instance, column_data="content")
  
    def return_job_version_data(self, instance, column_data):
        try:
            if instance.live_version:
                script_version_object = JobScriptVersion.objects.filter(
                    job_script=instance.id, version=instance.live_version
                ).last()
                return JobScriptVersionModelSerializers(instance=script_version_object).data[column_data]
            else:
                if column_data in ["language", "content"]:
                    script_version_object = (
                        JobScriptVersion.objects.filter(job_script=instance.id, is_deleted=False)
                        .order_by("updated_time")
                        .last()
                    )
                    return JobScriptVersionModelSerializers(instance=script_version_object).data[column_data]
            return "--"
        except Exception:
            return "--"

除此之外,还存在很多应该查缓存,却实时查询接口的数据,导致接口很慢

三、措施

  1. 统一写一个函数,查询版本信息,然后通过to_representation更新返回数据
  2. 使用redis缓存数据,提升性能

最终,这个请求优化到2s

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值