滴滴 服務端 面經

一、緩存與數據庫的使用場景及性能差異

1. 緩存的適用場景
  • 高頻讀、低頻寫場景:如商品詳情頁、用戶信息等讀多寫少的數據,減少數據庫壓力。
  • 實時性要求不高的數據:如首頁推薦列表、統計數據(非實時更新),允許短時間內數據不一致。
  • 高并發場景下的性能優化:通過緩存抗住流量峰值,避免數據庫直接被擊穿(如秒殺活動中的庫存查詢)。
2. 數據庫的適用場景
  • 數據持久化與強一致性場景:如用戶交易記錄、訂單狀態變更,需保證數據不丟失且事務完整。
  • 復雜查詢與業務邏輯:涉及多表關聯、聚合統計(如SQL的JOIN、GROUP BY),數據庫更擅長處理此類結構化查詢。
  • 數據一致性要求高的場景:如金融交易、庫存扣減,需通過數據庫事務(ACID)保證操作原子性。
3. 數據庫讀寫慢于緩存的根本原因
  • 存儲介質差異
    • 緩存(如Redis)基于內存(RAM),讀寫速度可達納秒級(10??秒)。
    • 數據庫(如MySQL)依賴磁盤(SSD/HDD),隨機讀寫延遲在毫秒級(10?3秒),比內存慢約百萬倍。
  • 數據結構與查詢開銷
    • 緩存使用哈希表、跳表等內存友好的數據結構,查詢復雜度低(如O(1))。
    • 數據庫需維護索引(如B+樹)、事務日志(redo/undo log),且涉及磁盤I/O尋址,開銷更高。

二、MySQL核心問題

1. 事務隔離級別

MySQL支持4種隔離級別(由低到高):

隔離級別

臟讀

不可重復讀

幻讀

讀未提交

允許

允許

允許

讀已提交

禁止

允許

允許

可重復讀

禁止

禁止

部分禁止

串行化

禁止

禁止

禁止

不可重復讀的場景
在一個事務內,兩次讀取同一數據時結果不一致。例如:

  • 事務A查詢用戶余額為100元(未提交)。
  • 事務B修改余額為80元并提交。
  • 事務A再次查詢時,余額變為80元,導致前后結果不一致。
    原因:讀已提交和可重復讀隔離級別下,普通查詢(非快照讀)會讀取最新提交的數據,而可重復讀通過MVCC(多版本并發控制)避免此問題。
2. 底層存儲數據結構:B+樹
  • 為什么不用平衡二叉樹?
    平衡二叉樹的樹高為O(logN),當數據量大時,磁盤I/O次數多(每次I/O對應樹的一層)。而B+樹通過以下特性優化:
    • 多叉樹結構:每個節點可存儲多個鍵值對,樹高更低(如三層B+樹可存儲百萬級數據)。
    • 數據全在葉子節點:非葉子節點僅存索引,葉子節點存數據且有序連接,便于范圍查詢(如WHERE age > 18)。
3. 三層B+樹最大數據量計算

InnoDB的葉子節點存儲的單位是頁

mysql頁默認存儲的單位是 16384 個字節 16kb 也就是一個節點的大小 節點大小為16KB

非葉子節點存儲的是索引鍵值和頁指針

索引鍵值 BigInt 8字節

頁指針 6字節

那么根節點有

16384 字節 / 14 字節 = 1170 個頁指針

第二層有1170個子節點 每個子節點又指向1180個子節點

第三層都是葉子節點

每個葉子節點存16kb

那么總大小就是 1170 * 1170 * 16 =21902400 條

2200萬kb的數據

假設:

  • 節點大小為16KB(MySQL默認頁大小),鍵值(索引)為8字節(如BIGINT),指針為6字節(指向子節點或數據)。
  • 非葉子節點:每個節點存儲 16KB/(8+6B)≈1170 個鍵值對。
  • 葉子節點:每個節點存儲數據(假設一行數據1KB),則每個葉子節點存16條數據。
  • 三層B+樹結構:
    • 第一層(根節點):1個節點,1170個子節點。
    • 第二層(中間層):1170個節點,每個節點1170個子節點,共 1170×1170 個葉子節點。
    • 第三層(葉子層):1170×1170×1622 million(約2200萬) 條數據。

三、HTTPS與HTTP的區別

特性

HTTP

HTTPS

端口

80

443

安全性

明文傳輸,無加密

基于TLS/SSL加密,防篡改、竊聽

證書

無需證書

需要CA機構頒發的SSL證書

性能

低延遲,適合簡單場景

需握手協商加密參數,延遲略高

信任機制

通過數字證書驗證服務器身份

四、Redis持久化

1. 持久化方式
  • RDB(快照):定期將內存數據全量寫入磁盤,生成二進制文件(.rdb)。
  • AOF(日志):記錄每條寫命令,重啟時重放命令恢復數據。
2. AOF快照形式

AOF文件以文本形式存儲命令(如SET key value),可通過BGREWRITEAOF壓縮日志(合并同類命令,如先INCRDECR可合并為SET)。

3. RDB快照原理(BGSAVE)
  • fork子進程:主進程執行BGSAVE時,通過操作系統fork創建子進程,子進程共享主進程內存數據。
  • 寫入快照:子進程將內存數據按RDB格式寫入磁盤,主進程繼續處理請求,避免阻塞。
  • 替換舊文件:寫入完成后,用新快照文件替換舊文件,重啟時通過加載.rdb恢復數據。

五、虛擬內存與頁表

1. 虛擬內存
  • 概念:操作系統為每個進程分配的獨立地址空間(如32位系統為4GB),通過內存與磁盤的換入換出(Swap),允許程序使用超過物理內存的空間。
  • 作用
    • 隔離進程地址空間,避免內存沖突。
    • 支持大程序運行,通過分頁機制(Page)將不常用數據暫存磁盤。
2. 頁表
  • 概念:虛擬地址到物理地址的映射表,存儲每個頁(Page,如4KB)對應的物理內存地址或磁盤位置。
  • 結構
    • 一級頁表:適用于小內存系統,虛擬地址直接對應頁表項。
    • 多級頁表:如二級頁表,將虛擬地址分為目錄和頁號,減少頁表內存占用(如x86的CR3寄存器指向頁目錄)。
  • 查詢過程:CPU通過MMU(內存管理單元)查詢頁表,若頁不在內存中(缺頁中斷),則從磁盤加載到內存。

六、Redis內存占用比預期大的原因

  • 數據結構額外開銷
    • 例如,存儲字符串"a"時,Redis使用sdshdr結構體(包含長度、容量、標志位等),實際占用內存大于1字節。
    • 哈希表、列表等復雜結構需存儲指針、長度等元數據。
  • 內存對齊與分配策略
    • Redis按2的冪次分配內存(如存儲10字節數據,分配16字節空間),避免頻繁申請小塊內存導致的碎片。
    • 操作系統分配內存時的對齊要求(如8字節對齊)也會增加占用。
  • 持久化與復制機制
    • RDB/AOF文件生成時的臨時內存開銷,主從復制時的緩沖區等。

七、分庫分表的適用場景

  1. 單表數據量過大:如單表超過500萬條,查詢性能顯著下降(索引效率降低,磁盤I/O增加)。
  2. 高并發導致性能瓶頸:單機數據庫連接數、CPU/內存資源不足,無法支撐請求量。
  3. 數據熱點問題:某部分數據被頻繁訪問(如社交APP的用戶消息表),需分散到不同庫表。
  4. 業務垂直拆分:按功能模塊分庫(如用戶庫、訂單庫),降低耦合度,便于擴展。
  5. 跨地域/多租戶需求:數據需按區域或租戶隔離存儲(如多商戶SaaS系統)。

注意:分庫分表會引入分布式事務、跨庫查詢等復雜性,需權衡使用(如優先優化索引、讀寫分離,再考慮分庫分表)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83964.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83964.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83964.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux操作系統---網絡協議

目錄 案例演練----網絡搭建 路由啟配置 多個路由情況下如何聯通 靜態路由 案例演練----網絡搭建 Cisco交換機的命令行用戶模式1 switch> 特權模式1 switch>enable disable回到用戶模式 2 switch#全局配置模式1 switch#config terminal 2 switch(co…

華為OD機試_2025 B卷_計算某個字符出現次數(Python,100分)(附詳細解題思路)

文章目錄 題目描述字符計數解析:簡單高效的統計方法核心解題思路完整代碼實現應用場景擴展 題目描述 寫出一個程序,接受一個由字母、數字和空格組成的字符串,和一個字符,然后輸出"輸入字符串(第二行輸入的字符&a…

華為倉頡語言初識:并發編程之同步機制(上)

前言 線程同步機制是多線程下解決線程對共享資源競爭的主要方式,華為倉頡語言提供了三種常見的同步機制用來保證線程同步安全,分別是原子操作,互斥鎖和條件變量。本篇文章詳細介紹主要倉頡語言解決同步機制的方法,建議點贊收藏&a…

樹莓派遠程登陸RealVNC Viewer出現卡頓

原因是:沒有連接顯示屏,圖像傳輸會受到限制。 沒有顯示屏怎么解決: 📝 樹莓派5虛擬顯示器配置教程(強制啟用全性能GPU渲染) 🔧 步驟1:安裝虛擬顯示驅動 bash 復制 下載 # 更…

go-zero微服務入門案例

一、go-zero微服務環境安裝 1、go-zero腳手架的安裝 go install github.com/zeromicro/go-zero/tools/goctllatest2、etcd的安裝下載地址根據自己電腦操作系統下載對應的版本,具體的使用自己查閱文章 二、創建一個user-rpc服務 1、定義user.proto文件 syntax &qu…

[BIOS]VSCode zx-6000 編譯問題

前提:Python 3.6.6及以上版本安裝成功,Python 3.6.6路徑加到了環境變量# DEVITS工具包準備好 問題:添加環境變量 1:出現環境變量錯誤,“py -3” is not installed or added to environment variables #先在C:\Windows里…

【Linux】系統部分——進程控制

11.進程控制 文章目錄 11.進程控制一、進程創建二、進程終止退出碼進程終止的方式 三、進程等待進程等待的方式獲取?進程status小程序阻塞與非阻塞等待 四、進程程序替換替換原理進程程序替換的接口——exec替換函數 五、總結 一、進程創建 之前學習了fork()函數創建子進程&a…

【讀論文】U-Net: Convolutional Networks for Biomedical Image Segmentation 卷積神經網絡

摘要1 Introduction2 Network Architecture3 Training3.1 Data Augmentation 4 Experiments5 Conclusion背景知識卷積激活函數池化上采樣、上池化、反卷積softmax 歸一化函數交叉熵損失 Olaf Ronneberger, Philipp Fischer, Thomas Brox Paper:https://arxiv.org/ab…

藍牙音樂(A2DP)音頻延遲的一些感想跟分析,讓你對A2DP體驗更佳深入

零.聲明 最近做藍牙協議棧的過程中遇到一些客戶偶爾提報音頻延遲的問題,所以引發了一些感想,跟大家分享下,音頻延遲主要的影響范圍是對一些要求實時性比較高的場景有比較差的體驗 連接藍牙看視頻的過程中,發現音畫不同步&#x…

MySQL 8.0 綠色版安裝和配置過程

MySQL作為云計算時代,被廣泛使用的一款數據庫,他的安裝方式有很多種,有yum安裝、rpm安裝、二進制文件安裝,當然也有本文提到的綠色版安裝,因綠色版與系統無關,且可快速復制生成,具有較強的優勢。…

AGV|無人叉車工業語音播報器|預警提示器LBE-LEX系列性能與接線說明

LBE-LEX系列AGV|無人叉車工業語音播報器|預警提示器,涵蓋LBE-LEI-M-00、LBE-LESM-00、LBE-LES-M-01、LBE-LEC-M-00、LBE-KEI-M-00、LBE-KES-M-00、LBE-KES-M-01、LBE-KEC-M-00等型號,適用于各種需要語音提示的場景,主要有AGV、AMR機器人、無人…

行為型設計模式之Interpreter(解釋器)

行為型設計模式之Interpreter(解釋器) 前言: 自己的話理解:自定義一個解釋器用來校驗參數或數據是否合法。 1)意圖 給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解…

C++常用的企業級日志庫

黃老師跟大家推薦幾款在企業開發中最受歡迎的C++日志庫! 1. spdlog spdlog 是一個非常流行的開源C++日志庫,以其高性能和易用性著稱。它支持多線程、異步日志記錄以及多種格式化選項。 安裝 可以通過包管理器安裝,例如 vcpkg: vcpkg install spdlog示例代碼 #include…

Python讀取PDF:文本、圖片與文檔屬性

在日常的數據采集、文檔歸檔與信息挖掘過程中,PDF格式因其版式固定、內容穩定而被廣泛使用。Python 開發者若希望實現 PDF 內容的自動化提取,選擇一個易用且功能完善的庫至關重要。本文將介紹如何用Python實現 PDF文本讀取、圖片提取 以及 文檔屬性讀取 …

excel中數字不滿六位在左側前面補0的方法

如下圖“代碼”列,想要實現統一的六位,如果不足六位,在前面(左側)補0。 實現方法: 使用公式TEXT(A2,"000000")注意務必是用雙引號。 目標實現: 如果想要脫離原數據,復制…

軟考 系統架構設計師系列知識點之雜項集萃(82)

接前一篇文章:軟考 系統架構設計師系列知識點之雜項集萃(81) 第148題 “41”視圖主要用于描述系統邏輯架構,最早由Philippe Kruchten于1995年提出。其中( )視圖用于描述對象模型,并說明系統應該…

Langgraph實戰--自定義embeding

概述 在Langgraph中我想使用第三方的embeding接口來實現文本的embeding。但目前langchain只提供了兩個類,一個是AzureOpenAIEmbeddings,一個是:OpenAIEmbeddings。通過ChatOpenAI無法使用第三方的接口,例如:硅基流平臺…

(附實例代碼及圖示)混合策略實現 doc-doc 對稱檢索

HyDE 混合策略 在前面的文章中,學習的優化策略都是將對應的 查詢 生成 新查詢,通過 新查詢 來執行相應的檢索,但是在數據庫中存儲的數據一般都是 文檔 層面上的,數據會遠遠比 查詢 要大很多,所以 query 和 doc 之間是…

webui無法注冊如何配置

1. 初始登陸界面 docker部署的腳本為: docker run -d \ -p 8180:8080 --gpusall \ -v ollama:/root/.ollama \ -v /home/pretrained_model/output:/app/backend/output \ --name open-webui \ --restart always ghcr.io/open-webui/open-webui:ollama 2. 新增注冊入…

力扣 88.合并兩個有序數組

文章目錄 題目介紹題解 題目介紹 題解 法一&#xff1a;暴力法 class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {for(int i 0; i < n; i){nums1[mi] nums2[i];}Arrays.sort(nums1);} }法二&#xff1a;倒序雙指針 時間復雜度為O(mn) 從右…