首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >杭州滴滴一面

杭州滴滴一面

作者头像
王中阳AI编程
发布2026-03-17 19:39:11
发布2026-03-17 19:39:11
1270
举报
文章被收录于专栏:Go语言学习专栏Go语言学习专栏

继续分享最新的面经。

今天分享的是训练营内部学员在杭州滴滴的一面面经详解,下面是整理好的问题:

面经详解

算法题,给定一个字符串数组,寻找最大前缀字符串

回答:可以通过遍历字符串数组,逐个字符比较来寻找。以下是Go实现示例:

代码语言:javascript
复制
func longestCommonPrefix(strs []string) string {
    if len(strs) == 0 {
        return ""
    }
    prefix := strs[0]
    for _, str := range strs[1:] {
        for i := range prefix {
            if i >= len(str) || prefix[i] != str[i] {
                prefix = prefix[:i]
                break
            }
        }
        if prefix == "" {
            break
        }
    }
    return prefix
}

MySQL的隔离级别,以及解决了哪些问题

回答:MySQL有四个隔离级别,从低到高分别是读未提交、读已提交、可重复读、串行化。

  • 读未提交:允许读取未提交事务数据,存在脏读问题,基本不用。
  • 读已提交:仅读取已提交事务数据,解决脏读,但存在不可重复读、幻读问题。
  • 可重复读(MySQL默认):同一事务内多次读取同一数据结果一致,解决脏读、不可重复读,InnoDB通过MVCC和间隙锁减少幻读。
  • 串行化:事务串行执行,解决脏读、不可重复读、幻读,但性能最差。

幻读是什么

回答:幻读是指同一事务中,两次执行相同查询语句,第二次查询返回了第一次没有的行(或缺少了第一次有的行)。例如事务A先查询满足条件的行,事务B插入满足该条件的新行,事务A再次查询就会出现“幻觉”。

MySQL的索引分类

回答:主要有主键索引、唯一索引、普通索引、复合索引、全文索引、空间索引。

  • 主键索引:唯一标识行,不允许NULL,一个表一个。
  • 唯一索引:索引列值唯一,可含NULL,一个表多个。
  • 普通索引:无唯一性约束,最基本索引。
  • 复合索引:多列组合,遵循最左前缀原则。
  • 全文索引:用于文本列的全文检索。
  • 空间索引:用于地理空间数据类型列。

索引的底层原理(B+树)

回答:InnoDB索引底层是B+树。它是平衡多路搜索树,非叶子节点存索引键,叶子节点存完整数据(主键索引)或索引键+主键(二级索引);叶子节点间通过双向链表连接,便于范围查询;所有数据在叶子节点,非叶子节点起索引引导作用,减少IO次数,提升查询效率。

B+树叶子节点存什么?二级索引的叶子节点又存的什么?

回答:

  • 主键索引(聚簇索引)的B+树叶子节点存完整的行数据
  • 二级索引(非聚簇索引)的B+树叶子节点存索引列的值 + 对应的主键值,查询时若需完整行数据,需通过主键回表查询。

mysql中 binlog redolog undolog的作用

回答:

  • binlog:记录所有修改操作(逻辑日志),用于主从复制和数据恢复。
  • redolog:InnoDB的物理日志,记录数据页修改,保证事务持久性,数据库崩溃后可恢复未刷盘的已提交事务。
  • undolog:InnoDB的回滚日志,记录事务修改前的数据状态,用于事务回滚和MVCC(实现读已提交、可重复读隔离级别)。

redolog刷盘时间

回答:由innodb_flush_log_at_trx_commit参数控制:

  • 0:每秒刷盘,事务提交不立即刷,性能高但可能丢1秒内事务。
  • 1(默认):事务提交时刷盘,最安全,保证持久性。
  • 2:事务提交时刷到操作系统缓存,由操作系统决定刷盘时间,性能较好但可能丢未刷盘事务。此外,redolog缓冲区空间不足时也会刷盘。

组合索引

回答:组合索引即联合索引,由多个列组合创建,遵循最左前缀原则。如联合索引(a, b, c),查询条件含aa AND ba AND b AND c时索引生效,含bc等时不生效(或部分生效)。合理设计可减少索引数量,提升多列查询效率。

redis分布式锁 使用场景

回答:适用于分布式系统中多个服务(或实例)互斥访问共享资源的场景,如电商库存扣减(防止超卖)、分布式任务调度(同一任务仅一个实例执行)、缓存预热(避免多节点重复预热)、分布式幂等性控制(保证同一请求仅处理一次)。

redis的数据持久化

回答:有RDB和AOF两种方式。

  • RDB:指定时间间隔将内存数据集快照写入磁盘(.rdb文件),恢复速度快,适合备份;但可能丢最后一次快照后的数据,快照时数据量大则性能开销大。
  • AOF:将写命令追加到日志文件,重启时执行命令恢复数据,数据丢失少(可配置同步策略),可读性强;但AOF文件体积大,恢复速度比RDB慢。也可同时开启两者,兼顾安全性和恢复速度。

redis的大Key处理:怎么处理 有什么问题

回答:

  • 问题:内存占用不均、序列化/反序列化开销大、网络带宽消耗大、删除/过期时阻塞主线程。
  • 处理方法:拆分大Key为多个小Key;使用UNLINK命令异步删除大Key;业务层限制Key大小;定期用--bigkeys命令或工具扫描大Key并处理。

经典问题 数组与切片区别

回答:Go中数组和切片区别如下:

维度

数组

切片

长度

固定,定义时确定

动态,可扩容

内存结构

值类型,存储元素值,传参拷贝整个数组

引用类型,含指针、长度、容量,传参拷贝元数据

定义方式

需指定长度,如[5]int

无需指定长度,如[]int,或make创建

扩容机制

长度超容量时扩容,新容量一般为原容量2倍(<1024时)或1.25倍(≥1024时)

golang的接口类型可以比较吗

回答:可以比较,但需注意:若接口动态类型是不可比较的(如切片、映射、函数),比较时会panic。只有当两个接口动态类型和动态值都相等时,才相等。例如var a, b interface{} = "hi", "hi"a==b为true;若动态类型是[]int{1},则比较会panic。

切片是不是并发安全

回答:不是。多个goroutine同时读写同一切片会出现数据竞争、数据不一致问题。需通过同步机制保证安全,如sync.Mutex加锁、channel传递数据,或使用并发安全的第三方结构。

关闭后的channel能不能从中接收数据?

回答:可以。若channel中还有未接收数据,可正常获取;数据取完后,接收操作返回元素类型零值,且第二个返回值(布尔值)为false。但向关闭的channel发送数据会panic。例如ch := make(chan int, 2); ch <- 1; ch <- 2; close(ch); fmt.Println(<-ch, <-ch, <-ch, ok)输出1 2 0 false

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 王中阳 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 面经详解
    • 算法题,给定一个字符串数组,寻找最大前缀字符串
    • MySQL的隔离级别,以及解决了哪些问题
    • 幻读是什么
    • MySQL的索引分类
    • 索引的底层原理(B+树)
    • B+树叶子节点存什么?二级索引的叶子节点又存的什么?
    • mysql中 binlog redolog undolog的作用
    • redolog刷盘时间
    • 组合索引
    • redis分布式锁 使用场景
    • redis的数据持久化
    • redis的大Key处理:怎么处理 有什么问题
    • 经典问题 数组与切片区别
    • golang的接口类型可以比较吗
    • 切片是不是并发安全
    • 关闭后的channel能不能从中接收数据?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档