字节面试三月后复盘
字节飞书 一面1.自我介绍起手2.你觉得你认为你做过的项目中最有挑战性的技术点3.如何解决?收获是什么?4.你这里提到了Etcd,你说说使用过程中学到了什么?5.讲讲Raft算法吧6.做个题吧 判断B是A的子结构(二叉树)7.你觉得你认为目前接触到的最困难的技术点或者技术栈是什么?或者说你认为你最感兴趣的是哪些?8.说了对计网和es最感兴趣(然后面试官就让我讲讲我对于计网的理解)9.讲到了数据链路层和物理层以及网卡之间的缓冲区。然后讲了QUIC。(提问,为什么不用Http3.0?历史遗留问题又是什么?)
腾讯面试三月后复盘
本身这场面试时间极短,也完全没有八股
但由于是笔者第一次面试(刚开始进入暑假实习投递,腾子太快了QAQ
现在回顾起来,腾讯此时这场面试更加考验笔者的自我学习能力以及是否会自己深挖
前情回顾1.自我介绍起手,然后丢两个算法题
(1) O(n)计算最长连续子序列长度 (2)检验二叉树是否成环(快慢指针+先序) md第一个我记得力扣原题做过的,忘记了,后面用的快排+dp,面试官同意nlogn了,二叉树这个就是有点卡壳(悲)2.我看你简历项目都是用了ElasticSearch,那你说说他跟MySQL的使用体验(提了MySQL模糊查询,es的倒排索引,lsm树之类的)3.为什么不能用es替代MySQL(场景+资源消耗)4.目前学了哪些计算机专业课程5.我看你在杭州是吧,然后是3-6月的实习时间阿巴阿巴。6.除了简历上做过的项目,还做过哪些?
复盘1.算法题O(n)计算最长连续子序列长度
经典LeetCode题,当时虽然没有刷到过,但是On肯定了就是哈希表,但是当时由于想用数组做哈希,导致卡壳后换成DP
正常哈希class Solution { public int l ...
SQL调优
MySQL SQL调优实战
后续把我的ArchLinux docker证书弄好,再考虑Es,Windows感觉太不方便了还是
文章暂时也不会很详细针对const、ref、range去进行优化,一般达到range已经完全足够了
表结构
商品表:product----------------------id (int, pk)name (varchar)category_id (int)price (decimal)status (tinyint) -- 0 下架,1 上架create_time (datetime)商品详情表:product_detail----------------------id (int, pk)product_id (int, fk)description (text)sales_volume (int)
用户希望在商品页中加载「最近一个月内上架的、销量前20的商品」并按分类聚合。
初始化表&mock数据-- 创建商品表DROP TABLE IF EXISTS product;CREATE TABLE product ( id INT PRIM ...
Snowflake
雪花算法ID那些事对于Id的要求业务
全局唯一性: 不能出现重复的id,这是最基本的要求
信息安全: 如果只是单纯的自增行为,要是有人恶意爬取分析就很难受了,经典的友商对自家商单数量分析,爬虫制定好 Url 爽爽爬取
可读性
技术
递增趋势: 由于我们常常使用MySQL这样的关系型数据库进行数据 存储,且常用的InnoDB引擎采用的B+树索引,所以主键选取上尽量采用有序的主键(不然每次insert都是一次大开销
单调递增: 保证下一个ID一定要大于上一个ID,方便进行排序、版本号等特殊需求
目前ID的使用方式UUID
简单、满足全局唯一性、信息安全
但是无序、且没有可读性,并且有另外的信息安全风险(我记得,有一个著名病毒作者就是被分析出MAC地址,然后被逮捕归案
Redis生成
满足全局唯一性、单调递增、可读性
通过 prefix + yyyyMMdd + sequence 这个格式生成id,其中sequence通过redis的incr命令生成
不安全
DB自增
唯一性、严格递增、可读
但很不安全啊!
雪花算法
终于到文章主角了?!
雪花算法是由Twitter公布的分布式 ...
RocketMQ使用/源码享用
RocketMQ
当前笔者使用版本为 RocketMQ 5.3.4-SNAPSHOT
保证顺序消费的四把锁
分布式锁(保证加入全局分区锁时的并发安全–broker中维护,类比redis
全局分区锁(key为消费者组名(因为多个topic被多个消费者组订阅),维护队列与单个消费者实例的锁)
Synchronized(保证一个消费者实例只有一个线程拉取消息、消费消息、提交消息)
让单个实例的一个线程进行校验、拉取消息、消费消息、提交消息
ReentrantLock(给队列加入一个锁,告诉别人我要进行使用,防止rebalance时队列调度到其他消费者组
可以看到processQueue的setDropped方法就是在重平衡的时候进行的
关于Kafka与RocketMQ的重平衡
对于顺序队列来说不会参与重平衡分配
RebalanceImpl&updateMessageQueueAssignment()
维度
Kafka
RocketMQ
触发机制
实时事件触发(消费者加入/离开、心跳失败、订阅变化)
定时轮询触发(默认 20 秒一 ...
MCP、RAG初体验以及相关思考
不同于之前直接使用API调用实现聊天功能
这里更希望思考以及学习AI应用开发相关原理,以及思考应用前景
AI应用开发体验以及相关思考
首先个人也是了解尚浅,网上资料貌似看上去很丰富,但是实际功能实现感觉完全没有使用大模型的意义
也许大家发布的博客或者视频内容仅仅只是展示以及入门demo
爬虫服务测试
感觉其实没什么太大问题, 但是中间细节过程发生了什么不得而知可能需要通过Java参数中特定一下 UTF-8的字符集
@Slf4j@Servicepublic class CrawlerService { @Tool(description = "根据关键词爬取图片资源") public List<CrawlerFunctionResponse> queryConfig( CrawlerFunctionRequest request) { log.info("抓取信息 {}", request.getKeyword()); Integer page = ...
手写动态线程池
手写动态线程池引入SPI机制添加预警以及参数校验
Go 实现 Raft一致性算法
动手写一个简单 Raft项目代码: moying688/moying-raft: 使用 Go 实现一个简单的 Raft 一致性算法
简介: 这里会使用 Go简单实现一个 Raft 一致性算法,使用Go库的RPC实现
后续可能考虑加入Etcd作为注册中心以及使用gRPC进行结点间通信(画饼doge.jpg)
不知道为什么,明明编码集是UTF-8
且终端Active code page: 65001但是打印中文还是乱码
因此该 项目 所有的打印日志等全用英文撰写,但是中文注释
画饼:后续可能会把 我的 Raft 笔记也写上,然后还有 RPC 和 动态线程池的轮子(还没建文件夹呢)
Tips: 有时候可能会出现奇奇怪怪的Bug
但是我可能解决过程中,一步步测试,有时候没来得及粘贴或者忘记记录了
所以每一步完结后,我会提交代码到 Github中(基本上是测试好的,如果还有bug,可能是后续要优化的点,也可能是确确实实写的时候没有考虑到这个问题,因为我Go语言也刚刚入门,算是边学边写了)
第一步:搭建初版结构raft/├── go.mod├── go.sum├── cmd/│ ...
ElasticSearch 进阶
ElasticSearch
ES使用场景
全文搜索
日志检索,配合Kibana可视化
商品搜索
实时监控
个性化推荐,根据用户搜索历史、浏览行为找出相似内容
地理位置搜索(外卖系统)
智能提示/提示词
🔵 MySQL不能替代ES,因为:
MySQL做全文检索很弱(like %xxx% 查询超级慢)
MySQL不擅长复杂聚合分析(特别是大数据量)
MySQL无法做到灵活的多字段模糊搜索、地理位置搜索、同义词处理
🔵 ES不能替代MySQL,因为:
ES写一致性弱,不支持多表事务(比如扣库存和扣余额一起回滚)
ES不保证强一致性(默认最终一致性,适合搜索,不适合资金类应用)
ES的数据模型松散,复杂关系建模很痛苦(比如订单拆分、子表操作)
什么是ElasticSearch?简单来说,ES是一个分布式的、基于文档的 搜索引擎+数据库系统
分布式: 天然支持分布式/集群、扩展节点
文档存储: 数据并不是以行或者列进行存储,而是一份份JSON文档
聚合分析(数值型字段)会单独存储到Doc values中,列式存储(加速聚合分析,且无冗余字段,比MySQL快太多 ...
代码随想录:回溯算法
[TOC]
回溯算法
本质还是暴力搜索,但是可以利用剪枝进行优化
77. CombinationsGiven two integers n and k, return all possible combinations of k numbers chosen from the range [1, n].
You may return the answer in any order.
Example 1:
Input: n = 4, k = 2Output: [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]Explanation: There are 4 choose 2 = 6 total combinations.Note that combinations are unordered, i.e., [1,2] and [2,1] are considered to be the same combination.
Example 2:
Input: n = 1, k = 1Output: [[1]]Explanation: There is 1 cho ...
代码随想录:二叉树
二叉树[TOC]
101. Symmetric TreeGiven the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center).
Example 1:
Input: root = [1,2,2,3,4,4,3]Output: true
Example 2:
Input: root = [1,2,2,null,3,null,3]Output: false
Constraints:
The number of nodes in the tree is in the range [1, 1000].
-100 <= Node.val <= 100
Follow up: Could you solve it both recursively and iteratively?
Yes ! I can
recursively
比较是否对称可以细化为,比较根节点的左右孩子,以及比较左孩子的左孩子跟右孩子的右孩子和左孩子的右孩 ...
代码随想录:栈和队列
[TOC]
栈和队列
一开始小登自己认为,栈和队列不就是特殊一点的数组嘛,就是闭合了一端的数组。还不能通过下标索引进行检索(这个时候完全没想到,栈和队列里面的元素存储并不是连续的内存)
225. Implement Stack using QueuesImplement a last-in-first-out (LIFO) stack using only two queues. The implemented stack should support all the functions of a normal stack (push, top, pop, and empty).
Implement the MyStack class:
void push(int x) Pushes element x to the top of the stack.
int pop() Removes the element on the top of the stack and returns it.
int top() Returns the element on the top of th ...
贪心算法
[TOC]
贪心算法455. Assign CookiesAssume you are an awesome parent and want to give your children some cookies. But, you should give each child at most one cookie.
Each child i has a greed factor g[i], which is the minimum size of a cookie that the child will be content with; and each cookie j has a size s[j]. If s[j] >= g[i], we can assign the cookie j to the child i, and the child i will be content. Your goal is to maximize the number of your content children and output the maximum number.
Examp ...
RabbitMQ learn
RabbitMQ相关介绍最好的学习文档: RabbitMQ 教程 - “Hello World!” |RabbitMQ 函数 — RabbitMQ tutorial - “Hello World!” | RabbitMQ
什么是消息队列 & 为什么使用?
Message Queue
顾名思义,存储消息的队列。
先来说说一个场景,以前送外卖的话或者送快递之类的,都是点到点,也就是快递小哥会直接送到你家,要是敲门发现不在,给你打个电话,此时你好像不得不回去?
其实先不说菜鸟驿站或者外卖柜。你们家家门口那块地就勉强算得上消息队列了,只不过不能保证安全,其他人也可以消费(bushi)
快递小哥只需要把快递放到你家门口,然后通过软件或者发短信,提醒你,就可以去干自己的事情了。而且你也不用马上去处理这个快递而打断当下做的事情。
什么是消息队列MQ全称为Message Queue,即消息队列。“消息队列”是在消息的传输过程中保存消息的容器。它是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接 ...
代码随想录:哈希表
代码随想录-哈希表篇在大学或者其他时候学习数据结构课程时。不难发现,算法发展都是由于对时间或者空间有较高的需求,从而一步步优化。在查询优化时,到二分法( log(N) )时,开始出现了瓶颈, 如何降到O(1)或者退而求其次追求O(2),O(3)呢?
在顺序查找和二分查找时,我们都是索引+关键字存储,那能不能直接使用关键字充当索引,那不就能直接O(1)了吗?
哈希表就是怎么个思想(个人这样想的)
要深入学习的话,可以考虑由这些方面入手:空间开辟大小、哈希函数(存储)、解决哈希冲突、底层原理等。
嘛,这里主要是入门一下,通过做题感受一下
242.有效的字母异位词力扣题目链接(opens new window)
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true
示例 2: 输入: s = “rat”, t = “car” 输出: false
这个题目给出的都是小写字母,所以在用go写的方法里面就更简单一些。额也因为Jav ...
代码随想录:链表
[TOC]
代码随想录—链表嗨嗨,越是到了期末周,越是想开摆。复习什么的,60分万岁吧。有些东西真不感兴趣了。
这次是来到了链表篇(毕竟链表和数组在数据结构中很是重要)
这里我基本都是使用的迭代法(递归法得慢慢修炼修炼再考虑了)
(从大一c语言学习的时候,就觉得大多数情况下都能约定好使用的是虚拟头结点就好了)
所以推荐使用链表时都使用一个虚拟头结点(力扣人好像喜欢叫哑结点)
偶尔的话可以使用哨兵结点,用于减少判断条件或者越界
先大概概括一下基本题型吧
链表的建立以及增删查改
虚拟头结点的使用,temp临时指针等
边界条件判断(什么时候使用current !=null 什么时候使用current.Next !=null)
拓展: 双向链表,循环链表(记得试试约瑟夫环这个经典问题)
反转链表
原地反转(注意使用指针保存下一个结点)
新建头结点然后使用头插
删除链表倒数第N个结点
直接暴力,第一次先算链表长度,第二次遍历删除该结点
使用前后指针,先让快指针走N步,然后慢指针开始出发。
判断是否有环
让你判断是否有环
快慢指针
哈希表
寻找环的入口
快慢 ...
代码随想录:数组篇
[TOC]
数组篇总结首先跟着代码随想录刷了一刷,大概接触到题型有二分法、移除元素/排序、滑动窗口、模拟行为
二分法
确定好左右边界,以及mid的变化就好
移除元素
for循环暴力!
快慢指针: 快指针去探索找寻符合条件的宝藏,然后交给慢指针
使用堆栈或者队列
排序
首尾双指针
滑动窗口
双层for循环暴力! 其实这种也是滑动窗口,只是完全是无脑滑动(以边界条件为条件)
双指针滑动,两个for循环(上面是n*n,这个是2n),且移动条件为场景需求条件(使用hashmap进行维护)
模拟行为
害。。听天由命,画图吧。
可能这里更多的是用go去实现吧,因为go语言我也是刚学,然后语法都不太稳固那种,更别说使用什么api了,所以感觉就是算法和go都拿。有思路但是go很卡壳的话就先用Java写一下然后查go的语法然后用go写
二分法34. 在排序数组中查找元素的第一个和最后一个位置给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [ ...