字节跳动后端二面

📍1. 数据库的事务性质,InnoDB是如何实现的?

数据库事务具有ACID特性,即原子性、一致性、隔离性和持久性。InnoDB通过以下机制实现这些特性:

🚀 实现细节:

  • 原子性:通过undo log实现事务回滚。
  • 一致性:通过事务的ACID属性和数据库约束保证。
  • 隔离性:使用锁和MVCC(多版本并发控制)实现不同隔离级别。
  • 持久性:利用redo log确保数据在系统崩溃后能够恢复。

🔧 MySQL事务示例:

START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

📍2. MySQL中数据的存储结构?

MySQL中的数据存储结构涉及表空间、段、区、页和行。InnoDB使用B+树结构存储数据和索引,聚簇索引将数据和主键索引存储在一起。

🚀 存储层次:

  • 表空间:逻辑存储单元。
  • :表空间内的逻辑部分,如数据段、索引段。
  • :由连续的页组成。
  • :最小存储单位,通常16KB。
  • :实际数据记录。

🔧 InnoDB数据存储示例:

SHOW TABLE STATUS LIKE 'table_name';

📍3. MySQL的主从复制原理以及主从延迟的解决方案?

MySQL主从复制通过binlog和中继日志实现数据同步。主从延迟可通过以下方法解决:

🚀 复制原理:

  • 主库记录binlog。
  • 从库I/O线程获取binlog并写入中继日志。
  • SQL线程执行中继日志中的SQL。

🚀 延迟解决方案:

  • 优化网络和硬件。
  • 并行复制。
  • 减少主库负载。
  • 使用半同步复制。

🔧 主从配置示例:

[mysqld]
log-bin=mysql-bin
server-id=1

📍4. Kafka怎么保证消息不丢、重复发了怎么办?

Kafka通过生产者、broker和消费者的协调保证消息不丢失。重复消息通过幂等性和去重机制处理。

🚀 消息不丢:

  • 生产者:设置acks=all。
  • Broker:使用持久化和min.insync.replicas。
  • 消费者:手动提交偏移量。

🚀 重复消息处理:

  • 幂等性生产者。
  • 消息去重。

🔧 Kafka生产者配置示例:

acks=all
retries=3

📍5. 你的项目中,接口调用如何保证幂等?

接口幂等性通过唯一标识符、乐观锁、分布式锁、状态机和Token机制实现,确保重复请求产生相同结果。

🚀 幂等实现:

  • 唯一标识符:使用UUID和数据库唯一索引。
  • 乐观锁:版本号控制。
  • 分布式锁:Redisson或ZooKeeper。

🔧 幂等性示例代码:

// 使用UUID生成唯一标识符
UUID uuid = UUID.randomUUID();

📍6. 你的项目中,如何保证分布式事务的一致性?

分布式事务一致性可通过两阶段提交、补偿事务、基于消息的最终一致性、最大努力通知和Saga模式实现。

🚀 一致性策略:

  • 两阶段提交(2PC):XA协议。
  • 补偿事务(TCC):Try-Confirm-Cancel。
  • 基于消息的最终一致性:消息队列。

🔧 Seata分布式事务示例:

<dependency><groupId>io.seata</groupId><artifactId>seata-all</artifactId><version>1.4.2</version>
</dependency>

📍7. 项目中的限流怎么做的,为什么这么做?

限流通过固定窗口、滑动窗口、令牌桶和漏桶算法实现,保护系统稳定性、防止资源耗尽和恶意攻击。

🚀 限流算法:

  • 固定窗口:Guava RateLimiter。
  • 滑动窗口:Redis滑动窗口。
  • 令牌桶:令牌生成和消耗。

🚀 限流原因:

  • 保护系统稳定性。
  • 防止资源耗尽。

🔧 Guava RateLimiter示例:

RateLimiter rateLimiter = RateLimiter.create(10.0); // 每秒10个请求
rateLimiter.acquire(); // 获取令牌

📍8. 如何设计群消息已读?

群消息已读通过存储已读状态、消息发送接收同步、已读列表展示和批量更新实现,优化使用分页加载和缓存。

🚀 设计思路:

  • 已读状态存储:数据库或缓存。
  • 消息发送和接收:更新已读状态。
  • 已读列表展示:展示已读成员。

🔧 已读状态更新示例:

// 更新消息已读状态
updateMessageReadStatus(userId, messageId, true);

📍9. 多线程题目:10个线程模拟赛马,所有马就绪后才能开跑,所有马到达终点后裁判宣布赛马成绩。

问题描述:
使用多线程模拟赛马比赛,要求所有马(线程)都准备好后才能开始比赛,所有马到达终点后裁判宣布比赛结果。

解题思路:

  • 使用sync.WaitGroup来同步多个线程。
  • 使用sync.Mutex来保护共享资源的访问。
  • 每个马(线程)在准备好后通知主线程,主线程在所有马都准备好后发出开始信号。
  • 所有马到达终点后,裁判宣布比赛结果。

代码实现(Golang):

package mainimport ("fmt""sync""time"
)type Horse struct {ID     intReady  boolFinish boolmu     sync.Mutex
}func (h *Horse) run(start, finish *sync.WaitGroup) {defer finish.Done()// 马准备好h.mu.Lock()h.Ready = trueh.mu.Unlock()fmt.Printf("Horse %d is ready!\n", h.ID)// 等待所有马准备好start.Wait()// 模拟赛跑time.Sleep(time.Duration(h.ID) * time.Second)h.mu.Lock()h.Finish = trueh.mu.Unlock()fmt.Printf("Horse %d has finished!\n", h.ID)
}func main() {const numHorses = 10var start, finish sync.WaitGrouphorses := make([]*Horse, numHorses)// 初始化马for i := 0; i < numHorses; i++ {horses[i] = &Horse{ID: i + 1}}// 设置WaitGroupstart.Add(1)finish.Add(numHorses)// 启动赛马线程for _, horse := range horses {go horse.run(&start, &finish)}// 等待所有马准备好for {allReady := truefor _, horse := range horses {horse.mu.Lock()if !horse.Ready {allReady = false}horse.mu.Unlock()}if allReady {break}time.Sleep(100 * time.Millisecond)}// 所有马准备好,开始比赛fmt.Println("All horses are ready! Start racing!")start.Done()// 等待所有马到达终点finish.Wait()fmt.Println("All horses have finished! Race is over!")
}

代码解析:

  • Horse结构体:包含马的ID、准备状态、完成状态和一个互斥锁。
  • run函数:每个马(线程)的执行函数,模拟马的准备、等待开始信号、赛跑和到达终点。
  • 主函数:初始化马、设置WaitGroup、启动线程、等待所有马准备好、发出开始信号、等待所有马到达终点并宣布比赛结果。

📍10. LeetCode 394,给定一个经过编码的字符串,返回它解码后的字符串。

问题描述:
给定一个编码字符串,格式为k[encoded_string],其中k是一个正整数,encoded_string是一个字符串。要求解码这个字符串,返回解码后的结果。

解题思路:

  • 使用栈来处理嵌套的编码字符串。
  • 遍历字符串,遇到数字、字母、[]时分别处理。
  • 遇到数字时,解析完整的数字并压入数字栈。
  • 遇到[时,将当前的字符串压入字符串栈,并重置当前字符串。
  • 遇到]时,弹出数字栈和字符串栈,将当前字符串重复相应次数后与弹出的字符串拼接。
  • 遇到字母时,直接拼接到当前字符串。

代码实现(Golang):

package mainimport ("fmt""strconv""strings"
)func decodeString(s string) string {var numStack []intvar strStack []stringvar currentNum intvar currentStr strings.Builderfor i := 0; i < len(s); i++ {char := s[i]switch {case char >= '0' && char <= '9':// 解析数字num, _ := strconv.Atoi(string(char))currentNum = currentNum*10 + numcase char == '[':// 将当前数字和字符串压入栈numStack = append(numStack, currentNum)strStack = append(strStack, currentStr.String())// 重置当前数字和字符串currentNum = 0currentStr.Reset()case char == ']':// 弹出数字和字符串num := numStack[len(numStack)-1]numStack = numStack[:len(numStack)-1]prevStr := strStack[len(strStack)-1]strStack = strStack[:len(strStack)-1]// 重复当前字符串并拼接到前一个字符串currentStr.WriteString(strings.Repeat(currentStr.String(), num))currentStr = strings.Builder{}currentStr.WriteString(prevStr)default:// 字母直接拼接到当前字符串currentStr.WriteByte(char)}}return currentStr.String()
}func main() {encoded := "3[a2[c]]"decoded := decodeString(encoded)fmt.Println(decoded) // 输出: "accaccacc"
}

代码解析:

  • numStack:用于存储数字的栈。
  • strStack:用于存储字符串的栈。
  • currentNum:当前解析的数字。
  • currentStr:当前解析的字符串。
  • 遍历字符串:根据字符类型分别处理数字、[]和字母。
  • 解码过程:通过栈的压入和弹出操作,处理嵌套的编码字符串。

欢迎关注我的小红书一起来讨论。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/70067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot中使用MyBatis-Plus详细介绍

目录 一、MyBatis-Plus的使用步骤 1.引入MybatisPlus的起步依赖 2.定义Mapper&#xff08;也叫dao&#xff09;层的接口 3.MyBatis-Plus中常用注解 4. 使用MyBatis-Plus时要做如下配置 5.条件构造器 Wrapper 一、MyBatis-Plus的使用步骤 1.引入MybatisPlus的起步依赖 M…

vue3读取webrtc-stream 视频流

一.首先下载webrtc-stream&#xff0c;方便自己本地搭建视频流服务 https://download.csdn.net/download/cyw8998/90373521 解压后&#xff0c;启动命令 webrtc-streamer.exe -H 127.0.0.1:8020 二.vue3代码如下 <template><h1>video</h1><video id&…

vue3搭建实战项目笔记二

vue3搭建实战项目笔记二 2.1.git管理项目2.2.隐藏tabBar栏2.2.1 方案一&#xff1a;在路由元信息中设置一个参数是否显示tabBar2.2.2 方案二&#xff1a;通过全局设置相对定位样式 2.3.项目里封装axios2.3.1 发送网络请求的两种做法2.3.2 封装axios并发送网络请求2.3.2.1 对axi…

USC 安防平台之移动侦测

随着第四次科技革命的开启&#xff0c;AI技术获取了突飞猛进的发展&#xff0c;视频监控对应的视频分析技术也获取了巨大的发展。 还记得15年前采用人工提取特征做前景背景分离和提取&#xff0c;大部分依赖CPU&#xff0c;最多使用一下TI的DM642 DSP加速&#xff0c;开发难度…

Unity CommandBuffer绘制粒子系统网格显示

CommandBuffer是 Unity 提供的一种在渲染流程中插入自定义渲染命令的机制。在渲染粒子系统时&#xff0c;常规的渲染流程可能无法满足特定的渲染需求&#xff0c;而CommandBuffer允许开发者灵活地设置渲染参数、控制渲染顺序以及执行自定义的绘制操作。通过它&#xff0c;可以精…

【天地图】绘制、删除点线面

使用天地图绘制、删除点线面 实现效果图地图组件完整代码使用地图组件完整代码 实现效果图 地图组件完整代码 // 天地图组件 <template><div class"map-container"><div id"mapCon"></div></div> </template><scri…

Java八股文详细文档.2(基于黑马、ChatGPT、DeepSeek)

通过B站黑马程序员的八股文教学&#xff0c;自己也二刷了&#xff0c;结合ChatGpt、deepSeek总结了一下,Java八股文详细文档.2&#xff08;Redis篇和消息中间件篇&#xff0c;还没有写完&#xff0c;这只是一部分&#xff09; Java八股文详细文档.1&#xff08;包含JVM篇、数据…

简述 tsconfig.json 中 rootDir 和 include 之间的关系

tsconfig.json 中的 rootDir 和 include 之间有一定的关系&#xff0c;但它们的作用是不同的。理解它们的关系可以帮助你更好地配置 TypeScript 项目。 1. rootDir 的作用 rootDir 用于指定 TypeScript 编译器&#xff08;tsc&#xff09;的“根目录”。它的主要作用是&#x…

如何在Spring Boot中使用Profiles实现环境隔离

文章目录 如何在Spring Boot中使用Profiles实现环境隔离什么是Spring Profiles1.基本概念2.配置管理3.使用场景4.条件化配置5.优点Spring Profiles的基础知识1.Profile的定义2.配置文件3.激活Profiles4.条件化配置5.Profile的优先级与合并6.Profiles的最佳实践配置文件的组织1.…

SpringBoot使用TraceId日志链路追踪

项目场景&#xff1a; ??有时候一个业务调用链场景&#xff0c;很长&#xff0c;调了各种各样的方法&#xff0c;看日志的时候&#xff0c;各个接口的日志穿插&#xff0c;确实让人头大。为了解决这个痛点&#xff0c;就使用了TraceId&#xff0c;根据TraceId关键字进入服务…

微信小程序网络请求封装

微信小程序的网络请求为什么要封装&#xff1f;封装使用有什么好处&#xff1f; 封装的目的是为了偷懒&#xff0c;试想一下每次都要wx.request&#xff0c;巴拉巴拉传一堆参数&#xff0c;是不是很麻烦&#xff0c;有些公共的参数例如header&#xff0c;baseUrl是不是可以封装…

Element Plus table 去除行hover效果

需求&#xff1a; 给table的指定行设置高亮背景色且去除掉这些行的hover效果 思路&#xff1a; 给指定行设置css类名选择需要设置高亮的行的单元格&#xff0c;设置鼠标禁用属性让高亮行继承父元素的背景色 考虑到表格的第一列是勾选框&#xff0c;因此仅选择 tr 下除了第一…

认识vue-admin

认识vue-admin **核心交付:** 为什么要基于现成架子二次开发 什么是二次开发&#xff1a;基于已有的代码&#xff08;项目工程&#xff0c;脚手架&#xff09;开进行新功能的开发 所以看懂已有的框架中的既有代码&#xff0c;变得很重要了 1. 背景知识 后台管理系统是一种最…

无人机航迹规划:孟加拉虎优化( Savannah Bengal Tiger Optimization ,SBTO)算法求解无人机路径规划MATLAB

一、孟加拉虎优化算法 孟加拉虎优化&#xff08; Savannah Bengal Tiger Optimization &#xff0c;SBTO&#xff09;算法模拟了孟加拉虎的群体狩猎行为&#xff0c;采用了猎物搜索、隐身接近和攻击狩猎三种策略。 参考文献&#xff1a; [1]Yujing Sun, Xingguo Xu. Savann…

sib报错:com.*.xctrunner is not in your device!

1、问题描述 在使用sonic集成IOS设备的时候,我们需要通过sonic-agent服务去识别IOS设备。但是在识别的时候提示如下问题: 本质就是在你这个设备中找不到这个设备也就是找不到WebDriverAgentRunner,但是确实安装了,甚至appium可以正常的调用。 或执行如下命令的时候报错:…

c++中什么时候应该使用final关键字?

在C中&#xff0c;final关键字是自C11标准引入的重要特性&#xff0c;主要用于类继承和虚函数重写机制的约束。下面从技术原理、使用场景和最佳实践三个维度进行系统分析&#xff0c;并给出工业级代码示例。 目录 一、技术原理深度解析 二、关键使用场景分析 1. 类级别的fi…

【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南

【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南 一、前言 为了确保在 Docker 环境中顺利安装并高效运行 Ollama 以及 DeepSeek 离线模型&#xff0c;本文将详细介绍整个过程&#xff0c;涵盖从基础安装到优化配置等各个方面。通过对关键参数和配置的深入理解…

文件夹上传到github分支最后github上面还是没有文件和文件夹

环境&#xff1a; github 问题描述&#xff1a; 文件夹上传到github分支最后github上面还是没有文件和文件夹, 和这样一样 解决方案&#xff1a; 从 git ls-tree -r HEAD 的输出中可以看到&#xff0c;metahuman-stream 文件夹显示为如下内容&#xff1a; 160000 commi…

【JavaEE进阶】验证码案例

目 &#x1f332;实现说明 &#x1f384;Hutool介绍 &#x1f333;准备工作 &#x1f334;约定前后端交互接口 &#x1f6a9;接口定义 &#x1f6a9;实现服务器后端代码 &#x1f6a9;前端代码 &#x1f6a9;整体测试 &#x1f332;实现说明 随着安全性的要求越来越⾼…

4G模块非必要,不关机!关机建议先进飞行模式

给4G模组VBAT断电关机&#xff0c;模组关机前未能及时退出当前基站&#xff0c;会有什么影响呢&#xff1f; 基站会误以为设备还在线&#xff0c;下次开机仍会拿着上次驻网信息去连基站。基站一看&#xff0c;上次链接还在——认为你是非法设备&#xff0c;拒绝链接&#xff…