ARTS挑战,第一周
1、Algorithm
第一次做这个,先选一个简单的练练手,地址:https://leetcode.com/problems/two-sum/
要求:给一个整数组数(nums)及一个目标数字(target),要求找出数组里面满足两数字之和等于目标数字的脚下标
原文:(Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the sameelement twice.
Example:
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
)
我写的算法:
class Solution { public int[] twoSum(int[] nums, int target) { int length = nums.length; int[] arr = {-1,-1}; for (int i=0; i<length; i++){ for(int m=i+1; m<length;m++){ int first = nums[i]; int seconde = nums[m]; if((first + seconde - target) == 0){ arr[0] = i; arr[1] = m; return arr; } } } return arr; } }
分析思路:两层遍历判断,找到符合条件的就返回
收获点:写出自己的算法之后再去对比那些高手写的算法(https://leetcode.com/submissions/detail/196395714/),了解他们解决问题的方式,有对比就是最大的收获。
2、Review
阅读文章:https://medium.com/s/the-nuance/are-spin-classes-as-healthy-as-outdoor-cycling-515db68eba09
点评:作者从不同方面对比了室内的飞轮运动(骑动感单车)与室外骑自行车对比。两者都很健康,两者也均有一定的风险,室内运动侧着下半身力量,而室外则是侧着训练上半身以及平衡力。当然,在生活中选择哪一种,还得需要看人们对两种运动的态度、自身的情况以及条件。
3、Tip
学习了mysql的联合索引并用于实践
4、Share
标题:一次应用速度优化实践
项目背景:一个问卷评论系统,基于springboot的单体项目,服务器用的是阿里云的ECS服务器,数据库用的是阿里云Mysql版本的数据库,需要评论的问题150个,需要评论的机构大概会有5万左右,在测试环境进行测试的时候没问题,但在线上测试的时候就特别慢。
解决问题思路:
1、定位问题:根据实际使用情况,上线之后每天上午8点到12点,下午2点到5点的速度访问特别慢,不断的有用户反馈回来。阿里云mysql数据库有监控功能,进入云数据库查看日志记录,发现云数据库 IOPS 访问很高,内存使用率也很高(达到90%)。
代码方面,有两个接口访问次数有点多,一个问题分类接口(每个分类十多个问题,需要知道当前用户的问题分类填写进度,3种情况,0-未进行,1-填写中,2-已完成。问题填写的答案放在答案表,答案表数据20多万,代码的实现方式是遍历问题分类数据,对该分类下面的问题以及填写的问题数量做对比,此接口访问数据库需要访问将近20次);另一个接口:得到某一问题分类的问题列表及当前用户对该分类下的每个问题的答案(问题列表下有多少个问题就需要访问数据库多少次)
尝试解决方式:优化上面的问题分类接口,进入这个接口时,按照问题分类一次从数据库里面读取该分类下所有问题填写的评价答案,统计放到list里面,然后针对每个问题时再用list.stream().filter 做筛选,采取“以空间换时间”的概念,在正式服上之后,发现实际情况并没有缓解。同时监控这个接口的访问情况,发现接口的并没有问题。
由于我们的服务器本身配置低,此时我们才想到升级服务器配置上来。
2、对服务器配置和带宽同时进行升级,升级为原来的两倍,此时再单独去数据库执行sql语句,速度变快了很多,但还是超过了500ms。
3、第三步,采用mysql联合索引,对几个关键对字段建立联合索引(建在数据量多的表,数据少则没有必要),单独执行sql语句控制在60ms内。
4、其它的耗时的接口再做一些稍稍的优化,然后更新正式服,此时速度大有改观,速度优化目的达成。