字节跳动后端二面
📍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:当前解析的字符串。
- 遍历字符串:根据字符类型分别处理数字、
[、]和字母。 - 解码过程:通过栈的压入和弹出操作,处理嵌套的编码字符串。
欢迎关注我的小红书一起来讨论。

相关文章:
字节跳动后端二面
📍1. 数据库的事务性质,InnoDB是如何实现的? 数据库事务具有ACID特性,即原子性、一致性、隔离性和持久性。InnoDB通过以下机制实现这些特性: 🚀 实现细节: 原子性:通过undo log实…...
TUSB422 MCU 软件用户指南
文章目录 TUSB422 MCU 软件用户指南 目录表格图表1. 介绍2. 配置2.1 通用配置2.2 USB-PD 3.0 支持2.3 VDM 支持 3. 代码 ROM/RAM 大小优化4. 通过 UART 调试4. 移植到其他微控制器 TUSB422 MCU 软件用户指南 摘要 本文档是 TUSB422 微控制器基于 Type-C 端口控制(…...
Django在终端创建项目(pycharm Windows)
1.选择目录 选择或新建一个文件夹,作为项目保存的地方 2.右键在终端打开 3.确定django-admin.exe安装位置 找到自己安装django时,django-admin.exe安装的位置,例如 4.运行命令 使用django-admin.exe的绝对路径,在刚才打开的终端…...
wordpress主题制作
工具/原料 <P><BR>使用divcss语言编写的html静态页面一个</P> <P>Macromedia Dreamweaver软件<BR></P> WordPress主题结构分析 1 1、index.php首页模板(最基本) ---- 1、header.php头部 ---- 2、sidebar.php侧边…...
echarts 3d中国地图飞行线
一、3D中国地图 1. 一定要使用 echarts 5.0及以上的版本; 2. echarts 5.0没有内置中国地图了。点击下载 china.json; 3. 一共使用了四层地图。 (1)第一层是中国地图各省细边框和展示南海诸岛; (2)第二层是…...
视频基础操作
1.1. 例子 读取mp4格式的视频,将每一帧改为灰度图,并且打上水印(“WaterMark”),并将其输出保存为out.mp4,在这个例子中可以看到视频读取,每帧数据处理,视频保存的整体流程简单示例 import cv…...
微信小程序 - 组件和样式
组件和样式介绍 在开 Web 网站的时候: 页面的结构由 HTML 进行编写,例如:经常会用到 div、p、 span、img、a 等标签 页面的样式由 CSS 进行编写,例如:经常会采用 .class 、#id 、element 等选择器 但在小程序中不能…...
在本地校验密码或弱口令 (windows)
# 0x00 背景 需求是验证服务器的弱口令,如果通过网络侧校验可能会造成账户锁定风险。在本地校验不会有锁定风险或频率限制。 # 0x01 实践 ## 1 使用 net use 命令 可以通过命令行使用 net use 命令来验证本地账户的密码。打开命令提示符(CMD࿰…...
【Elasticsearch】Elasticsearch检索方式全解析:从基础到实战(二)
接着上一篇文章;我们继续来研究es的复杂检索 文章目录 (1) bool用来做复合查询(2)Filter【结果过滤】(3)term(4)Aggregation(执行聚合) (1) bool用来做复合查询 复合语…...
游戏引擎学习第96天
讨论了优化和速度问题,以便简化调试过程 节目以一个有趣的类比开始,提到就像某些高端餐厅那样,菜单上充满了听起来陌生或不太清楚的描述,需要依靠服务员进一步解释。虽然这听起来有些奇怪,但实际上,它反映…...
(Xshell 8 + Xftp 8)下载安装miniconda至服务器指定目录+配置虚拟环境
一一一一 Xshell 8 Xftp 8均已登录,miniconda.sh安装包已经放在服务器指定目录中 二二二二 赋予脚本执行权限 chmod x Miniconda3-latest-Linux-x86_64.sh安装miniconda ./Miniconda3-latest-Linux-x86_64.sh -p /data1/huyan/zhangyifeng/miniconda3一直Enter…...
多机器人系统的大语言模型:综述
25年2月来自 Drexel 大学的论文“Large Language Models for Multi-Robot Systems: A Survey”。 大语言模型 (LLM) 的快速发展为多机器人系统 (MRS) 开辟新的可能性,从而增强通信、任务规划和人机交互。与传统的单机器人和多智体系统不同,MRS 带来独特…...
通用的将jar制作成docker镜像sh脚本
通用的将jar制作成docker镜像sh脚本 为了在将 JAR 制作成 Docker 镜像的过程中创建日志目录,可以对之前的脚本进行扩展。以下是改进后的脚本,会在镜像构建时在容器内创建日志目录,并将日志文件挂载到该目录下。 在生成的 Dockerfile 中添加…...
Python----PyQt开发(PyQt基础,环境搭建,Pycharm中PyQttools工具配置,第一个PyQt程序)
一、QT与PyQT的概念和特点 1.1、QT QT是一个1991年由The Qt Company开发的跨平台C图形用户界面应用程序开发 框架,可构建高性能的桌面、移动及Web应用程序。也可用于开发非GUI程序,比如 控制台工具和服务器。Qt是面向对象的框架,使用特殊的代…...
DeepSeek+3D视觉机器人应用场景、前景和简单设计思路
DeepSeek3D视觉机器人在多个领域具有广泛的应用场景和巨大的前景。以下是详细的分析: 应用场景 制造业 自动化装配:机器人可以精确地抓取和装配零件,提高生产效率和产品质量。 质量检测:通过3D视觉技术检测产品缺陷,确…...
MT6835 21位 磁编码器 SPI 平台无关通用驱动框架 STM32
MT6835 21位 磁编码器 SPI 平台无关通用驱动框架 STM32 1. 获取代码:2. 加入你的项目2.1 以 STM32 为例:2.2 以 ESP-IDF 为例: 3. 对接 API3.1 以 STM32 为例: 4. 更多函数说明5. 写入 EEPROM 示例 MT6835 Framework 纯C语言实现,跨平台&…...
python视频爬虫
文章目录 爬虫的基本步骤一些工具模拟浏览器并监听文件视频爬取易错点一个代码示例参考 爬虫的基本步骤 1.抓包分析,利用浏览器的开发者工具 2.发送请求 3.获取数据 4.解析数据 5.保存数据 一些工具 requests, 用于发送请求,可以通过get,p…...
嵌入式WebRTC压缩至670K,目标将so动态库压缩至500K,.a静态库还可以更小
最近把EasyRTC的效果发布出去给各大IPC厂商体验了一下,直接就用EasyRTC与各个厂商的负责人进行的通话,在通话中,用户就反馈效果确实不错! 这两天有用户要在海思hi3516cv610上使用EasyRTC,工具链是:gcc-2024…...
Rhel Centos环境开关机自动脚本
Rhel Centos环境开关机自动脚本 1. 业务需求2. 解决方法2.1 rc.local2.2 rc.d2.3 systemd2.4 systemd附着的方法2.5 tuned 3. 测试 1. 业务需求 一台较老的服务器上面业务比较简单,提供一个简单的网站,但已经没有业务的运维人员. 想达到的效果: 由于是非标准的apache或者nginx…...
phpipam1.7安装部署
0软件说明 phpipam是一个开源Web IP地址管理应用程序(IPAM) phpipam官网:https://www.phpipam.net/ 1安装环境 操作系统:Rocky Linux9.5x86_64 phpipam版本:1.7 php版本:8.0.30 数据库版本:…...
深入理解org.springframework.web.context.request.RequestContextHolder
在Spring Web应用中,RequestContextHolder是一个非常有用的工具类,用于在任何地方访问当前请求的上下文信息。它解决了非Controller层或非过滤器层需要访问请求上下文的问题,如在Service层或DAO层。以下是对 RequestContextHolder的详细解析。…...
Django中select_related 的作用
Django中这句代码Dynamic.objects.select_related(song)是什么意思? 在 Django 中,这句代码: Dynamic.objects.select_related(song) 的作用是 在查询 Dynamic 模型的同时,预加载 song 关联的外键对象,从而减少数据…...
正泰中间电磁继电器【8脚10A】DC24V 待机功率
需求:继电器能耗测试。 1.连接24V2A的电源, 2. 稳定功率为 1.4W 3. 正泰中间电磁继电器【8脚10A】直流DC24V 注:联通时电磁继电器会轻微发热 4.电磁继电器的工作原理基于电流的磁效应 电磁激励:电磁继电器主要由线圈、铁芯、衔…...
C++ 中的 Const 关键字(1)
C 中的 Const 关键字 最后更新: 2024 年 8 月 6 日 本文讨论了C中const 关键字的各种功能。只要将const 关键字附加到任何方法 ()、变量、指针变量以及类的对象上,它就会阻止特定对象/方法 ()/变量修改其数据项的值。 常量变量: 常量变量的声…...
Mac上搭建宝塔环境并部署PHP项目
安装Docker Desktop》搭建Centos版本的宝塔环境》部署PHP项目 1. 下载Docker for mac 软件:https://www.docker.com/ 或使用终端命令:brew install --cask --appdir/Applications docker 2. 使用命令安装宝塔环境的centos7系统: docker pul…...
哈希表-两个数的交集
代码随想录-刷题笔记 349. 两个数组的交集 - 力扣(LeetCode) 内容: 集合的使用 , 重复的数剔除掉,剩下的即为交集,最后加入数组即可。 class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set<Integer…...
win11 终端乱码导致IDE 各种输出也乱码
因为 win11 终端乱码导致IDE 各种输出也乱码导致作者对此十分头大。所以研究了各种方法。 单独设置终端编码对 HKEY_CURRENT_USER\Console 注册表进行修改对 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processo 注册表进行修改使用命令[Console]::OutputEncoding [Syst…...
LabVIEW用户界面(UI)和用户体验(UX)设计
作为一名 LabVIEW 开发者,满足功能需求、保障使用便捷与灵活只是基础要求。在如今这个用户体验至上的时代,为 LabVIEW 应用程序设计直观且具有美学感的界面,同样是不容忽视的关键任务。一个优秀的界面设计,不仅能提升用户对程序的…...
23、深度学习-自学之路-激活函数relu、tanh、sigmoid、softmax函数的正向传播和反向梯度。
在使用这个非线性激活函数的时候,其实我们重点还是学习的是他们的正向怎么传播,以及反向怎么传递的。 如下图所示: 第一:relu函数的正向传播函数是:当输入值(隐藏层)值大于了,就输出…...
【matlab优化算法-16期】基于遗传算法的电热气及储能综合优化项目实践
电热气及储能综合优化项目实践 一、前言 随着能源转型和可持续发展的推进,综合能源系统的优化逐渐成为研究热点。本文介绍了一个电热气及储能综合优化项目,旨在通过优化算法实现多能源系统的协同运行,提高能源利用效率,降低运行…...
