字节跳动 数据开发实习生 java

这是我投递的岗位仍然是后端开发,但是我的简历还是转到了数开的那里
紧急学习了一下关于数开的一些技术栈
字节的面试官很好很好 是我太菜了呜呜  
大部分时间在问项目 并且很认真地引导我思考  
1. 先问项目  简单介绍一下项目
2. 介绍一下分布式锁  为什么要使用分布式锁 为了解决什么问题
用于分布式系统中保证资源的独占性  避免多个进程同时修改同一资源  

3. 分布式锁怎么实现的
  1. Redis  setnx  互斥命令  只用setnx xxx的时候才会成功
  2. 利用过期时间  如果出现宕机的情况也会自动释放
  3. 同一个线程无法多次获得同一把锁  
  4. 获取锁只尝试一次就返回false  没有重试机制
  5. 锁超时释放虽然可以避免死锁   但如果是业务执行耗时较长  也会导致锁释放问题
  6. Redisson 自动续期的机制 来避免锁的误释放问题   看门狗机制
    1. 自动会为锁续期  直到业务逻辑执行完成为止
    2. RedLock算法是一种基于多个redis实例的分布式锁机制    只有大多数节点成功枷锁  才认为锁被成功获取
    3. 重入锁
      1. 同一个线程可以多次获取同一把锁
      2. 锁计数器记录了获取锁的次数  
    4. 公平锁
      1. 按照请求的顺序来获取锁  类似于排队机制  需要保证请求顺序   而不是像非公平锁那样可以随机抢占资源
      2. 性能上会有所损失

4. 在这个项目中  你面对的最大的难题是什么
高并发下数据一致性  性能优化  缓存设计   解决分布式环境中的一致性和延迟问题

5. 你承担的角色是怎么样的
  1. 开发工程师  系统架构设计  核心功能开发  技术选型

6. 你的项目的数据链路结构会是怎样的
  1. 用户请求  负载均衡分发到应用服务器   通过消息队列分发任务   再到数据库存储   通过缓存和搜索引擎加速访问

7. 首页为什么要缓存  是静态页面还是动态页面 为什么要缓存  为什么之前那么慢
  1. 减少数据库负载和提升响应速度  

8. 你的数据埋点的整个数据链路是怎么做的

9. 会考虑性别 校区的影响吗

10. Kafka 是如何保证高容错的
  1. 数据存储
    1. 日志文件    内存提高读写速度  磁盘负责持久化操作
    2. 分段  清理机制  处理过期信息
  2. 消息分区
    1. 每个分区都是一个有序的消息序列   分区使得消息可以被消费者并行消费  提高了并行量
  3. 索引机制
    1. 方便消息的快速查找
  4. 高可用性
    1. 创建数据副本
  5. 顺序与一致性
  6. 缓存与流量控制机制
    1. 信用机制
  7. 分布式协调服务
    1. zookeeper来管理节点状态   分区分配   故障监测
  8. 消息消费机制
    1. 是主动推动 还是被动拉取
  9. 事务机制
  10. 错误恢复和重试机制
  11. 底层优化
    1. Kafka  zookeeper
    2. Rabbitmq amqp协议  使用内存和磁盘存储信息  

11. 再问问技术方面

12. Mysql 事务的隔离级别是什么

13. 什么会发生幻读

14. 如何避免幻读
  1. 可重复读结合MVCC机制 实现  或者使用表级锁来避免幻读

15. redis的list底层是怎么样实现的
  1. 双向链表和压缩列表实现   提供高效的插入和删除操作紧凑的存储:元素之间没有额外的指针,每个元素之间是紧密相连的,节省了空间。
  多种编码方式:压缩列表中的元素会根据内容的类型和大小选择最优的编码方式。比如,整数可以用更少的字节表示,小的字符串也会用更紧凑的格式存储。
  双向遍历:每个元素保存前一个元素的长度,使得压缩列表支持双向遍历,从头部或尾部都可以遍历整个列表。
  2. 与列表的元素个数有关  512个  每一个的字节都小于64
  3. 3.2版本之后 变成了 跳跃表
  4. 消息队列(但是有两个问题:1.生产者需要自行实现全局唯一 ID;2.不能以消
  费组形式消费数据)
  5. 有序单链表的一种改进  查询、插入、删除也是O(logN)的时间复杂度。  那如果加二级索引呢?如下图所示,查找路径:1、7、9、10。是不是找 10 的效率更高了?这就是跳表的思想,用“空间换时间”,通过给链表建立索引,提高了查找的效率。

16. Hash类型底层实现是怎样的
  1. 缓存对象  购物车等
  2. 压缩列表或者哈希表实现的
  3. 现在使用listpack   为了节省空间,它采用了多种编码方式来表示不同长度的整型和字符串

17. Set 类型
  1. 哈希表  整数集合
  2. 小于512  使用整数集合  大于使用 哈希表

18. Zset实现原理
  1. 排序场景
  2. 有序集合 元素小于128个  元素的值小于64字节时候  使用压缩列表
  3. 否则使用  跳跃表  和  哈希表
  4. 

19. redis的持久化了解过吗
  1. AOF日志
  2. RDB快照

20. redis为什么是单线程
  1. 「接收客户端请求->解析请求 ->进行数据读写等操作->发生数据给客户端」这个过程是由一个线程(主线程)  可以避免了多线程之间的竞争,省去了多线程切换带来的时间和性能上的开销,而且也不会导致死锁问题。
  2. 后台线程相当于一个消费者,生产者把耗时任务丢到任务队列中,消费者(BIO)不停轮询这个队列,拿出任务就去执行对应的方法即可。
  3. CPU 并不是制约 Redis 性能表现的瓶颈所在,更多情况下是受到内存大小和网络I/O的限制
  4. 使用了单线程后,可维护性高,多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗

21. spark操作过吗
  1. 数据处理  计算 模型训练

22. redis和mysql如何保证数据的一致性的
  1. 事务   消息队列  延迟双删除  数据同步脚本
  2. 更新数据的时候 直接删除缓存  
  3. 

23. 先读还是先存
  1. 优先读取缓存  缓存未命中时读取数据库并更新缓存

24. mysql的悲观锁 乐观锁
  1. 悲观锁  直接加锁
  2. 乐观锁  版本号等方式控制

25. mysql有哪些锁
  1. 行级锁  表级锁  全局锁  共享锁  排他锁  意向锁  保证数据一致性和并发控制

26. mvcc是乐观锁实现 还是悲观锁实现
  1. 乐观锁  通过记录数据的多个版本来实现隔离级别 避免加锁带来的性能影响


27. 幻读问题如何解决
  1. InnoDB 的 MVCC 结合快照读和间隙锁,使得在 REPEATABLE READ 隔离级别下也可以避免幻读。

28. Hive sql题   取出连续三天一样的数据id
  1. 窗口函数
但第一时间想到的方法被认为会有一些问题  被看出来了

29. MySQL是怎么保证原子性的?
  1. 事务的原子性就是:一个事物要么全部执行成功,要么全部执行失败。MySQL 主要是利用 undo log,也就是回滚日志来实现原子性。
  2. 平常我们在对数据进行增删改时,InnoDB 除了会记录 redo log,还会将更新的数据记录写进 undo log 中。当事务出现异常,执行失败的时候,就需要利用 undo log 中的信息将数据回滚到修改之前的版本
  3. undo log:
  4. 作用包括:
    - 提供回滚(行里面有一个roll point指向undo log该行修改前的信息)保证原子性!
    - MVCC(undo log版本链)
  - 与redo log 的区别:
  redo log: 记录的是物理日志,记录事务中修改的信息  保证事务的持久性   redo log   数据库崩溃时的数据恢复 
  undo log: 记录的是逻辑日志,记录修改前的信息    保证事务的原子性 
  事务的原子性就是:一个事物要么全部执行成功,要么全部执行失败。MySQL 主要是利用 undo log,也就是回滚日志来实现原子性。

30. Binlog是什么
  1. 日志文件

31. 编程题  字符串按照z字输出 java
Z 字形输出指的是将字符串按行间交替对齐,按行存储,然后逐行输出。可以用一个二维数组来模拟“Z”字形排列,或用指针上下移动实现 zigzag
字符串操作忘记了  所以被认为基础不牢 确实 刷题刷太少了
#牛客创作赏金赛##字节#

复盘:项目其实是我在一个月内紧急编出来的一个项目 自己并没有做很多亮点的地方 但是又必须得写一些亮点的地方  所以被拷打的很凶 基础不牢就很麻烦  现在想的是又需要沉淀一下  也需要可以更好的把技术真正的做好
全部评论
八股盛宴啊
1 回复 分享
发布于 2024-11-11 17:09 北京
数开咋问这么多后端的东西
1 回复 分享
发布于 2024-11-10 23:41 北京
这还是数据嘛,超纲了
点赞 回复 分享
发布于 2024-11-23 09:41 浙江
maya这是一次面试?
点赞 回复 分享
发布于 2024-11-18 12:50 美国
跳表在redis是list里的么?
点赞 回复 分享
发布于 2024-11-13 11:27 北京
卧槽,这应该过了吧
点赞 回复 分享
发布于 2024-11-11 15:49 上海

相关推荐

1假设一个队列需要删除其中一个节点,应该怎么去操作它?2那你是调用这个链表它本身提供的接口吗?那它该接口的底层大概是怎么实现的?3二分查找法,如果要计算时间复杂度,应该怎么去计算?4了解快排的时间复杂度应该怎么计算?5它的这个计算的复杂度,是稳定性的吗。6假如说有一连串的计算表达式1+ 2 * (3 + 5)/ (6 + 3)。这样的计算表达式,要计算它的数学结果,这个我应该怎么去做?7要把10进制转成 16 进制,是一个什么样的思路啊?8假设三维空间中有很多个点,假如说有 10 万个点,需要求距离最近两个点的坐标,我应该怎么去做?9地铁站的这些站点信息,打算怎么去存? Java 里面用什么样的数据结构去存这个这条线路?还有这个站点?假如以地铁站为例,有 2 号线、 1 号线,然后 1 号线有什么站点? 2 号线有什么站点?10面试官提示了用链表存储。继续问:那当你存了之后,怎么去做深度优先遍历啊?11假如说功能上线之后,我的用户访问量比较大,有 20 万用户同时去访问。那这时候我的查询、计算就会比较慢,我应该怎么去做相应的优化?●来不及改程序,直接加硬件资源●加缓存,直接带来性能优化●算法层面的优化12多个进程之间的通信方式会包括有哪些?13Redis 能简单说一下读写的流程吗?14假设redis集群三主三从,那节点是怎么去做选择的?怎么知道当前这个 key 是发到 a 节点还是这个 k 发到 b 节点,是一个什么样的策略?15实习的话是希望对自己有一个什么样的期望或者目的?
点赞 评论 收藏
分享
05-17 18:01
复旦大学 Java
Q1. Lamda表达式A1: Lamda表达式更简洁,创建匿名函数。简化函数式接口。只有一个表达式时,表达式的结果直接作为返回值;多个表达式,需要大括号,return语句作为返回值。lamda表达式使JAVA支持函数式编程,允许函数作为参数传递;结合Stream API处理集合操作如过滤。Q2. 为什么有包装类 Integer和int的区别A2. 集合,泛型只能使用引用类型,不能使用基本数据类型。集合需要支持动态内存分配、垃圾回收等特性,而这些机制都依赖于对象。int是基本数据类型,Integer是int的封装类,是引用类型。int默认值是0,而Integer默认值是null,所以Integer能区分出0和null的情况。基本数据类型在声明时系统会自动给它分配空间,而引用类型声明时只是分配了引用空间,必须通过实例化开辟数据空间之后才可以赋值。我自己想的是 集合如Set需要hashCode和equals方法来判断元素是否已经存在,所以集合必须用封装类Q3: 项目架构 选型 原因Q4: 微服务间调用方式、通信协议,为何这样选Dubbo 是阿里巴巴开源的高性能 Java RPC 框架,广泛应用于微服务架构中,其核心优势在于高效的远程调用能力、丰富的服务治理机制以及灵活的多协议支持。以下是关于 Dubbo 的微服务调用方式、支持的通信协议及选择 Dubbo 的原因的详细解析:---### **一、Dubbo 的微服务调用方式**Dubbo 的微服务间调用主要基于 **RPC(远程过程调用)** 实现,通过以下核心机制完成服务交互:1. **服务注册与发现**     - 服务提供者启动时,将自身信息(如服务名、地址、端口)注册到注册中心(如 Zookeeper、Nacos),消费者通过注册中心动态获取可用服务列表。   - 支持多种负载均衡策略(随机、轮询、最少活跃调用等),自动选择最优服务实例进行调用。2. **RPC 调用流程**     - **接口定义与共享**:服务提供者和消费者需共享相同的服务接口定义(如 Java Interface),通过代理机制屏蔽底层通信细节。   - **序列化与传输**:调用参数和返回结果通过序列化(如 Hessian、Protobuf)转换为二进制数据,通过 TCP 或 HTTP 协议传输。3. **服务治理机制**     - **容错策略**:提供 6 种容错模式(如失败自动切换、快速失败、广播调用),应对不同场景的异常处理需求。   - **动态配置**:通过配置中心(如 Nacos)实现参数动态更新,无需重启服务。---### **二、Dubbo 支持的通信协议**Dubbo 支持多种通信协议,开发者可根据场景灵活选择:| **协议**       | **特点**                                                                 | **适用场景**                                                                 ||----------------|--------------------------------------------------------------------------|-----------------------------------------------------------------------------|| **Dubbo 协议** | 默认协议,基于 TCP 长连接与二进制传输,性能高、延迟低,但跨语言支持有限。 | 高并发、低延迟的 Java 微服务间调用。                                           || **Triple 协议** | 基于 HTTP/2 和 Protobuf,兼容 gRPC,支持流式通信和 TLS 加密,穿透性强。 | 云原生环境、跨语言调用(如与 Go/Python 交互)或需要网关代理的场景。             || **HTTP/REST**  | 基于 HTTP 的 RESTful 风格,兼容性强,但性能较低。                   | 跨语言 Web 服务集成或对外提供开放 API。                                        || **gRPC**       | 基于 HTTP/2 的高效协议,支持双向流式通信,需依赖 Protobuf 定义服务。 | 需要强类型约束、跨语言且对性能要求较高的场景。                                 || **Hessian**    | 二进制协议,跨语言支持较好,但性能略逊于 Dubbo 协议。                          | Java 与非 Java 系统(如 PHP)间的轻量级集成。                                  |---### **三、选择 Dubbo 的核心原因**1. **高性能与低延迟**     - Dubbo 协议采用单一长连接和异步非阻塞通信(基于 Netty),在高并发场景下性能显著优于 HTTP/REST,例如在阿里巴巴双十一中支持万亿级调用。   - 序列化优化(如 Dubbo3 的 Triple 协议性能较 gRPC 提升 40%)。2. **完善的服务治理**     - **负载均衡**:支持随机、轮询、一致性哈希等策略,自适应算法可动态感知服务端负载。   - **容错与熔断**:内置多种容错模式(如 Failover、Failfast),支持服务降级和熔断机制,保障系统稳定性。   - **动态扩展**:服务实例可动态注册/注销,支持水平扩展与灰度发布。3. **多协议与生态兼容性**     - 支持 Dubbo、Triple、gRPC 等多种协议,可无缝集成 Spring Cloud、Kubernetes 等生态。   - 提供统一的服务治理能力(如监控、链路追踪),适用于混合技术栈环境。4. **生产级可靠性验证**     - 历经阿里巴巴大规模电商场景验证,支持百万级节点集群和智能流量调度,具备高可用性。---### **四、总结**Dubbo 通过高效的 RPC 调用机制、灵活的多协议支持以及强大的服务治理能力,成为构建高性能微服务系统的首选框架。其优势尤其体现在 **高并发场景下的性能表现**、**跨语言与云原生适配能力** 以及 **企业级服务治理功能**。若需进一步优化性能或扩展功能,可结合具体场景选择 Triple、gRPC 等协议,或通过第三方工具(如 Prometheus、Zipkin)增强监控能力。
招商银行AI面6人在聊 查看4道真题和解析
点赞 评论 收藏
分享
评论
10
38
分享

创作者周榜

更多
牛客网
牛客企业服务