记录第一次接口上线过程
新入职一家公司后,前三天一直在学习公司内部各种制度文化以及考试。
一直到第三天组长突然叫我过去,给了一个需求的思维导图,按照这个需求写这样一个接口,
其实还不错,不用自己去分析需求,按照这上面直接开写。还有基本sql语句也给我了,存粹是让我练手的。
接下来就是各种环境配置,账号申请。
版本控制工具使用的是Gitlab
第一次代码提交
毫无悬念被打回来啦,
原因
没有使用缓存,公司项目还是一个多年的大项目,有着自己的缓存技术和体系,所有查询一般都是先走缓存,因为我的那个入参ids是多个客户id按逗号拼接而来的。所以可能在全量测试的时候根本扛不住。
解决
请教同事和组长,公司项目的缓存规范以及如何使用。
接下来就是查找自己所有需要的API接口啦结合同事的使用方法,自己去调用实现自己业务。
第二次代码提交
代码提交通过,但是测试不通过
原因
全量测试时,无反应,部分ID报空指针异常。
解决
对所有的可能出现的空指针对象进行校验,
针对无反应现象做了如下优化
原来的sql
SELECT id, SUM( price* call_count) / 6
FROM table_name
WHERE statistics_date >= DATE_FORMAT( DATE_SUB( NOW(
),
INTERVAL 180 DAY),
'%Y-%m-%d %H:%i:%s'
)
AND id in( 156)
GROUP BY id
原来的sql
优化后的sql
SELECTid, SUM( price* call_count) / 6 AS averageAmountFROMtable_nameWHEREid > (SELECTMIN( id)FROMtable_nameWHEREstatistics_date = DATE_FORMAT( DATE_SUB( NOW(),INTERVAL 180 DAY),'%Y-%m-%d'))AND id in( 156) GROUP BY id
这段sql一开始确实不理解什么意思,因为是组长优化后直接发给我的,先叫我看看为什么这么做。仔细一看我以为组长写错啦。因为我们要计算的是6个月的平均值 你们statistics_date 后应该是大于等于,不应该是等于。
于是怕到时候数据出错我又去问了问组长,终于明白
SELECTMIN( id)FROMtable_nameWHEREstatistics_date = DATE_FORMAT( DATE_SUB( NOW(),INTERVAL 180 DAY),'%Y-%m-%d')
这段sql是查询6个月前的那一天数据,找到这天当中id最小的,然后在外面的查询中查询id大于这个最小id的就是近6个月的数据,因为ID是只增的,且id作为主键索引查询效率肯定大于我之前写的sql。
继续优化sql
in函数的性能问题
当传递过来的参数长度较小时,使用in语句查询效率还是比较高的,当测试做全量测试时(参数长度在1000-2000之间)
那么就要考虑使用exists
为什么?
- exists与in的区别一:exists先执行外层的sql,in是先执行内层的子查询。
- exists与in的区别二:exists使用的是内层的索引,in使用的是外层的索引。
所以当in里面的数据量不大时,使用in效率大于exists。当子查询数据量大于外层查询时,使用exists效率大于in
第三次提交
性能测试通过,但是数据对不上
原因
通过接口查询出来的数据和给测试的sql查出来数据不一致。
解决
这种问题有些棘手。为什么呢?因为计算数据走缓存,猜想:可能是缓存里面数据不一致问题。
当然前提是保证所有代码计算逻辑没问题。
查缓存,将缓存里面的数据和数据库里面查出来数据做对比。经过一番对比排查。
果然是数据不一致问题。
虽然数据不一致问题在缓存架构里面是比较常见的问题。但是公司那么久的项目肯定不会出现这么低级的错误。
请教了组长,果然揪出端倪。
原来是sql语句里面少啦一些状态为不可用的条件。
最后做数据对比完全一致。
关于组长给我代码做的一些优化
我的思路
在此之前因为保证数据准确性还要先遍历一次参数ids,然后取出参数id对应的值
这样减少两次循环,在代码层面也做了一些优化。
相关文章:
记录第一次接口上线过程
新入职一家公司后,前三天一直在学习公司内部各种制度文化以及考试。 一直到第三天组长突然叫我过去,给了一个需求的思维导图,按照这个需求写这样一个接口, 其实还不错,不用自己去分析需求,按照这上面直接开…...
时序预测 | MATLAB实现Rmsprop算法优化LSTM长短期记忆神经网络时间序列多步预测(滚动预测未来,多指标,含验证Loss曲线)
时序预测 | MATLAB实现Rmsprop算法优化LSTM长短期记忆神经网络时间序列多步预测(滚动预测未来,多指标,含训练和验证Loss曲线) 目录 时序预测 | MATLAB实现Rmsprop算法优化LSTM长短期记忆神经网络时间序列多步预测(滚动预测未来,多指标,含训练和验证Loss曲线)效果一览基本描…...
如何利用Level2行情数据接口追板和交易股票?
十档行情看得更深的A股行情软件,我们在盘口数据中可以看到,买一到买五以及卖一到卖五,共10个价位的挂单情况,但基于上证所的level-2行情软件,视野则扩展到了买一到买十以及卖一到卖十数据,无疑比所有免费软…...
MySQL常用的聚合函数
聚合函数聚合函数对一组值进行运算,并返回单个值。也叫组合函数函数作用COUNT(*|列名) 统计查询结果的⾏数AVG(数值类型列名)求平均值,返回指定列数据的平均值SUM (数值类型列名)求和,返回指定列的总和MAX(列名)查询指定列的最⼤值MIN(列名)查…...
如何评估模糊测试工具-unibench的使用
unibench是一个用来评估模糊测试工具的benchmark。这个benchmark集成了20多个常用的测试程序,以及许多模糊测试工具。 这篇文章(https://zhuanlan.zhihu.com/p/421124258)对unibench进行了简单的介绍,本文就不再赘诉,…...
2023初级会计详细学习计划打卡表!自律逆袭,一次上岸!
2023年初级会计职称考试报名时间:2月7日-28日考试时间:5月13日—17日给大家整理了《经济法基础》和《初级会计实务》两科超实用的学习打卡表重要程度、难易度、易错点、要求掌握内容、章节估分等都全部总结在一起,一目了然!为什么…...
【Python】Python项目打包发布(四)(基于Nuitka打包PySide6项目)
Python项目打包发布汇总 【Python】Python项目打包发布(一)(基于Pyinstaller打包多目录项目) 【Python】Python项目打包发布(二)(基于Pyinstaller打包PyWebIO项目) 【Python】Pytho…...
一起Talk Android吧(第五百一十三回:Java中的byte数组与int变量相互转换)
文章目录整体思路示例代码各位看官们大家好,上一回中咱们说的例子是"自定义Dialog",这一回中咱们说的例子是" Java中的byte数组与int变量相互转换"。闲话休提,言归正转, 让我们一起Talk Android吧!在实际项目…...
22《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》中文分享
《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》 本人能力有限,如果错误欢迎批评指正。 第五章:Folding and Aggregation Are Cooperative Transitions (折叠和聚合是同时进行的) -蛋白质折叠的协同作…...
vue2 @hook 的解析与妙用
目录前言几种用法用法一 将放在多个生命周期的逻辑,统一到一个生命周期中用法二 监听子组件生命周期运行的情况运用场景场景一 许多时候,我们不得不在不同的生命周期中执行某些逻辑,并且这些逻辑会用到一些通用的变量,这些通用变量…...
网络技术|网络地址转换与IPv6|路由设计基础|4
对应讲义——p6 p7NAT例题例1解1例2解2例3解3例4解4一、IPv6地址用二进制格式表示128位的一个IPv6地址,按每16位为一个位段,划分为8个位段。若某个IPv6地址中出现多个连续的二进制0,可以通过压缩某个位段中的前导0来简化IPv6地址的表示。例如…...
MySQL运维知识
1 日志1.1 错误日志1.2 二进制日志查看二进制日志:mysqlbinlog ./binlog.000007purge master logs to binlog.000006reset mastershow variables like %binlog_expire_logs_seconds%默认二进制文件只存放30天,30天后会自动删除。1.3 查询日志1.4 慢查询日…...
易基因-MeRIP-seq揭示衰老和神经变性过程中m6A RNA甲基化修饰的保守下调机制
大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。2023年02月22日,《美国国家科学院院刊》(Proc Natl Acad Sci USA)期刊发表了题为“Conserved reduction of m6A RNA modifications during aging and neurodegeneration is lin…...
暑期实习准备——Verilog手撕代码(持续更新中。。。
暑期实习准备——手撕代码牛客刷题笔记Verilog快速入门VL4 移位运算与乘法VL5 位拆分与运算VL6 多功能数据处理器VL8 使用generate…for语句简化代码VL9 使用子模块实现三输入数的大小比较VL11 4位数值比较器电路VL12 4bit超前进位加法器电路VL13 优先编码器电路①VL14 用优先编…...
Qt音视频开发19-vlc内核各种事件通知
一、前言 对于使用第三方的sdk库做开发,除了基本的操作函数接口外,还希望通过事件机制拿到消息通知,比如当前播放进度、音量值变化、静音变化、文件长度、播放结束等,有了这些才是完整的播放功能,在vlc中要拿到各种事…...
Linux基础命令-nice调整进程的优先级
文章目录 Nice 命令介绍 语法格式 常用参数 参考实例 1 调整bash的优先级为-10 2 调整脚本的优先级为6 3 调整指令的优先级 4 默认使用nice命令调整优先级 命令总结 Nice 命令介绍 nice命令的主要功能是用于调整进程的优先级,合理分配系统资源。Linux系…...
解析C语言strcmp()函数
函数名: strcmp 头文件: <string.h> 函数原型: int strcmp(const char *str1,const char *str2); 功 能: 比较两个字符串的大小,区分大小写 参 数: str1和str2为要比较的字符串 返回值: str1 > str2 , 返回 1&…...
初识scrapy
认识scrapyscrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需实现少量的代码,就能实现数据的快速抓取scrapy使用了Twisted异步网络架构,可以加快下载速度 pip install twisted安装:pip install s…...
(JUC)核心线程 和 救急线程的区别;Executors-固定大小线程池单线程线程池
核心线程 和 救急线程的区别 救急线程是有个生存时间的,它执行完任务了,过了一段时间,没有新任务了,救急线程就会销毁掉,变成结束的状态 核心线程没有生存时间,它执行完任务后,它仍然会被保存…...
vue2的动画和过渡效果
文章目录过渡 & 动画Transition 组件基于 CSS 的过渡效果CSS 过渡类名 class为过渡效果命名CSS 过渡 transition实例1:实例2:CSS 动画自定义过渡的类名同时使用 transition 和 animation深层级过渡与显式过渡时长性能考量JavaScript 动画可复用过渡效…...
正数负数的取反运算推导过程
取反题目题目:数据常用位十进制数据举例 我们计算a 60的取反运算c~a 求c 引用的知识点知识点: 正数的反码 补码 都一样。 0的补码反码都一样 负数的反码,最高是标记符号位,其他位置1变0 1变0 负数的补码 反码1 步骤斜体样式本篇我们全用8位二…...
C语言 条件编译
目录 1. #if #elif #else #endif 2. #ifdef #else #endif 3. #ifndef #else #endif 4. 三者区别 根据不同情况编译不同代码、产生不同目标文件的机制,称为条件编译。 条件编译是预处理程序的功能,不是编译器的功能。 1. #if #elif #else #endif …...
Linux: ARM GIC只中断CPU 0问题分析
文章目录1. 前言2. 分析背景3. 问题4. 分析4.1 ARM GIC 中断芯片简介4.1.1 中断类型和分布4.1.2 拓扑结构4.2 问题根因4.2.1 设置GIC SPI 中断CPU亲和性4.2.2 GIC初始化:缺省的CPU亲和性4.2.2.1 boot CPU亲和性初始化流程4.2.2.1 其它非 boot CPU亲和性初始化流程5.…...
测试软件5
一 css基础 css定义:可以设置网页中的样式,外观,美化 css中文名字:级联样式表,层叠样式表,样式表 二 css基础语法 1.style标签写在title标签后面 2.选择器{属性名1:属性值1;属性名…...
前端JS内存管理
JS内存管理 内存原理: 任何变成语言在执行的时候都需要操作系统来分配内存,只是有些语言需要手动管理分配的内存有些语言有专门来管理内存的方式 如 JVM 了解以上的概念之后,我们再来了解一下大致的内存周期 分配需要的内存使用内存在不使用…...
第七章.集成学习(Ensemble Learning)—袋装(bagging),随机森林(Random Forest)
第七章.集成学习 (Ensemble Learning) 7.1 集成学习—袋装(bagging),随机森林(Random Forest) 集成学习就是组合多个学习器,最后得到一个更好的学习器。 1.常见的4种集成学习算法 个体学习器之间不存在强依赖关系,袋装(bagging)…...
Java_面向对象
Java_面向对象 1.面向对象概述 面向对象是一种符合人类思想习惯的编程思想。显示生活中存在各种形态的不同事物,这些食物存在着各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的关系,这种思想就是面…...
【IoT】智能烟雾报警器
设计简介 硬件设计由AT89C51单片机、DS18B20温度传感器、4位共阳数码管、电源模块、报警模块、按键模块、MQ-2烟雾检测模块和ADC0832模数转换模块组成。 烟雾传感器MQ-2检测空气中的烟雾气体,通过ADC0832进行数据转换,经过单片机的运算处理后在数码管上…...
Python实现定时执行脚本(5)
前言 本文是该专栏的第17篇,后面会持续分享python的各种干货知识,值得关注。 笔者在前面有详细介绍过几种使用python实现定时执行任务的方法,可以说都是简单易上手的那种。而本文,再来详细介绍另外一种定时方法,那就是利用任务框架APScheduler(advanceded python schedu…...
JavaSe第4次笔记
1.转义字符和编程语言无关。 2.斜杠(\)需要转义,反斜杠(/)不需要转义。 3.不能做switch的参数的数据类型:long float double boolean( String可以)。 4.输入的写法:Scanner(回车自动带头文件(import java.util.Scanner;)) Scanner scan …...
网站平台由什么搭建/百度一下你就知道官网下载安装
使用plot绘制正弦图形的命令语句: x[-pi:0.01:pi];ysin(x);plot(x,y)使用fplot(针对建立的数值函数):yinline(sin(x));fplot(y,[-pi,pi])使用ezplot(针对符号函数):syms x;ysin(x);ezplot(y)Imp…...
wordpress集成后台无法登录/乐陵市seo关键词优化
今天在网上看到两篇关于自定义Flowlayout的实现方式,自己按着两篇文章的思路也尝试写个demo学习一下,最后实现了效果。这个功能实现起来不算太复杂,主要是父容器的高度和换行的计算。下面是我最终实现的效果图以及源码. 项目源码 package com…...
做百度推广首先要做网站吗/品牌全网推广
公司有个测试服务器,上面跑了几个应用和一个DB。 DB被这个几个应用使用。 最近老是被挂掉。 CPU 使用率100%。 搞到最后大家都不能用。 敲个命令都没反应。 TOP命令显示的是一些Oracle session占用CPU资源太多。 杯具的是在服务器上连sqlplus 都进不去了,…...
电商平台开网店/东莞做网站优化
2019独角兽企业重金招聘Python工程师标准>>> win7程序报错,提示out of memory(Physical) 解决办法: 打开开始菜单,在搜索栏里面输入CMD,在查找到结果中找到CMD.exe, 按右键以管理员身份运行。在弹出的黑色命…...
营销网站建设费用/seo为什么要进行外部优化
往期精选● 架构师高并发高性能分布式教程(4000G)● 39阶段精品云计算大数据实战视频教程● 200本经典编程相关书籍下载● 互联网技术干货视频教程大全● 两套大型电商实战项目● 程序员如何制作高质量的简历【视频简历】更多精彩查看历史记录.........一个普通的网站发展…...
北京 网站建设600/海口关键词优化报价
时间过得真是快,距离2021考研只剩21天了!再有15天就可以打印准考证了!小编为大家整理了打印准考证的时间、流程以及注意事项等小贴士。各位21考研er,打印准考证,这些事你一定要知道哦。1准考证长什么样?此图…...