这是我投递的岗位仍然是后端开发,但是我的简历还是转到了数开的那里紧急学习了一下关于数开的一些技术栈字节的面试官很好很好 是我太菜了呜呜 大部分时间在问项目 并且很认真地引导我思考 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字输出 javaZ 字形输出指的是将字符串按行间交替对齐,按行存储,然后逐行输出。可以用一个二维数组来模拟“Z”字形排列,或用指针上下移动实现 zigzag字符串操作忘记了 所以被认为基础不牢 确实 刷题刷太少了#牛客创作赏金赛##字节#复盘:项目其实是我在一个月内紧急编出来的一个项目 自己并没有做很多亮点的地方 但是又必须得写一些亮点的地方 所以被拷打的很凶 基础不牢就很麻烦 现在想的是又需要沉淀一下 也需要可以更好的把技术真正的做好