- 博客(214)
- 收藏
- 关注
原创 接到一个需求,怎么做性能分析,以及性能优化过程
在分析前,必须先与需求方(产品、业务、运维)对齐性能指标,避免无的放矢。核心指标包括:1.响应时间(RT)接口/页面的平均响应时间(如 < 200ms)、95%/99% 分位响应时间(如 99% 请求 < 25ms)。不同场景差异:用户交互接口(如点击按钮)要求更低,后台批处理接口可放宽。2.吞吐量(Throughput)单位时间处理的请求数(TPS/QPS),如秒杀接口需支持 1000 TPS。数据处理场景:如每秒写入数据库的记录数、消息队列的消费速率。并发量。
2025-10-21 20:54:59
834
原创 遇到oom怎么处理?
明确类型 → 收集信息 → 定位根源 → 针对性优化。堆内存溢出和元空间溢出是最常见的场景,需重点关注对象引用和类加载问题;栈溢出和线程问题多与代码逻辑相关,需从调用链和线程池配置入手。长期来看,通过压测、监控和规范编码,可以有效预防 OOM 的发生。
2025-10-21 20:33:56
406
原创 导致消息积压的常见原因
生产速率 > 消费速率或消费端不可用,本质是“供需失衡”或“处理链路中断”。先查消费端:是否宕机、阻塞、线程池满、报错(最常见);再查生产端:是否突发流量、重复发送、无限流;接着查中间件:队列/分区数、存储资源、配置是否合理;最后查业务设计:是否无幂等、无死信队列、消息体过大。解决思路:短期通过“扩容消费端、批量消费、分流低优先级消息”缓解积压;长期通过“限流生产端、优化消费逻辑、合理配置中间件、完善容错机制”避免复发。
2025-10-21 20:17:26
737
原创 监控主要的噪音有哪些,怎么系统的降噪?怎么设置告警规则更合理化
告警噪音的本质是「“告警信号”与“实际故障”的不匹配」——要么是规则设计未贴合业务/环境特性,要么是工具/流程无法过滤冗余信息,最终导致“有效信号被噪音淹没”。规则层面:阈值适配场景(分峰谷)、增加时间窗口、分级分类;工具层面:开启告警抑制/聚合、根因分析;流程层面:建立静默窗口、告警认领、定期迭代规则;指标层面:聚焦核心指标、优化数据质量、区分监控对象。系统地降低监控告警噪音,核心是通过**“精准规则设计+智能机制过滤+流程化管理”**,让告警“该响的时候响,不该响的时候绝对不响”。
2025-10-20 21:40:07
839
原创 监控核心关注的指标
业务优先:所有指标最终要能关联到 “用户体验” 或 “业务损失”(如 “CPU 高” 本身不重要,重要的是 “CPU 高导致订单成功率下降”);聚焦核心:只监控 “影响系统可用性的关键指标”(如核心接口成功率、数据库连接数),避免冗余(如非核心服务器的 “开机时长” 无需监控);可量化、可告警:指标需有明确阈值(如 “错误率> 1% 告警”),且能被监控系统采集和计算;业务指标是监控的 “最终落脚点”,直接体现用户是否能正常使用服务,需与具体业务场景强绑定。一、业务层指标(最核心,直接反映用户体验)
2025-10-20 21:35:35
767
原创 什么是慢查询,慢请求,以及如何避免
特指数据库层面执行时间超过预设阈值的SQL语句(或其他数据库操作,如MongoDB的查询)。例如:一条查询语句在MySQL中执行耗时1.5秒,而预设的“慢查询阈值”是1秒,则被标记为慢查询。危害:占用数据库连接、消耗CPU/IO资源,可能导致其他查询排队阻塞,甚至拖垮整个数据库。类型核心优化方向关键工具/手段慢查询优化SQL与索引、控制数据量、提升DB性能慢查询日志、EXPLAIN、分库分表、索引优化慢请求缩短链路、异步化、强化缓存、控制超时。
2025-10-20 21:33:24
702
原创 leetcode347. 前 K 个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。2)PriorityQueue内部使用的是堆排序,堆排序只会保证第一个元素是当前优先队列里最小(或者最大)的元素。进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。输入:nums = [1,2,1,2,1,2,3,1,3,2], k = 2。输入:nums = [1,1,1,2,2,3], k = 2。k 的取值范围是 [1, 数组中不相同的元素的个数]空间复杂度:O(N)
2025-09-20 20:34:21
436
原创 滴滴打车功能,设计测试case
13、支付环节,正常支付:行程结束后,多种支付方式(微信、支付宝等)均可成功支付。12、路线变更:用户 / 司机发起改道/增加途径地,系统重新计算费用并同步。7、司机接单后用户取消(用户应收到通知并重新匹配),能够再次下单。18、订单完成后,生成行程单:信息完整(时间、里程、费用明细)4、网络中断/弱网时提交订单(应提示网络异常并缓存订单)6、订单匹配,正常场景:下单后在合理时间内匹配到司机。11、行程分享:成功分享行程给亲友,包含预计到达时间。时间同步问题:手机时间错误时,订单时间是否准确。
2025-09-18 21:50:42
360
原创 LCR 181. 字符串中的单词反转
你在与一位习惯从右往左阅读的朋友发消息,他发出的文字顺序都与正常相反但单词内容正确,为了和他顺利交流你决定写一个转换程序,把他所发的消息 message 转换为正常语序。注意:输入字符串 message 中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。输出: “world!
2025-09-17 21:17:25
219
原创 leetcode219. 存在重复元素 II
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k。下标大于 k:将上一滑窗的左端点元素 nums[i−k−1] 移除,判断当前滑窗的右端点元素 nums[i] 是否存在 Set 中,若存在,返回 True,否则将当前元素 nums[i] 加入 Set 中。输入:nums = [1,2,3,1,2,3], k = 2。输入:nums = [1,0,1,1], k = 1。
2025-09-16 21:16:10
137
原创 测试电商购物车功能,设计测试case
在电商场景中,购物车是连接商品浏览与下单支付的关键环节,需要从功能、性能、兼容性、安全性等多维度进行测试。
2025-09-13 18:40:34
1020
原创 对窗帘进行测试,设计测试case
对窗帘进行测试时,需要覆盖其功能、性能、安全性、易用性等多个维度,结合不同使用场景和潜在风险设计测试用例。通过以上测试用例,可全面验证窗帘的质量、安全性和用户体验,覆盖日常使用及极端场景的潜在问题。二、性能测试(耐用性与环境适应性)五、特殊场景测试(极端与边缘情况)一、基础功能测试(核心功能验证)三、安全性测试(防风险与合规性)四、易用性测试(用户体验验证)
2025-09-12 21:13:52
209
原创 leetcode1493. 删掉一个元素以后全为 1 的最长子数组
⚠注意:删除之前的子数组长度是 right−left+1,由于题目一定要删除一个数(尤其是在全为 1 的情况下,一定要删除一个 1),所以删除后的子数组长度是 right−left,用其更新答案的最大值。解释:删掉位置 4 的数字后,[0,1,1,1,1,1,0,1] 的最长全 1 子数组为 [1,1,1,1,1]。解释:删掉位置 2 的数后,[1,1,1] 包含 3 个 1。输入:nums = [0,1,1,1,0,1,1,0,1]输入:nums = [1,1,0,1]特殊case:1,1,1;
2025-09-03 21:30:43
372
原创 leetcode567.字符串的排列
数组元素为a-z的范围的字符,虽然排列顺序不一致。但如果引入额外的数组,以元素值关联到下标,元素个数作为value,那么就可以直接调用数组的比较函数了。给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的 排列。否则,返回 false。形成第一次滑动窗口后,i = 2时,while循环内i = 3,for循环变更i++=4,此时越界,退出for循环。正确的写法应改为if判断,使得for循环内窗口右边界新加入的元素下标和i保持一致。换句话说,s1 的排列之一是 s2 的 子串。
2025-09-02 18:36:46
182
原创 leetcode46.全排列
以 {1, 2, 3} 为例,先取1,全排列为{1},2进来后,全排列变为 {{1,2},{2,1}},3进来后,全排列变为{{3,1,2},{1,3,2},{1,2,3}, {3,2,1}, {2,3,1}, {2,1,3}},这就是最后的结果,这样应该更好理解一些(后一次的全排列就是让新元素在原来的全排列的每个排列中的所有位置都出现一次)。输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]),其中 n 为序列的长度。输出:[[0,1],[1,0]]
2025-09-01 20:40:39
290
原创 leetcode643. 子数组最大平均数 I
思考在1基础上,内层for循环可以优化,第一次拿到前4个元素,形成初始窗口,后面向右滑动即可,每次右入1个元素,左出1个元素;解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75。请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。输入:nums = [1,12,-5,-6,50,3], k = 4。时间复杂度O((n-k+1)*k),空间复杂度O(1)输入:nums = [5], k = 1。时间复杂度O(n),空间复杂度O(1)输出:5.00000。
2025-08-30 19:24:19
344
原创 leetcode143.重排链表
先得到1-》5,接下来把2-》3-》4交换,第二次交换完的结果是2-》4(剩余节点3还没处理)不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。优化:prev直接用null初始值,就不需要特殊判断头结点了。1-》2-》3-》4-》5,预期1-》5-》2-》4-》3。1-》2-》3-》4-》5,预期1-》5-》2-》4-》3。输入:head = [1,2,3,4,5]链表的长度范围为 [1, 5 * 104]输入:head = [1,2,3,4]输出:[1,5,2,4,3]输出:[1,4,2,3]
2025-08-29 11:25:35
376
原创 leetcode392.判断子序列
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。当 s[i] == t[j] 时,代表匹配成功,此时同时 i++ , j++;= t[j] 时,代表匹配失败,此时仅 j++;外层for循环以t为基准,一直枚举匹配s的全部元素(可能包含重复操作))时间复杂度O(n)(n为字符串t长度,最差遍历完),空间复杂度O(1)给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
2025-08-27 19:03:14
387
原创 leetcode28. 找出字符串中第一个匹配项的下标
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。1、暴力解法,双指针法,枚举原串 ss 中的每个字符作为「发起点」,每次从原串的「发起点」和匹配串的「首位」开始尝试匹配。输入:haystack = “leetcode”, needle = “leeto”解释:“leeto” 没有在 “leetcode” 中出现,所以返回 -1。解释:“sad” 在下标 0 和 6 处匹配。
2025-08-27 17:55:44
260
原创 leetcode LCR 016. 无重复字符的最长子串
如果 s[i, j) 子串没有重复字符的话,那么如果要判断 s[i, j] 没有重复字符的话,我们只需要判断 s[i, j) 中是否存在 s[j] 即可。给定一个字符串 s ,请你找出其中不含有重复字符的 最长连续子字符串 的长度。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。解释: 因为无重复字符的最长子字符串是 “abc”,所以其长度为 3。解释: 因为无重复字符的最长子字符串是 “b”,所以其长度为 1。解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
2025-08-26 21:44:01
237
原创 leetcode516. 最长回文子序列&最长回文子串
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。解释:一个可能的最长回文子序列为 “bbbb”。解释:一个可能的最长回文子序列为 “bb”。时间复杂度和空间复杂度都是O(n^2 )输入:s = “bbbab”输入:s = “cbbd”s 仅由小写英文字母组成。
2025-08-21 20:40:38
191
原创 LCR 018. 验证回文串
1、双指针,思路比较简单,分别指向首尾开始遍历(循环退出条件同时适用于奇数个元素和偶数个元素)。给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。输入: s = “A man, a plan, a canal: Panama”解释:“amanaplanacanalpanama” 是回文串。本题中,将空字符串定义为有效的 回文串。输入: s = “race a car”解释:“raceacar” 不是回文串。字符串 s 由 ASCII 字符组成。
2025-08-21 19:07:30
156
原创 LCR 019. 验证回文串 II
2、中心扩散法,在删除一个元素后不方便使用递归继续判断是否回文,考虑使用双指针从首尾开始遍历。给定一个非空字符串 s,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。解释: 可以删除 “c” 字符 或者 “b” 字符。缺点:涉及删除字符操作操作复杂,运行超时。输入: s = “abca”输入: s = “aba”输入: s = “abc”s 由小写英文字母组成。
2025-08-21 18:50:51
198
原创 leetcode2248. 多个数组求交集
nums[0] = [3,1,2,4,5],nums[1] = [1,2,3,4],nums[2] = [3,4,5,6],在 nums 中每个数组中都出现的数字是 3 和 4 ,所以返回 [3,4]。不存在同时出现在 nums[0] 和 nums[1] 的整数,所以返回一个空列表 []。输入:nums = [[3,1,2,4,5],[1,2,3,4],[3,4,5,6]]输入:nums = [[1,2,3],[4,5,6]]nums[i] 中的所有值 互不相同。3、统计元素出现的次数。
2025-08-19 18:48:47
266
原创 leetcode350.两个数组的交集 II
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输入:nums1 = [1,2,2,1], nums2 = [2,2]如果 nums1 的大小比 nums2 小,哪种方法更优?
2025-08-19 18:20:07
219
原创 leetcode349. 两个数组的交集
给定两个数组 nums1 和 nums2 ,返回 它们的 交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序。输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输入:nums1 = [1,2,2,1], nums2 = [2,2]解释:[4,9] 也是可通过的。
2025-08-19 18:11:36
167
原创 leetcode43. 字符串相乘
1、竖式运算思路,StringBuilder保存每一轮的计算(根据规律需要补0操作),最后利用leetcode415字符串相加 完成和的计算。给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。输入: num1 = “123”, num2 = “456”num1 和 num2 都不包含任何前导零,除了数字0本身。输入: num1 = “2”, num2 = “3”num1 和 num2 只能由数字组成。输出: “56088”
2025-08-18 21:02:37
202
原创 leetcode415. 字符串相加
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。输入:num1 = “11”, num2 = “123”输入:num1 = “456”, num2 = “77”输入:num1 = “0”, num2 = “0”num1 和num2 都只包含数字 0-9。num1 和num2 都不包含任何前导零。
2025-08-18 20:28:17
381
原创 leetcode88. 合并两个有序数组
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3。合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。输入:nums1 = [0], m = 0, nums2 = [1], n = 1。输入:nums1 = [1], m = 1, nums2 = [], n = 0。解释:需要合并 [1,2,3] 和 [2,5,6]。解释:需要合并的数组是 [] 和 [1]。输出:[1,2,2,3,5,6]
2025-08-18 17:59:50
406
原创 LCR 076. 数组中的第 K 个最大元素
在此过程中,i走过的区域都是大于等于待排元素的,j走过的区域都是小于待排元素的,最后i和j相遇且指向的都是废弃元素。从i位置往后遍历,找到小于待排元素,把该元素换到右指针指向位置(上轮的废弃位置;从j位置往前遍历,找到大于待排元素,把该元素换到左指针指向位置(此时右指针位置废弃);请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。输入:nums = [3,2,3,1,2,4,5,5,6], k = 4。输入:nums = [3,2,1,5,6,4], k = 2。
2025-08-15 21:15:19
411
原创 leetcode387. 字符串中的第一个唯一字符
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。2、使用哈希表,key为字符,value为是否出现重复字符。1、使用哈希表,key为字符,value为频次。输入: s = “loveleetcode”输入: s = “leetcode”输入: s = “aabb”
2025-08-15 16:53:24
196
原创 LCR 176. 判断是否为平衡二叉树
对二叉树做后序遍历,自底至顶返回左右子树深度,左右子树深度差都满足平衡树,则返回当前中间节点深度max(左子树深度,右子树深度)+1;从顶到底判断深度,引入一个获取当前子树深度的函数,比较左右子树深度差,若满足平衡,则依次比较左子树和右子树是否为平衡。先获取左右子树高度,再得出中间节点为根节点的树是否平衡,本质上是一种先序遍历。输入:root = [1,2,2,3,3,null,null,4,4]输入:root = [3,9,20,null,null,15,7]缺点:产生大量重复的计算,性能比较差。
2025-08-14 19:07:37
191
原创 leetcode49.字母异位词分组
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]字符串 “ate” ,“eat” 和 “tea” 是字母异位词,因为它们可以重新排列以形成彼此。输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]1、全部异位词共性:排序后唯一,可以此作为map的key,此key下的全部异位词组成list。字符串 “nat” 和 “tan” 是字母异位词,因为它们可以重新排列以形成彼此。输出: [[“”]]
2025-08-12 19:23:28
470
原创 leetcode35.搜索插入位置
当不存在target元素,总能到达一种状态,left=right=mid,此时,如果mid元素小于target,left=mid+1,越界,此时left位置为target应插入位置;如果mid元素大于target,right=mid-1,越界,此时left位置为target应插入位置;输入: nums = [1,3,5,6], target = 5。输入: nums = [1,3,5,6], target = 2。输入: nums = [1,3,5,6], target = 7。注意边界条件容易出错。
2025-08-12 16:33:11
150
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅