一、背景
项目中有一个查询脚本的接口,查询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 "--"
除此之外,还存在很多应该查缓存,却实时查询接口的数据,导致接口很慢
三、措施
- 统一写一个函数,查询版本信息,然后通过
to_representation
更新返回数据 - 使用redis缓存数据,提升性能
最终,这个请求优化到2s