- 博客(51)
- 收藏
- 关注
原创 每日八股文7.18
但是,如果你使用了MQ,那么,A服务是不需要做更改的,它还是将消息放到MQ中即可,其它的服务,无论是原来的B服务还是新增的日志文件存储服务或日志邮件发送服务,都直接从MQ中获取消息并处理即可。如果使用 MQ,那么 A 系统连续发送 3 条消息到 MQ 队列中,假如耗时 5ms,A 系统从接受一个请求到返回响应给用户,总时长是 3 + 5 = 8ms,对于用户而言,其实感觉上就是点个按钮,8ms 以后就直接返回了。所以,面对突然到来的高并发,MQ也可以不用慌忙,先排好队,不要着急,一个一个来。
2025-07-18 10:05:36
850
原创 7.4项目一问题准备
经过重新压测,接口最大承载 QPS 达到了 3600/s 左右,并发下响应明显更快,所以我在简历中写“提升了 3 倍”是基于实际压测对比数据得出的。在为期一周的压测和线上模拟测试中,整体接口错误率低于 0.1%,成功率达到 99.92%,所以我写“可用性 >99.9%”是有监控数据支撑的。
2025-07-04 20:09:53
676
原创 每日八股文7.1
SQL 注入攻击是指攻击者通过在 HTTP 请求中插入恶意的 SQL 代码,使得后端服务器在构建和执行 SQL 查询语句时,将这些恶意代码也当作正常的 SQL 命令来执行,从而达到窃取数据、修改数据甚至控制服务器的目的。举个简单的例子,如果一个查询用户信息的接口通过拼接字符串的方式构建 SQL 语句,攻击者可以在传入的用户 ID 参数中加入恶意的 SQL 代码,比如 0 OR 1=1,这样就会导致查询返回所有用户的信息,造成数据泄露。
2025-07-01 21:56:38
1006
原创 每日八股文6.28
OSI 参考模型是一个理论上的网络分层模型,它将网络通信的不同功能划分为七个不同的层次。从上到下依次是:应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。每一层都有其特定的职责和协议。比如,在应用层,我们常见的协议有 HTTP、HTTPS 等,它们直接为应用程序提供网络服务。传输层则负责端到端的数据传输,主要的协议是 TCP 和 UDP。网络层负责在网络中进行路由和寻址,IP、ICMP 和 ARP 协议就工作在这一层。这种。
2025-06-27 23:15:50
967
原创 每日八股文补充
缺点: 尽管 Go 的 GC 目标是实现极短的 STW 时间(通常在微秒级别),并且大部分工作都是并发进行的,但在 GC 的某些阶段,特别是标记终止(Mark Termination)阶段,仍需要暂停所有用户 goroutine。影响: 即使是微秒级的 STW,在对延迟极其敏感的应用(如高频交易、实时游戏服务器)中,也可能导致可感知的延迟峰值。影响:当程序需要分配一个较大的连续内存块时,即使总的空闲内存足够,也可能因为没有足够大的连续块而导致内存分配失败,或者需要更频繁地触发 GC 来释放更多空间。
2025-06-14 23:51:55
939
原创 6.14项目一话术
我独立开发了一个名为 Bluebell 的项目,它是一个功能完整的社交媒体平台,核心功能类似于 Reddit。用户可以在平台上注册登录、创建和浏览帖子、加入不同的社区、并对帖子进行投票。这个项目的目标是构建一个高并发、高可用且易于维护的后端服务。为此,我选择了这套以 Go 语言为核心的技术栈,包括使用 Gin 框架来处理 Web 请求,MySQL 作为持久化数据库,Redis 作为高性能缓存,并计划通过 Docker 实现容器化部署。补充:问docker。
2025-06-14 17:14:43
1111
原创 每日八股文6.12
所以说,我们在Access Token的基础上,引入了Refresh Token,它解决了上面两个问题,首先,Access Token通常存储在内存中,而Refresh Token一般存在cookie上,这保证了安全性,另外最重要的是我们引入Refresh Token来刷新Access Token的这一过程,对用户是无感的,也就是用户不会察觉到。头部包括两个字段,第一个字段是alg,也就是指明我们的加密算法,分为对称算法和非对称算法两种,对称算法用到的一般是HS256,非对称算法一般用到的是RS256;
2025-06-12 21:15:34
918
原创 每日八股文6.11
热点数据缓存: 这是 Redis 最常见的应用场景。由于 Redis 速度快,非常适合存储访问频率很高的数据,比如商品信息、用户信息、配置信息等等。限时类业务的实现: Redis 提供了 expire 命令可以设置 key 的过期时间,这非常适合实现一些限时业务,比如验证码的有效期、优惠券的使用期限、活动倒计时等等。计数器的实现: Redis 的 incrby 等命令可以实现原子性的递增操作,在高并发场景下非常有用,比如可以用来做秒杀活动的计数、限制某个接口的访问频率等等。
2025-06-11 19:50:11
737
原创 每日八股文6.8
7. zskiplist结构体包含Header、Tail、Level、Length四个属性,其中Header指向该层的第一个节点,Tail指向指向整个跳表中顺序上的最后一个节点,Level表示整个跳表当前的最大层数(不含头结点,在这里是4),Length表示跳表中节点的总个数(同样不包括头结点,这里是3)Redis的RDB的本质是一个数据快照,以二进制文件的形式存储,他记录的是某一时刻redis数据库的状态,记录了所有键值对。补充:在 Redis 中,所有的 key 都是二进制安全的 String 类型。
2025-06-08 18:01:51
1045
原创 每日八股文6.6
MVCC的全称是多版本并发控制(Multi-Version Concurrency Control),是一种高并发数据库系统中的事务隔离技术。我理解的MVCC就是在实现事务隔离的基础上,进一步提升并发能力。传统的隔离技术比如锁,在并发读写时不可避免地会阻塞;MVCC通过维护多个版本的数据,实现了并发读写,从而很大程度的提高了吞吐量。
2025-06-06 19:53:11
785
原创 每日八股文6.4补
Redis 的 Hash 是一种 键值对集合,但与普通的键值对不同的是,Hash 中 每个键对应的值本身又是一个包含多个字段和值的键值对集合。可以把他想成一本书,外层的键对应的是书的名字,全局唯一,我们需要靠他来找到这本书;内层的键值对就像是书内的各个章节及对应的内容。其次,redis支持丰富的数据结构,不仅仅只是键值对,还支持列表,集合,哈希表,有序集合等,这些不同的数据结构可以在不同的业务场景中发挥其独特的优势。首先,redis是基于内存的数据库,所以它的读写速度非常快,可以有效提升程序的性能。
2025-06-04 19:15:51
663
原创 每日八股文6.4
覆盖索引是指在一个查询中,我们需要查询的字段(包括 SELECT 列表中的列、WHERE 子句中的条件列等)都可以在所使用的二级索引的叶子节点中找到,而不需要再回到聚簇索引中去查找完整的行记录。简单来说,就是我们要查询的数据,索引已经“覆盖”了,不需要再进行回表操作。使用覆盖索引的主要目的是为了提高查询效率,因为避免了回表操作,减少了一次磁盘 I/O。只需要扫描一次索引 B+ 树就可以获取到所有需要的数据。MySQL 的最左匹配原则是针对联合索引来说的。
2025-06-04 16:46:13
590
原创 每日八股文6.3
MySQL 中常见的存储引擎主要有 InnoDB、MyISAM 和 Memory。我比较熟悉的是 InnoDB 引擎,它也是 MySQL 的默认存储引擎。InnoDB 支持事务,具有事务的提交、回滚和崩溃恢复功能,这保证了数据的完整性和一致性。此外,InnoDB 还支持行级锁,这使得在并发环境下可以有更好的性能。MyISAM 引擎是我在学习过程中了解到的,它不支持事务,只支持表级锁。这意味着当一个会话正在写入 MyISAM 表时,其他会话都无法读取或写入该表,并发性能相对较差。
2025-06-03 21:31:25
1265
原创 每日八股文6.2
sync.Cond 条件变量用来协调想要访问共享资源的那些 goroutine,当共享资源的状态发生变化的时候,它可以用来通知被互斥锁阻塞的 goroutine。这个时候,就需要有个全局的变量来标志第一个协程数据是否接受完毕,剩下的协程,反复检查该变量的值,直到满足要求。Mutex 也称为互斥锁,互斥锁就是互相排斥的锁,它可以用作保护临界区的共享资源,保证同一时刻只有一个 goroutine 操作临界区中的共享资源。),P会去寻找其他空闲的M,或者创建一个新的M来继续执行队列中的其他G。
2025-06-02 22:40:53
791
原创 每日八股文6.1
read字段用来存放当前map的内容,当要读取map的内容时,都是先读取read字段里面的值,在读取dirty里面的内容;在go程序开始执行时,做的第一件事就是执行各个引入包的init()函数,init()函数无法被主动调用,只能是go运行时系统自动执行。itab 对于处理接口值上的方法调用至关重要。可以通过互斥锁来实现单例模式,但是这样做不如用sync.Once,因为我们无论做什么操作,即使现在这个实例已经被创建了,我们调用该函数的时候首先还是要加锁,会造成不必要的资源浪费,因为加锁和解锁都是有开销的。
2025-06-01 23:07:00
1054
原创 每日八股文5.31
因为在go的底层map的实现是一个哈希表,当要往map里面存储新的元素时,会为每一个键计算一个哈希值,而这个哈希值在内存中不一定是连续的;另外当map进行扩容时,所有在map中存储的元素都会重新计算一遍哈希值,所以多次遍历同一个map,结果不一定是相同的。
2025-05-31 22:06:46
1120
原创 每日八股文5.30
下面是go限流器的代码示例。select是一种go可以处理多个通道之间的机制,看起来和switch语句很相似,但是select其实和IO机制中的select一样,多路复用通道,随机选取一个进行执行,如果说通道(channel)实现了多个goroutine之前的同步或者通信,那么select则实现了多个通道(channel)的同步或者通信,并且select具有阻塞的特性。context.Context 类型是 Go 语言中用于控制请求的取消操作、截止时间、以及其他跨API和包的请求范围的值的核心接口。
2025-05-30 22:12:08
922
原创 每日八股文5.29
用来协调并发场景中不同的goroutine之间的通信,通过使用channel,一个goroutine可以向另一个goroutine发送数据,也可以接收数据,channel保证了goroutine之间可以安全的共享数据,并且避免了数据竞争问题。如果在子协程内没有使用defer/recover来捕获异常,那么父协程就会受到影响,程序会终止运行,如果用了defer/recover来捕获异常,父协程可以继续正常执行下去,不受影响。Go 语言中使用一个名为 error接口来表示错误类型。
2025-05-29 20:28:38
899
原创 豆包MarsCode刷题稀土掘金AI刷题 Problem3. 数字字符串格式化(golang解答)
小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。有些例子里面还可能包含无用的前导0,这些需要去除,可以直接使用Trimleft方法,因为s可能是浮点数,所以首先考虑先把浮点数的整数部分和小数部分分割开来,之后整数部分从右往左每三位插入一个逗号即可。输出:‘1,294,512.12412’输出:‘123,456,789.99’输出:‘987,654,321’
2025-01-03 17:56:37
379
原创 Problem:48. 旋转图像
令temp = matrix[len(matrix) - row - 1][len(matrix) - col - 1],由于此时row = len(matrix) - row - 1 & col = len(matrix) - col - 1,同样的可得matrix[len(matrix) - col - 1][row] = matrix[len(matrix) - row - 1][len(matrix) - col - 1]4的矩阵,只处理左上2。),空间复杂度O(1)),空间复杂度O(n。
2024-10-17 15:54:30
519
原创 Problem:54. 螺旋矩阵
需要模拟出螺旋前进的过程,顾名思义,也就是按照右下左上的顺序,如果说遇到行越界或列越界或当前元素已经访问过,那么direction就要变化一次。时间复杂度:O(m*n)空间复杂度:O(m*n)
2024-10-16 15:22:23
190
原创 Problem: 238. 除自身以外数组的乘积
分别创建两个列表用来记录当前元素的前面元素的成绩与后面元素的成绩,更新这两个列表,最后用一个循环来更新除自身以外数组的乘积的列表即可。时间复杂度:O(n)空间复杂度:O(n)
2024-08-02 17:22:31
172
原创 Problem: 189.轮转数组
需要注意k值和nums长度的关系的影响,如果k>=len(nums),需要有单独的逻辑来处理,而这个逻辑也适用于k<len(nums)的情况。第一种方法对应的思路是像题目中示例给出的解释一样,用循环来做,每一次循环将后面的一个元素移到前面来。第二种方法的思路是直接使用切片来做。方法二,时间复杂度O(n),空间复杂度O(1)
2024-07-24 10:57:30
250
原创 Problem: 56.合并区间
相对简单,只要把所有情况考虑清楚,都列举全即可。对于len(intervals)>=2的情况,用双指针解决。由于列表内元素可能是乱序,所以在处理前需要先按列表内的元素按第一位排序一下。
2024-07-23 17:15:50
156
原创 Problem: 53. 最大子数组和
考虑动态规划,把问题分解为小的子问题,在这个问题中我们把子问题dp[i]定义为以nums[i]结尾的连续子数组的最大值。以测试用例1为例,现在nums=[-2,1,-3,4,-1,2,1,-5,4],则初始值dp[0]=-2,dp[1]=-2+1=-1,dp[2]=-2+1=-1……,注意对于每个时刻的dp[i],有。时间复杂度:O(n)空间复杂度:O(n)
2024-05-27 14:59:15
217
原创 Problem: 42.接雨水
这个问题可以这样模拟:我们每一格能盛放的水的容量其实取决于这一格的左边的单位高度和右边的单位高度,拿第三个格举例,左边的单位高度为1,右边的单位高度为2,同时这一格是没有黑色柱子的,所以这一格能存储的容量就是min(左边高度—右边高度)— 黑色柱子的高度!两个循环遍历记录下当前位置左边的单位高度的最大值pre_max以及当前位置右边的单位高度最大值suf_max,问题的解就等于每一格的min(pre_max,suf_max)减去当前格子的黑色柱子的高度。时间复杂度:O(n)空间复杂度:O(n)
2024-05-21 21:01:38
231
原创 Problem: 15.三数之和
先对数组进行排序,然后固定一个数nums[k],然后再用两个指针分别指向k+1,len(nums)-1,在循环过程中要注意去除重复元素。另外还有一个隐藏的终止循环条件,即如果此时nums[k]>0,那么直接break。三重循环后再去重,但是时间复杂度会达到O(n3),提交后无法通过测试用例。犹豫不决先排序,步步逼近双指针。
2024-05-19 18:57:41
147
原创 Problem: 11. 盛最多水的容器
典型的双指针问题,一开始i指向数组最左端,j指向最右端,循环条件当i<j时,求取此时的面积,并放入一个列表中存储,然后比较此时的height[i]与height[j]哪个更大,如果height[i]更大,那么指针j左移,反之,指针i右移。最终返回列表中最大的面积,完美解决!
2024-05-14 21:37:04
235
原创 Problem: 128. 最长连续序列
首先用set去除重复元素,因为重复元素并不影响最长连续序列的长度。然后定义两个列表,一个用来记录当前的最长连续序列,一个用来记录每个最长连续序列的长度。在循环里面用条件判断当前数字能否维持之前的最长连续序列即可,要注意的是下标越界以及整个序列就是最长连续序列的问题。
2024-05-13 19:07:42
226
原创 Problem: 49. 字母异位词分组
这题耗费了很多时间,一开始想的是从头开始遍历列表中的每个字符串,然后创建一个列表str_each_list来记录每一个字符串的字母,接着第二遍遍历列表,判断后续字符串的长度是否等于str_each_list的长度且str_each_list是否in后续字符串,如果是,则表明是字母异位词。最终我还是选择了官方解法,官方解法的思路是先创建一个value为字典的列表,然后将每个乱序后的字符串作为key,再把字符串加入到列表里,可以这么做的原因是因为字母异位词经过sorted后是一样的。
2024-05-13 17:13:47
291
原创 Problem: 1572. 矩阵对角线元素的和
因为是正方形矩阵,所以len(mat) == len(mat[0]),用这个作为循环条件,把所有元素加起来,如果len(mat)%2 == 1,那么就再把对角线相交的那个点的值再减一遍即可。把前几种矩阵对角线元素相加的情况列举一下,方可发现主对角线与副对角线元素下标的规律。时间复杂度: O(n)
2024-05-10 19:20:14
213
原创 Problem: 1672. 最富有客户的资产总量
其实就是对列表中的每一个列表中的数字求和,统计出每位客户的资产总额,再求出一个最大值,即为问题答案。先定义一个列表accounts_each,把每一个客户的资产总量添加到里面,再返回最大值。时间复杂度:O(n)
2024-05-10 19:15:20
164
原创 Problem: 13. 罗马数字转整数
从后往前用while循环处理罗马数字字符串,当遇到成对的特殊罗马数字时,便进行相应的特殊处理,并让index-=2。对于每一个ifelse里面的处理都把结果添加到final_num中,最后返回final_num。好久没有做过题,记得之前有接触到这一题,也是罗马数字转阿拉伯数字,不过要比这题简单。看了官方给的提示后逐渐有了思路,应该先用字典建立一个罗马数字与阿拉伯数字的映射,再从后往前处理这个罗马数字字符串。
2024-05-10 19:11:58
197
原创 Problem: 1523. 在区间范围内统计奇数数目
正常人想法,循环遍历,统计奇数个数,提交发现超时。看提示后惊觉可以总结规律,分为两种情况讨论。
2024-05-10 18:59:11
149
原创 Problem: 67. 二进制求和
先创建一个列表用来存储我们的相加结果,然后按情况分别讨论,分别是两位都是1且进位也是1,两位都是1,以及其它情况。当两个字符串都遍历完后,分别检查a或b是否还有剩余的数字,再分别进行相应的处理。最终把列表逆置一下,因为它存储的是相加后每位从后往前的结果。既然是二进制求和,则可用二进制求和手算的方法模拟,并用代码实现,即对a和b两个二进制数,从末位开始相加,如遇到两个数字相加大于1,则有进位,下一位相加时就需考虑进位,若两个数字相加小于等于1,则无进位,继续按照从右往左的顺序逐位相加即可。
2024-05-10 18:51:43
247
原创 Problem: 73. 矩阵置零
8.7更新:折腾了一上午,终于把原地算法写了出来,看到官方提示4里给出了可以用第一行和第一列来作为标记,从而判断该行或该列是否应该置0,于是我就沿着这种思路,两层循环来确定当前matrix[i][j]是否为0,如果为0,那么matrix[0][j]和matrix[i][0]都设为0。这样的问题是假如先更新的是列,那么本来这一列是正常的,更新完后就全变为了0,那么再更新行的时候,由于先前的列都变成了0,所以行也跟着全变成了0,这并不是我想要的。但是结果也不尽如人意。见代码,非常容易理解。
2024-05-10 18:31:31
182
原创 编程题 7-30 字符串的冒泡排序(python解答)
我们已经知道了将N个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的K(
2023-08-10 15:57:00
255
1
原创 编程题 7-26 单词长度(python解答)
你的程序要读入一行文本,其中以空格分隔为若干个单词,以结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it's算一个单词,长度为4。注意,行中可能出现连续的空格;最后的不计算在内。
2023-08-09 14:38:55
681
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人