字节跳动 | 抖音支付go实习
时间:2022.11.7 16:00-17:00 60min
又是在牛客网被邀请投递,我发现字节好喜欢邀请我,被邀请三次了,主动投递不理睬,邀请的一般都会有面试机会。
- 自我介绍
分布式对象存储项目
-
怎么实现的?
-
数据去重算法怎么做的?怎么判断具体的数据怎么重的?时间复杂度?
数据节点启动的时候,用一个协程,扫描一遍本地磁盘,将所有对象的散列值读入内存map中,避免了每次定位导致一次磁盘访问。 去重的过程就是 接口节点像数据节点发送定位消息(散列值),判断是否存在于map中,时间复杂度是 O(1)
-
哈希表存储在内存?内存爆满怎么办?
一种常见的解决方案是使用磁盘文件。将 map 中的键值对按照一定的规则(例如哈希值)分成多个文件,每个文件中存储一部分键值对,然后通过使用哈希表或其他索引数据结构来定位键值对所在的文件,最终实现对 map 的访问。另外,你还可以针对热成分数据(被经常访问的数据)进行缓存,将其存储在内存中,以加快访问速度。 另一个解决方案是使用类似于流式计算的方式处理数据。即在接收到每个定位消息时,把当前 map 里的当前状态持久化并刷到磁盘,然后再去遍历磁盘上剩余的数据。这个过程可以利用较小的 map,如 LRU(Cache),定期刷到磁盘上的方式来实现。由于不需要大量的内存来存储 map,所以可以在一定程度上减少内存占用 第三种方法是通过下面的 Redis 来做缓存
-
上个问题说的用redis做缓存,如果redis缓存中key过期数据不存在,是否存储到数据服务?O(n)判断?。这里一直在追问
在使用 Redis 作为缓存时,如果某个键的缓存过期且数据不存在,应该考虑是否需要从数据服务中重新获取该数据,并将其存储到 Redis 缓存中。这涉及到数据一致性和缓存穿透的问题。 如果在 Redis 中的某个数据过期了,同时该数据在数据服务中被删除了,那么如果直接从数据服务中重新获取该数据,并将其存储到 Redis 缓存中,可能会导致数据不一致的问题。因此,我们需要在数据服务中删除数据的同时,删除 Redis 中对应的缓存数据。如果通过某种手段,在 Redis 中数据过期的同时,将数据服务中对应数据的删除操作也完成了,那么就可以安全地从数据服务中重新获取数据,并将其存储到 Redis 缓存中。 另一方面,如果在 Redis 中缓存的数据过期,但数据服务中该数据未被删除,那么如果直接从数据服务中重新获取该数据的话,可能会导致缓存穿透的问题,即大量请求都落在了数据服务上,造成了数据服务的压力和浪费。为了避免缓存穿透,可以采用一些技术手段,如 Bloom Filter 等,来判断请求的 key 是否存在于 Redis 中,如果不存在,则可以直接返回缓存未命中的结果,避免了无谓的查询操作。而对于缓存命中的情况下,需要确保数据一致性,将获取到的数据存储到 Redis 缓存中,以加速后续的查询操作。 因此,在实际应用中,需要根据具体的场景和需求进行综合考虑和实现。在实现时,需要做好缓存、数据服务、Bloom Filter 等组件之间的协作和一致性管理,以确保系统的稳定性和可靠性。
-
断点续传怎么实现的?
go语言
没有问
计算机网络和操作系统
- http的method?具体?
- cookie和session有什么区别?
- http和https的区别?单项认证和双向认证流程?对称加密和非对称加密?流程?
- 进程和线程有什么区别?一个进程有什么数据段?同一个线程有哪些数据段可以共享的?你觉得栈区会共享吗?栈区和堆区有什么区别?
- 进程的通信方式?哪些方式比较快?为什么共享内存比较快?管道为啥慢?
数据库
- Mysql的索引有哪些?B+树和哈希索引有哪些区别
算法
-
版本号对比,version1和version2.大于返回1,小于返回-1,其他返回0.
001和0001比较的时候都视为1;1.0.0和1.0是相等的返回0
-
直接给的main函数,没有其他东西
总结和心得
- 面试官的评价是基础还不错,代码能力有待加强。项目比较符合后端技术栈,做项目需要考虑如何更快的实现?考虑边界条件,做业务很多问题就出在这里
- 然后总结一下算法题,这个题目出乎我的意料,以为是链表和树,结果是一道从来没见过的题目,所以重点还是要提升自己的算法能力,而不是固有的题目,知道面对一道题怎么去思考?一开始不要急着写,和面试官聊一下思路,边界条件没有考虑准确,这个面试官说也是考察中十分重要的
- 对面试经历的要求不会太多,理解本科生,不太会要求,看重计算机基础和项目亮点,尤其是做项目有哪些难点和亮点,代码能力是最基本的能力,项目就是锦上添花
- docker和k8s考察比较少,侧重计算机基础,算法能力,思考问题能力,
评论区