滴滴 服务端 面经

一、缓存与数据库的使用场景及性能差异

1. 缓存的适用场景
  • 高频读、低频写场景:如商品详情页、用户信息等读多写少的数据,减少数据库压力。
  • 实时性要求不高的数据:如首页推荐列表、统计数据(非实时更新),允许短时间内数据不一致。
  • 高并发场景下的性能优化:通过缓存抗住流量峰值,避免数据库直接被击穿(如秒杀活动中的库存查询)。
2. 数据库的适用场景
  • 数据持久化与强一致性场景:如用户交易记录、订单状态变更,需保证数据不丢失且事务完整。
  • 复杂查询与业务逻辑:涉及多表关联、聚合统计(如SQL的JOIN、GROUP BY),数据库更擅长处理此类结构化查询。
  • 数据一致性要求高的场景:如金融交易、库存扣减,需通过数据库事务(ACID)保证操作原子性。
3. 数据库读写慢于缓存的根本原因
  • 存储介质差异
    • 缓存(如Redis)基于内存(RAM),读写速度可达纳秒级(10⁻⁹秒)。
    • 数据库(如MySQL)依赖磁盘(SSD/HDD),随机读写延迟在毫秒级(10⁻³秒),比内存慢约百万倍。
  • 数据结构与查询开销
    • 缓存使用哈希表、跳表等内存友好的数据结构,查询复杂度低(如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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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) 从右…