字節跳動后端二面

📍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.pswp.cn/diannao/70067.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70067.shtml
英文地址,請注明出處:http://en.pswp.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…