Shopee 是东南亚发展最快的电商平台,2015年于新加坡成立并设立总部,社群媒体粉丝数量超3000万,拥有700万活跃卖家,员工超8000人遍布东南亚及中国. Shopee 在中国的总部位于广东深圳.

此份面试题来自Shopee面试者的综合整理,对于C++面试参考价值较大,涵盖了众多知识点,包括C++的语言特性、计网、操作系统、计算机组成、数据结构与算法、数据库等计算机基础. 啃下来虽然得花费不少功夫,但深入理解了这份题目,往后的面试就吃香了. 题目来源 https://leetcode-cn.com/circle/discuss/3UrXap/ 本文给出了每道问题的解决方向,解答不一定十全十美,留待读者自己做二次挖掘,这里权当抛砖引玉. 文末给出了本文的参考材料和推荐阅读资料. 若您发现本文有何处错误,还请批评指正!
C++
计算机网络
数据结构
数据库
-
索引的实现,有哪几种索引
- 实现:B+树 散列索引 位图索引
- 索引类型:唯一索引 主键索引 聚集索引
-
聚簇索引、非聚簇索引、覆盖索引
- 聚簇索引:也叫聚集索引,它实际上并不是一种单独的索引类型,而是一种数据存储方式,聚簇索引的叶子节点保存了一行记录的所有列信息。也就是说,聚簇索引的叶子节点中,包含了一个完整的记录行
- 非聚簇索引:也叫辅助索引、普通索引,它的叶子节点只包含一个主键值,通过非聚簇索引查找记录要先找到主键,然后通过主键再到聚簇索引中找到对应的记录行,这个过程被称为回表
- 覆盖索引:引查询中,如果辅助索引已经能够得到查询的所有信息了,就无需再回表,这个就是覆盖索引
-
什么是事务,事务的特性,事务的隔离级别
- 事务(Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
- 隔离级别:未提交读、提交读、可重复读、可串行化
-
Innodb 和 MyISAM 的区别
- 底层都是采用的是 B+ 树实现,MyISAM主键索引是非聚簇索引,InnoDB主键索引是聚簇索引;MyISAM索引文件和数据文件是分离的,InnoDB的数据文件按主键聚集
- MyISAM不支持外键,InnoDB支持,这是非关系型和关系型数据库的最大区别
- MyISAM不支持事务,InnoDB支持
- MyISAM不支持行锁,InnoDB支持,InnoDB也会退化为表锁
- MyISAM可以没有主键,InnoDB必须有
-
mysql 的主从复制具体实现
- 主库线程:主服务器将数据的更新记录到二进制日志中
- 从库 I/O 线程:从库将主库的二进制日志复制到本地的中继日志
- 从库 SQL 线程:从库读取中继日志中的事件,将其重放到数据中
-
mysql 的存储引擎
- InnoDB,是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,是MySQL默认的引擎
- MyISAM,拥有较高的插入、查询速度,但不支持事务
-
redis 的五种基本数据结构
- string
- hash table
- linked list
- set
- sorted set
-
redis 的主从复制具体实现

-
redis 和 mysql 的一致性保证
- 先更新数据库,再更新缓存
- 先更新缓存,再更新数据库
- 先删除缓存,再更新数据库
- 先更新数据库,再删除缓存
-
ACID
- 原子性:事务要么全部完成,要么全部不完成
- 一致性:事务开始前后,数据库完整性不变
- 隔离性:允许多个并发事务同时对其数据进行读写和修改的能力
- 持久性:事务提交之后,对数据库的修改就是永久的
-
可重复读和提交读的区别,如何实现
- 可重复读:在同一个事务内的查询都是事务开始时刻一致的,基于MVCC (多版本并发控制) 实现
- 提交读:只能读取到已经提交的数据,数据的读取都是不加锁的,但是数据的写入、修改和删除是需要加锁的
-
原子性怎么实现
- 通过事务实现,一个事务,要么成功执行,要么执行失败,回滚到原来的状态.
操作系统
参考与推荐阅读材料
- C++虚函数的实现基本原理 (https://jacktang816.github.io/post/virtualfunction/)
- C++ 一篇搞懂多态的实现原理 (https://zhuanlan.zhihu.com/p/104605966)
- C++11新特性梳理 (https://www.jianshu.com/p/78c700c8d72d)
- 面试问题详解——TCP (https://leetcode-cn.com/circle/discuss/aqTOW4/)
- 面试问题详解——网址访问过程详解 (https://leetcode-cn.com/circle/discuss/UrcaDQ/)
- 面试问题整理——操作系统 (https://leetcode-cn.com/circle/discuss/zIxrWn/)
- 大白话说协程 (https://mp.weixin.qq.com/s/BKm60as1vz3bfvzJjU7uTw)
- 我和面试官之间关于操作系统的一场对弈!(https://my.oschina.net/u/3827987/blog/3217890)
- 聊聊IO多路复用之select、poll、epoll详解 (https://www.jianshu.com/p/dfd940e7fca2)
- 面试官问你B树和B+树,就把这篇文章丢给他 (https://segmentfault.com/a/1190000020416577)
- 搞定技术面试:C++ 11 智能指针详解 (https://juejin.cn/post/6844903993055920141#heading-17)
- STL详解及常见面试题 (https://blog.csdn.net/daaikuaichuan/article/details/80717222)
- C/C++内存管理详解 (https://chenqx.github.io/2014/09/25/Cpp-Memory-Management/)
- 如何评价 C++11 的右值引用(Rvalue reference)特性? (https://www.zhihu.com/question/22111546/answer/30801982)
- 如何保证线程安全 (https://blog.csdn.net/qq_26545305/article/details/79516610)
- TCP传输协议中如何解决丢包问题 (https://network.51cto.com/art/201908/601322.htm)
- epoll相关基础知识 (https://xiaoyue26.github.io/2017/11/06/2017-11/epoll%E7%9B%B8%E5%85%B3%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/#select%E6%A8%A1%E5%BC%8F)
- java内存屏障的原理与应用 (https://blog.csdn.net/breakout_alex/article/details/94379895)
- 如何设计多核计算机以正确执行多进程程序 (https://juejin.cn/post/6844903893617360910)
- 操作系统内存管理(思维导图详解) (https://blog.csdn.net/hguisu/article/details/5713164)
- 八大排序算法 (https://guisu.blog.csdn.net/article/details/7776068)
- 数据库索引类型及实现方式 (https://blog.csdn.net/sdgihshdv/article/details/75039825)
- MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引 (https://www.dyxmq.cn/databases/mysql/clustered-nonclustered-union-and-unique-indexes-in-mysql.html)
- Innodb中的事务隔离级别和锁的关系 (https://tech.meituan.com/2014/08/20/innodb-lock.html)
- MyISAM和InnoDB的区别 (https://blog.csdn.net/daiyudong2020/article/details/104468714)
- 数据结构与算法——跳表 (https://zhuanlan.zhihu.com/p/68516038)
- Redis与数据库一致性 (https://note.dolyw.com/cache/00-DataBaseConsistency.html#%E6%9B%B4%E6%96%B0%E7%BC%93%E5%AD%98-vs-%E5%88%A0%E9%99%A4%E7%BC%93%E5%AD%98)