├── 11.3.1 什么是复制?.md ├── 11.4.6 如何添加索引?.md ├── 11.5.2 如何删除文档?.md ├── 11.5.4 什么是聚合?.md ├── 11.4.3 如何在集合中插入一个文档?.md ├── 11.4.8 如何查询集合中的文档?.md ├── 12.1.0 zookeeper是什么?.md ├── 9.1.0 主键 超键 候选键 外键.md ├── 11.3.4 在MongoDB中如何创建一个集合?.md ├── 11.3.6 在MongoDB中如何删除一个集合?.md ├── 11.3.8 MongoDB支持主键外键关系吗?.md ├── 11.3.9 MongoDB支持哪些数据类型?.md ├── 11.4.4 “ObjectID”有哪些部分组成?.md ├── 11.4.5 在MongoDb中什么是索引?.md ├── 11.4.7 MongoDB有哪些可替代产品?.md ├── 11.4.9 用什么方法可以格式化输出结果?.md ├── 11.5.1 在MongoDB中如何更新数据?.md ├── 11.5.3 在MongoDB中如何排序?.md ├── 11.5.5 在MongoDB中什么是副本集?.md ├── 11.5.6 Mongodb存储特性与内部原理.md ├── 11.1.6 MongoDB和关系型数据库术语对比图.md ├── 11.3.2 在MongoDB中如何在集合中插入一个文档?.md ├── 11.3.3 在MongoDB中如何除去一个数据库?.md ├── 11.3.5 在MongoDB中如何查看一个已经创建的集合?.md ├── 11.3.7 为什么要在MongoDB中使用分析器?.md ├── 11.4.0 为什么要在MongoDB中用Code数据类型?.md ├── 11.5.0 如何使用AND或OR条件循环查询集合中的文档?.md ├── 11.4.2 为什么在MongoDB中使用Object ID数据类型?.md ├── 11.4.1 为什么要在MongoDB中用Regular Expression数据类型?.md ├── 1.3.5 给定一个整数数组和一个整数,返回两个数组的索引,这两个索引指向的数字的加和等于指定的整数。需要最优的算法,分析算法的空间和时间复杂度.md ├── arch.jpg ├── zk_sync.png ├── 12.1.1 zookeeper提供了什么?.md ├── zk_zab_fast_paxos.png ├── zk_zab_basic_paxos.png ├── 11.1.8 “mongod”参数有什么?.md ├── 11.2.8 在MongoDB中如何查看数据库列表?.md ├── zk_distributed_locker1.png ├── zk_distributed_locker2.png ├── 11.1.3 什么是数据库?.md ├── 11.1.9 什么是“mongo”?.md ├── 11.1.5 什么是文档?.md ├── 11.2.4 在哪些场景使用MongoDB?.md ├── 12.1.6 zk的命名服务.md ├── 11.1.4 什么是集合?.md ├── 11.1.7 什么是“mongod”?.md ├── 11.1.1 MongoDB是由哪种语言写的?.md ├── 12.1.4 zookeeper通知机制.md ├── 12.1.5 zookeeper有哪些应用场景?.md ├── 1.3.3 如果让你设计一个通用的、支持各种数据库秒级备份和恢复的系统,你会如何设计.md ├── 11.2.1 什么是非关系型数据库?.md ├── 11.3.0 如何查看使用MongoDB的连接?.md ├── 12.1.7 zk的配置管理服务.md ├── 11.2.0 MongoDB哪个命令可以切换数据库?.md ├── 11.1.0 什么是MongoDB?.md ├── 11.2.2 非关系型数据库有哪些类型?.md ├── 1.2.9 你理解常见如阿里,和友商大数据平台的技术体系差异以及发展趋势和技术瓶颈,在存储和计算两个方面进行概述.md ├── 11.2.6 哪些语言支持MongoDB.md ├── 1.2.8 对大数据平台中的元数据管理是怎么理解的,元数据收集管理体系是怎么样的,会对大数据应用有什么样的影响.md ├── 10.1.1 redis相比memcached有哪些优势?.md ├── 10.1.8 是否使用过Redis集群,集群的原理是什么?.md ├── 1.2.7 请分析 MaxCompute 产品与分布式技术的关系、当前大数据计算平台类产品的市场现状和发展趋势.md ├── 1.3.4 如果让你来设计一个支持数据库、NOSQL 和大数据之间数据实时流动的数据流及处理的系统,你会考虑哪些问题?如何设计?.md ├── 10.1.7 Redis的同步机制了解么?.md ├── 11.2.7 在MongoDB中如何创建一个新的数据库?.md ├── 12.2.7 分布式通知和协调.md ├── 1.1.6 从innodb的索引结构分析,为什么索引的 key 长度不能太长.md ├── 1.1.7 MySQL的数据如何恢复到任意时间点?.md ├── 12.2.4 zk集群下server工作状态.md ├── 1.2.5 请计算XILINX公司VU9P芯片的算力相当于多少TOPS,给出计算过程与公式.md ├── 11.2.3 为什么用MOngoDB?.md ├── 12.1.2 zookeeper文件系统.md ├── 1.1.9 输入 ping IP 后敲回车,发包前会发生什么?.md ├── 11.1.2 MongoDB的优势有哪些?.md ├── 12.2.2 zk的工作原理.md ├── 10.1.0 使用Redis有哪些好处?.md ├── 11.2.9 MongoDB中的分片是什么意思?.md ├── 1.2.0 请解释下为什么鹿晗发布恋情的时候,微博系统会崩溃,如何解决?.md ├── 1.3.0 在云计算大数据处理场景中,每天运行着成千上万的任务,每个任务都要进行 IO 读写。存储系统为了更好的服务,经常会保证高优先级的任务优先执行。当多个作业或用户访问存储系统时,如何保证优先级和公平性.md ├── 1.3.6 假如给你一个新产品,你将从哪些方面来保障它的质量?.md ├── 12.2.3 zk是如何保证事物的顺序一致性.md ├── 12.1.8 zk的集群管理.md ├── 1.2.6 一颗现代处理器,每秒大概可以执行多少条简单的MOV指令,有哪些主要的影响因素.md ├── 12.2.6 zk同步流程.md ├── 1.2.1 现有一批邮件需要发送给订阅顾客,且有一个集群(集群的节点数不定,会动态扩容缩容)来负责具体的邮件发送任务,如何让系统尽快地完成发送?.md ├── 10.1.3 zookeeper的四种类型的znode.md ├── 9.1.8 存储过程与触发器的区别.md ├── 12.2.0 zk队列管理.md ├── 9.1.2 视图的作用,视图可以更改么?.md ├── 10.1.2 redis常见性能问题和解决方案.md ├── 10.1.6 redis最适合的场景.md ├── 1.1.5 关于epoll和select的区别,以下哪些说法是正确的.md ├── 10.1.4 Memcache与Redis的区别都有哪些?.md ├── 1.1.8 NFS与SMB的区别?.md ├── 1.2.2 有一批气象观测站,现需要获取这些站点的观测数据,并存储到 Hive 中。但是气象局只提供了 api 查询,每次只能查询单个观测点。那么如果能够方便快速地获取到所有的观测点的数据?.md ├── 10.1.5 Redis 常见的性能问题都有哪些?如何解决?.md ├── 1.2.3 如何实现两金额数据相加(最多小数点两位).md ├── 9.1.1 数据库事务的四个特性及含义.md ├── 12.2.1 zk数据复制.md ├── 10.1.3 MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据.md ├── 11.2.5 MongoDB中的命名空间是什么意思.md ├── 1.3.7 请评估一下程序的执行结果?.md ├── 9.1.6 数据库范式.md ├── 1.1.1 如何实现一个高效的单向链表逆序输出?.md ├── 12.1.9 zk的分布式锁.md ├── 1.1.2 已知sqrt(2)约等于1.414,要求不用数学库,求sqrt(2)精确到小数点后10位.md ├── 1.2.4 关于并行计算的一些基础开放问题.md ├── 9.1.7 数据库优化的思路.md ├── 12.2.5 zk是如何选举Leader的?.md ├── 1.3.2 给定一个链表,删除链表的倒数第N个节点,并且返回链表的头结点.md ├── 9.1.3 drop,delete与truncate的区别.md ├── 1.3.1 最大频率栈.md ├── 1.1.3 给定一个二叉搜索树(BST),找到树中第 K 小的节点.md ├── 1.1.4 LRU缓存机制.md ├── 9.1.4 索引的工作原理及其种类.md ├── 9.1.5 连接的种类.md └── README.md /11.3.1 什么是复制?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.4.6 如何添加索引?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.5.2 如何删除文档?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.5.4 什么是聚合?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.4.3 如何在集合中插入一个文档?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.4.8 如何查询集合中的文档?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /12.1.0 zookeeper是什么?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /9.1.0 主键 超键 候选键 外键.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.3.4 在MongoDB中如何创建一个集合?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.3.6 在MongoDB中如何删除一个集合?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.3.8 MongoDB支持主键外键关系吗?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.3.9 MongoDB支持哪些数据类型?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.4.4 “ObjectID”有哪些部分组成?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.4.5 在MongoDb中什么是索引?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.4.7 MongoDB有哪些可替代产品?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.4.9 用什么方法可以格式化输出结果?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.5.1 在MongoDB中如何更新数据?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.5.3 在MongoDB中如何排序?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.5.5 在MongoDB中什么是副本集?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.5.6 Mongodb存储特性与内部原理.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.1.6 MongoDB和关系型数据库术语对比图.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.3.2 在MongoDB中如何在集合中插入一个文档?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.3.3 在MongoDB中如何除去一个数据库?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.3.5 在MongoDB中如何查看一个已经创建的集合?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.3.7 为什么要在MongoDB中使用分析器?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.4.0 为什么要在MongoDB中用Code数据类型?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.5.0 如何使用AND或OR条件循环查询集合中的文档?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.4.2 为什么在MongoDB中使用Object ID数据类型?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11.4.1 为什么要在MongoDB中用Regular Expression数据类型?.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /1.3.5 给定一个整数数组和一个整数,返回两个数组的索引,这两个索引指向的数字的加和等于指定的整数。需要最优的算法,分析算法的空间和时间复杂度.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /arch.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuzhengwei/interview_internal_reference/HEAD/arch.jpg -------------------------------------------------------------------------------- /zk_sync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuzhengwei/interview_internal_reference/HEAD/zk_sync.png -------------------------------------------------------------------------------- /12.1.1 zookeeper提供了什么?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:zookeeper提供了什么? 2 | 3 | #### **参考答案**: 4 | 5 | 1、文件系统 6 | 2、通知机制 7 | -------------------------------------------------------------------------------- /zk_zab_fast_paxos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuzhengwei/interview_internal_reference/HEAD/zk_zab_fast_paxos.png -------------------------------------------------------------------------------- /zk_zab_basic_paxos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuzhengwei/interview_internal_reference/HEAD/zk_zab_basic_paxos.png -------------------------------------------------------------------------------- /11.1.8 “mongod”参数有什么?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:"mongod"参数有什么 2 | 3 | #### **参考答案**: 4 | 5 | 传递数据库存储路径,默认是"/data/db" 6 | 端口号 默认是 "27017" -------------------------------------------------------------------------------- /11.2.8 在MongoDB中如何查看数据库列表?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:在MongoDB中如何查看数据库列表 2 | 3 | #### **参考答案**: 4 | 5 | 使用命令"show dbs" 6 | 7 | >show dbs -------------------------------------------------------------------------------- /zk_distributed_locker1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuzhengwei/interview_internal_reference/HEAD/zk_distributed_locker1.png -------------------------------------------------------------------------------- /zk_distributed_locker2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuzhengwei/interview_internal_reference/HEAD/zk_distributed_locker2.png -------------------------------------------------------------------------------- /11.1.3 什么是数据库?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:什么是数据库 2 | 3 | #### **参考答案**: 4 | 5 | 数据库可以看成是一个电子化的文件柜,用户可以对文件中的数据运行新增、检索、更新、删除等操作。数据库是一个所有集合的容器,在文件系统中每一个数据库都有一个相关的物理文件。 -------------------------------------------------------------------------------- /11.1.9 什么是“mongo”?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:什么是"mongo" 2 | 3 | #### **参考答案**: 4 | 5 | 它是一个命令行工具用于连接一个特定的mongod实例。当我们没有带参数运行mongo命令它将使用默认的端口号和localhost连接。 6 | 7 | -------------------------------------------------------------------------------- /11.1.5 什么是文档?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:什么是文档 2 | 3 | #### **参考答案**: 4 | 5 | 文档由一组key value组成。文档是动态模式,这意味着同一集合里的文档不需要有相同的字段和结构。在关系型数据库中table中的每一条记录相当于MongoDB中的一个文档。 6 | -------------------------------------------------------------------------------- /11.2.4 在哪些场景使用MongoDB?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:在哪些场景使用MongoDB 2 | 3 | #### **参考答案**: 4 | 5 | * 大数据 6 | 7 | * 内容管理系统 8 | 9 | * 移动端Apps 10 | 11 | * 数据管理 12 | -------------------------------------------------------------------------------- /12.1.6 zk的命名服务.md: -------------------------------------------------------------------------------- 1 | #### **题目**: zk的命名服务 2 | 3 | #### **参考答案**: 4 | 5 | 命名服务是指通过指定的名字来获取资源或者服务的地址,利用zk创建一个全局的路径,即是唯一的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。 -------------------------------------------------------------------------------- /11.1.4 什么是集合?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:什么是集合 2 | 3 | #### **参考答案**: 4 | 5 | 集合就是一组 MongoDB 文档。它相当于关系型数据库(RDBMS)中的表这种概念。集合位于单独的一个数据库中。一个集合内的多个文档可以有多个不同的字段。一般来说,集合中的文档都有着相同或相关的目的。 -------------------------------------------------------------------------------- /11.1.7 什么是“mongod”?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:什么是”mongod“ 2 | 3 | #### **参考答案**: 4 | 5 | mongod是处理MongoDB系统的主要进程。它处理数据请求,管理数据存储,和执行后台管理操作。当我们运行mongod命令意味着正在启动MongoDB进程,并且在后台运行。 -------------------------------------------------------------------------------- /11.1.1 MongoDB是由哪种语言写的?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:MongoDB是由哪种语言写的 2 | 3 | #### **参考答案**: 4 | MongoDB用c++编写的,流行的开源数据库MySQL也是用C++开发的。C++1983年发行是一种使用广泛的计算机程序设计语言。它是一种通用程序设计语言,支持多重编程模式。 -------------------------------------------------------------------------------- /12.1.4 zookeeper通知机制.md: -------------------------------------------------------------------------------- 1 | #### **题目**:zookeeper通知机制 2 | 3 | #### **参考答案**: 4 | 5 | client端会对某个znode建立一个watcher事件,当该znode发生变化时,这些client会收到zk的通知,然后client可以根据znode变化来做出业务上的改变等。 -------------------------------------------------------------------------------- /12.1.5 zookeeper有哪些应用场景?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:zookeeper有哪些应用场景 2 | 3 | #### **参考答案**: 4 | 5 | 1、命名服务 6 | 7 | 2、配置管理 8 | 9 | 3、集群管理 10 | 11 | 4、分布式锁 12 | 13 | 5、队列管理 -------------------------------------------------------------------------------- /1.3.3 如果让你设计一个通用的、支持各种数据库秒级备份和恢复的系统,你会如何设计.md: -------------------------------------------------------------------------------- 1 | #### **题目**:如果让你设计一个通用的、支持各种数据库秒级备份和恢复的系统,你会如何设计? 2 | 3 | #### **出题人**:阿里巴巴出题专家:千震/阿里云数据库高级技术专家 4 | 5 | #### **参考答案**:开放性问题,无标准答案。 -------------------------------------------------------------------------------- /11.2.1 什么是非关系型数据库?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:什么是非关系型数据库 2 | 3 | #### **参考答案**: 4 | 5 | 非关系型数据库是对不同于传统关系型数据库的统称。非关系型数据库的显著特点是不使用SQL作为查询语言,数据存储不需要特定的表格模式。由于简单的设计和非常好的性能所以被用于大数据和Web Apps等 -------------------------------------------------------------------------------- /11.3.0 如何查看使用MongoDB的连接?.md: -------------------------------------------------------------------------------- 1 | 如何查看使用MongoDB的连接Sharding - MongoDB Manual21.如何查看使用MongoDB的连接 2 | 3 | 使用命令"db.adminCommand(“connPoolStats”)" 4 | 5 | >db.adminCommand(“connPoolStats”) -------------------------------------------------------------------------------- /12.1.7 zk的配置管理服务.md: -------------------------------------------------------------------------------- 1 | #### **题目**:zk的配置管理 2 | 3 | #### **参考答案**: 4 | 5 | 程序分布式的部署在不同的机器上,将程序的配置信息放在zk的znode下,当有配置发生改变时,也就是znode发生变化时,可以通过改变zk中某个目录节点的内容,利用watcher通知给各个客户端,从而更改配置。 -------------------------------------------------------------------------------- /11.2.0 MongoDB哪个命令可以切换数据库?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:MongoDB哪个命令可以切换数据库 2 | 3 | #### **参考答案**: 4 | 5 | MongoDB 用use+数据库名称的方式来创建数据库。use会创建一个新的数据库,如果该数据库存在,则返回这个数据库。 6 | 7 | >use database_name -------------------------------------------------------------------------------- /11.1.0 什么是MongoDB?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:什么是MongoDB 2 | 3 | #### **参考答案**: 4 | 5 | MongoDB是一个文档数据库,提供好的性能,领先的非关系型数据库。采用BSON存储文档数据。2007年10月,MongoDB由10gen团队所发展。2009年2月首度推出。获得安装包和查看详细的API可以访问官网网址www.mongodb.com -------------------------------------------------------------------------------- /11.2.2 非关系型数据库有哪些类型?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:非关系型数据库有哪些类型 2 | 3 | #### **参考答案**: 4 | 5 | * Key-Value 存储 Eg:Amazon S3 6 | 7 | * 图表 Eg:Neo4J 8 | 9 | * 文档存储 Eg:MongoDB 10 | 11 | * 基于列存储 Eg:Cassandra -------------------------------------------------------------------------------- /1.2.9 你理解常见如阿里,和友商大数据平台的技术体系差异以及发展趋势和技术瓶颈,在存储和计算两个方面进行概述.md: -------------------------------------------------------------------------------- 1 | #### **题目**: 你理解常见如阿里,和友商大数据平台的技术体系差异以及发展趋势和技术瓶颈,在存储和计算两个方面进行概述。 2 | 3 | #### **出题人**: 阿里巴巴出题专家:映泉/阿里巴巴高级技术专家 4 | 5 | #### **参考答案**:开放性问题,无标准答案。 -------------------------------------------------------------------------------- /11.2.6 哪些语言支持MongoDB.md: -------------------------------------------------------------------------------- 1 | #### **题目** : 哪些语言支持MongoDB? 2 | 3 | #### **参考答案**: 4 | 5 | * C 6 | 7 | * C++ 8 | 9 | * C# 10 | 11 | * Java 12 | 13 | * Node.js 14 | 15 | * Perl 16 | 17 | * Php 等 18 | -------------------------------------------------------------------------------- /1.2.8 对大数据平台中的元数据管理是怎么理解的,元数据收集管理体系是怎么样的,会对大数据应用有什么样的影响.md: -------------------------------------------------------------------------------- 1 | #### **题目**: 对大数据平台中的元数据管理是怎么理解的,元数据收集管理体系是怎么样的,会对大数据应用有什么样的影响。 2 | 3 | #### **出题人**: 阿里巴巴出题专家:映泉/阿里巴巴高级技术专家 4 | 5 | #### **参考答案**:开放性问题,无标准答案。 6 | 7 | -------------------------------------------------------------------------------- /10.1.1 redis相比memcached有哪些优势?.md: -------------------------------------------------------------------------------- 1 | #### **redis相比memcached有哪些优势?**: 2 | 3 | #### **参考答案**: 4 | 5 | (1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 6 | 7 | (2) redis的速度比memcached快很多 8 | 9 | (3) redis可以持久化其数据 -------------------------------------------------------------------------------- /10.1.8 是否使用过Redis集群,集群的原理是什么?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:是否使用过Redis集群,集群的原理是什么? 2 | 3 | #### **参考答案**: 4 | 5 | Redis Sentinal着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务。 6 | 7 | Redis Cluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。 -------------------------------------------------------------------------------- /1.2.7 请分析 MaxCompute 产品与分布式技术的关系、当前大数据计算平台类产品的市场现状和发展趋势.md: -------------------------------------------------------------------------------- 1 | #### **题目**:请分析 MaxCompute 产品与分布式技术的关系、当前大数据计算平台类产品的市场现状和发展趋势。 2 | 3 | #### **出题人**:阿里巴巴出题专家:云郎/阿里 MaxCompute 高级产品专家 4 | 5 | #### **参考答案**: 6 | 7 | 开放性问题,无标准答案。 -------------------------------------------------------------------------------- /1.3.4 如果让你来设计一个支持数据库、NOSQL 和大数据之间数据实时流动的数据流及处理的系统,你会考虑哪些问题?如何设计?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:如果让你来设计一个支持数据库、NOSQL 和大数据之间数据实时流动的数据流及处理的系统,你会考虑哪些问题?如何设计? 2 | 3 | #### **出题人**:阿里巴巴出题专家:千震/阿里云数据库高级技术专家 4 | 5 | #### **参考答案**:开放性问题,无标准答案。 -------------------------------------------------------------------------------- /10.1.7 Redis的同步机制了解么?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:Redis的同步机制了解么? 2 | 3 | #### **参考答案**: 4 | 5 | 从从同步。第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将rdb文件全量同步到复制节点,复制节点接受完成后将rdb镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。 6 | -------------------------------------------------------------------------------- /11.2.7 在MongoDB中如何创建一个新的数据库?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:在MongoDB中如何创建一个新的数据库 2 | 3 | #### **参考答案**: 4 | 5 | MongoDB 用 use + 数据库名称 的方式来创建数据库。use 会创建一个新的数据库,如果该数据库存在,则返回这个数据库。 6 | 7 | >use mydb 8 | switched to db mydb 9 | 10 | -------------------------------------------------------------------------------- /12.2.7 分布式通知和协调.md: -------------------------------------------------------------------------------- 1 | #### **题目**:分布式通知和协调 2 | 3 | #### **参考答案**: 4 | 5 | 对于系统调度来说:操作人员发送通知实际是通过控制台改变某个节点的状态,然后zk将这些变化发送给注册了这个节点的watcher的所有客户端。 6 | 7 | 对于执行情况汇报:每个工作进程都在某个目录下创建一个临时节点。并携带工作的进度数据,这样汇总的进程可以监控目录子节点的变化获得工作进度的实时的全局情况。 -------------------------------------------------------------------------------- /1.1.6 从innodb的索引结构分析,为什么索引的 key 长度不能太长.md: -------------------------------------------------------------------------------- 1 | #### **题目**:从 innodb 的索引结构分析,为什么索引的 key 长度不能太长? 2 | 3 | #### **出题人**:阿里巴巴出题专家:近秋/阿里云数据库产品技术部技术专家 4 | 5 | #### **参考答案**:key 太长会导致一个页当中能够存放的 key 的数目变少,间接导致索引树的页数目变多,索引层次增加,从而影响整体查询变更的效率。 6 | -------------------------------------------------------------------------------- /1.1.7 MySQL的数据如何恢复到任意时间点?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:MySQL 的数据如何恢复到任意时间点? 2 | 3 | #### **出题人**:阿里巴巴出题专家:近秋/阿里云数据库产品技术部技术专家参考答案 4 | 5 | #### **参考答案**:恢复到任意时间点以定时的做全量备份,以及备份增量的 binlog 日志为前提。恢复到任意时间点首先将全量备份恢复之后,再此基础上回放增加的 binlog 直至指定的时间点。 6 | -------------------------------------------------------------------------------- /12.2.4 zk集群下server工作状态.md: -------------------------------------------------------------------------------- 1 | #### **题目**:zk集群下server工作状态 2 | 3 | #### **参考答案**: 4 | 5 | 每个Server在工作过程中有三种状态: 6 | 7 | LOOKING:当前Server不知道leader是谁,正在搜寻 8 | 9 | LEADING:当前Server即为选举出来的leader 10 | 11 | FOLLOWING:leader已经选举出来,当前Server与之同步 -------------------------------------------------------------------------------- /1.2.5 请计算XILINX公司VU9P芯片的算力相当于多少TOPS,给出计算过程与公式.md: -------------------------------------------------------------------------------- 1 | #### **题目**:请计算XILINX公司VU9P芯片的算力相当于多少TOPS,给出计算过程与公式。 2 | 3 | #### **出题人**: 阿里巴巴出题专家:隐达/阿里云异构计算资深专家 4 | 5 | #### **参考答案**:基于不同的算法,这个值在十几到几百之间。但是,如果只是单纯比算力,FPGA和ASIC、GPU相比并无太大优势,甚至大多时候有较大劣势。FPGA的优势在于高度的灵活性和算法的针对性。 -------------------------------------------------------------------------------- /11.2.3 为什么用MOngoDB?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:为什么用MOngoDB? 2 | 3 | #### **参考答案**: 4 | 5 | * 架构简单 6 | 7 | * 没有复杂的连接 8 | 9 | * 深度查询能力,MongoDB支持动态查询。 10 | 11 | * 容易调试 12 | 13 | * 容易扩展 14 | 15 | * 不需要转化/映射应用对象到数据库对象 16 | 17 | * 使用内部内存作为存储工作区,以便更快的存取数据。 18 | -------------------------------------------------------------------------------- /12.1.2 zookeeper文件系统.md: -------------------------------------------------------------------------------- 1 | #### **题目**:zookeeper文件系统 2 | 3 | #### **参考答案**: 4 | 5 | zookeeper提供一个类似unix文件系统目录的多层级节点命名空间(节点称为znode)。与文件系统不同的是,这些节点都可以设置关联的数据,而文件系统中只有文件节点可以存放数据而目录节点不行。zookeeper为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构,这种特性使得zookeeper不能用于存放大量的数据,每个节点的存放数据上限为1M。 -------------------------------------------------------------------------------- /1.1.9 输入 ping IP 后敲回车,发包前会发生什么?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:输入 ping IP 后敲回车,发包前会发生什么? 2 | 3 | #### **出题人**:阿里巴巴出题专家:怀虎/阿里云云效平台负责人 4 | 5 | #### **参考答案**: 6 | 首先根据目的IP和路由表决定走哪个网卡,再根据网卡的子网掩码地址判断目的IP是否在子网内。如果不在则会通过arp缓存查询IP的网卡地址,不存在的话会通过广播询问目的IP的mac地址,得到后就开始发包了,同时mac地址也会被arp缓存起来。 7 | -------------------------------------------------------------------------------- /11.1.2 MongoDB的优势有哪些?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:MongoDB的优势有哪些 2 | 3 | #### **参考答案**: 4 | 5 | 面向文档的存储:以 JSON 格式的文档保存数据。 6 | 7 | * 任何属性都可以建立索引。 8 | 9 | * 复制以及高可扩展性。 10 | 11 | * 自动分片。 12 | 13 | * 丰富的查询功能。 14 | 15 | * 快速的即时更新。 16 | 17 | * 来自 MongoDB 的专业支持。 -------------------------------------------------------------------------------- /12.2.2 zk的工作原理.md: -------------------------------------------------------------------------------- 1 | #### **题目**:zk的工作原理 2 | 3 | #### **参考答案**: 4 | 5 | Zookeeper 的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和 leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。 6 | -------------------------------------------------------------------------------- /10.1.0 使用Redis有哪些好处?.md: -------------------------------------------------------------------------------- 1 | #### **题目**: 2 | 3 | #### **参考答案**: 4 | 5 | (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) 6 | 7 | (2) 支持丰富数据类型,支持string,list,set,sorted set,hash 8 | 9 | (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 10 | 11 | (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除 -------------------------------------------------------------------------------- /11.2.9 MongoDB中的分片是什么意思?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:MongoDB中的分片是什么意思 2 | 3 | #### **参考答案**: 4 | 5 | 分片是将数据水平切分到不同的物理节点。当应用数据越来越大的时候,数据量也会越来越大。当数据量增长时,单台机器有可能无法存储数据或可接受的读取写入吞吐量。利用分片技术可以添加更多的机器来应对数据量增加以及读写操作的要求。 6 | 7 | 参考:[https://docs.mongodb.com/manual/sharding/](https://docs.mongodb.com/manual/sharding/) -------------------------------------------------------------------------------- /1.2.0 请解释下为什么鹿晗发布恋情的时候,微博系统会崩溃,如何解决?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:请解释下为什么鹿晗发布恋情的时候,微博系统会崩溃,如何解决? 2 | 3 | #### **出题人**:阿里巴巴出题专家:江岚/阿里巴巴数据技术高级技术专家 4 | 5 | #### **参考答案**: 6 | 7 | A. 获取微博通过 pull 方式还是 push 方式 8 | 9 | B. 发布微博的频率要远小于阅读微博 10 | 11 | C. 流量明星的发微博,和普通博主要区分对待,比如在 sharding的时候,也要考虑这个因素 12 | 13 | -------------------------------------------------------------------------------- /1.3.0 在云计算大数据处理场景中,每天运行着成千上万的任务,每个任务都要进行 IO 读写。存储系统为了更好的服务,经常会保证高优先级的任务优先执行。当多个作业或用户访问存储系统时,如何保证优先级和公平性.md: -------------------------------------------------------------------------------- 1 | #### **题目**:在云计算大数据处理场景中,每天运行着成千上万的任务,每个任务都要进行 IO 读写。存储系统为了更好的服务,经常会保证高优先级的任务优先执行。当多个作业或用户访问存储系统时,如何保证优先级和公平性。 2 | 3 | #### **出题人**:阿里巴巴出题专家:田磊磊/阿里云文件存储高级技术专家 4 | 5 | #### **参考答案**:开放性问题,无标准答案。 -------------------------------------------------------------------------------- /1.3.6 假如给你一个新产品,你将从哪些方面来保障它的质量?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:假如给你一个新产品,你将从哪些方面来保障它的质量? 2 | 3 | #### **出题人**:阿里巴巴出题专家:晨晖 /阿里云中间件技术部测试开发专家 4 | 5 | #### **参考答案**: 6 | 7 | 可以从代码开发、测试保障、线上质量三个方面来保障。 8 | 9 | 在代码开发阶段,有单元测试、代码Review、静态代码扫描等; 10 | 11 | 测试保障阶段,有功能测试、性能测试、高可用测试、稳定性测试、兼容性测试等; 12 | 13 | 在线上质量方面,有灰度发布、紧急回滚、故障演练、线上监控和巡检等。 -------------------------------------------------------------------------------- /12.2.3 zk是如何保证事物的顺序一致性.md: -------------------------------------------------------------------------------- 1 | #### **题目**:zookeeper是如何保证事务的顺序一致性的? 2 | 3 | #### **参考答案**: 4 | 5 | zookeeper采用了递增的事务Id来标识,所有的proposal(提议)都在被提出的时候加上了zxid,zxid实际上是一个64位的数字,高32位是epoch(时期; 纪元; 世; 新时代)用来标识leader是否发生改变,如果有新的leader产生出来,epoch会自增,低32位用来递增计数。当新产生proposal的时候,会依据数据库的两阶段过程,首先会向其他的server发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行。 -------------------------------------------------------------------------------- /12.1.8 zk的集群管理.md: -------------------------------------------------------------------------------- 1 | #### **题目**:zookeeper集群管理 2 | 3 | #### **参考答案**: 4 | 5 | 所谓集群管理无在乎两点:是否有机器退出和加入、选举master。 6 | 对于第一点,所有机器约定在父目录下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它上船了。 7 | 新机器加入也是类似,所有机器收到通知:新兄弟目录加入,highcount又有了,对于第二点,我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为master就好。 -------------------------------------------------------------------------------- /1.2.6 一颗现代处理器,每秒大概可以执行多少条简单的MOV指令,有哪些主要的影响因素.md: -------------------------------------------------------------------------------- 1 | #### **题目**:一颗现代处理器,每秒大概可以执行多少条简单的MOV指令,有哪些主要的影响因素? 2 | 3 | #### **出题人**:阿里巴巴出题专家:子团/创新产品虚拟化&稳定性资深技术专家 4 | 5 | #### **参考答案**: 6 | 7 | **及格:** 8 | 每执行一条mov指令需要消耗1个时钟周期,所以每秒执行的mov指令和CPU主频相关。 9 | 10 | **加分:** 11 | 在CPU微架构上,要考虑数据预取,乱序执行,多发射,内存stall(前端stall和后端stall)等诸多因素,因此除了cpu主频外,还和流水线上的效率(IPC)强相关,比较复杂的一个问题。 -------------------------------------------------------------------------------- /12.2.6 zk同步流程.md: -------------------------------------------------------------------------------- 1 | #### **题目**:zookeeper同步流程 2 | 3 | #### **参考答案**: 4 | 5 | 选完Leader以后,zk就进入状态同步过程。 6 | 7 | 1. Leader等待Follower和Observer连接; 8 | 9 | 2. Follower连接leader,将最大的zxid发送给leader; 10 | 11 | 3. Leader根据follower的zxid确定同步点; 12 | 13 | 4. 完成同步后通知follower 已经成为uptodate状态; 14 | 15 | 5. Follower收到uptodate消息后,又可以重新接受client的请求进行服务了。 16 | 17 | -------------------------------------------------------------------------------- /1.2.1 现有一批邮件需要发送给订阅顾客,且有一个集群(集群的节点数不定,会动态扩容缩容)来负责具体的邮件发送任务,如何让系统尽快地完成发送?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:现有一批邮件需要发送给订阅顾客,且有一个集群(集群的节点数不定,会动态扩容缩容)来负责具体的邮件发送任务,如何让系统尽快地完成发送?请详述技术方案! 2 | 3 | #### **出题人**:阿里巴巴出题专家:江岚/阿里巴巴数据技术高级技术专家 4 | 5 | ### **参考答案**: 6 | 7 | A. 借助消息中间件,通过发布者订阅者模式来进行任务分配 8 | 9 | B. master-slave 部署,由 master 来分配任务 10 | 11 | C. 不借助任何中间件,且所有节点均等。通过数据库的 update-returning,从而实现节点之间任务的互斥 12 | -------------------------------------------------------------------------------- /10.1.3 zookeeper的四种类型的znode.md: -------------------------------------------------------------------------------- 1 | #### **题目**:zookeeper的四种类型的znode 2 | 3 | #### **参考答案**: 4 | 5 | 1、PERSISTENT-持久化目录节点 6 | 客户端与zookeeper断开连接后,该节点依旧存在 7 | 2、PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点 8 | 客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号 9 | 3、EPHEMERAL-临时目录节点 10 | 客户端与zookeeper断开连接后,该节点被删除 11 | 4、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点 12 | 客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号 -------------------------------------------------------------------------------- /9.1.8 存储过程与触发器的区别.md: -------------------------------------------------------------------------------- 1 | #### **题目**:存储过程与触发器的区别 2 | 3 | #### **参考答案**: 4 | 5 | 触发器与存储过程非常相似,触发器也是SQL语句集,两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。触发器是在一个修改了指定表中的数据时执行的存储过程。通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性和一致性。由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以确保数据的完整性。触发器不同于存储过程,触发器主要是通过事件执行触发而被执行的,而存储过程可以通过存储过程名称名字而直接调用。当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQLSERVER就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则。 -------------------------------------------------------------------------------- /12.2.0 zk队列管理.md: -------------------------------------------------------------------------------- 1 | #### **题目**:zk队列管理 2 | 3 | #### **参考答案**: 4 | 5 | 两种类型的队列: 6 | 1、同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。 7 | 2、队列按照 FIFO 方式进行入队和出队操作。 8 | 第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。 9 | 第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。在特定的目录下创建PERSISTENT_SEQUENTIAL节点,创建成功时Watcher通知等待的队列,队列删除序列号最小的节点用以消费。此场景下Zookeeper的znode用于消息存储,znode存储的数据就是消息队列中的消息内容,SEQUENTIAL序列号就是消息的编号,按序取出即可。由于创建的节点是持久化的,所以不必担心队列消息的丢失问题。 -------------------------------------------------------------------------------- /9.1.2 视图的作用,视图可以更改么?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:视图的作用,视图可以更改么? 2 | 3 | #### **参考答案**: 4 | 5 | 视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询;不包含任何列或数据。使用视图可以简化复杂的sql操作,隐藏具体的细节,保护数据;视图创建后,可以使用与表相同的方式利用它们。 6 | 7 | 视图不能被索引,也不能有关联的触发器或默认值,如果视图本身内有order by 则对视图再次order by将被覆盖。 8 | 9 | 创建视图:create view XXX as XXXXXXXXXXXXXX; 10 | 11 | 对于某些视图比如未使用联结子查询分组聚集函数Distinct Union等,是可以对其更新的,对视图的更新将对基表进行更新;但是视图主要用于简化检索,保护数据,并不用于更新,而且大部分视图都不可以更新。 -------------------------------------------------------------------------------- /10.1.2 redis常见性能问题和解决方案.md: -------------------------------------------------------------------------------- 1 | #### **题目**:redis常见性能问题和解决方案 2 | 3 | #### **参考答案**: 4 | 5 | (1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件 6 | 7 | (2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次 8 | 9 | (3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内 10 | 11 | (4) 尽量避免在压力很大的主库上增加从库 12 | 13 | (5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3... 14 | 15 | 这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。 16 | -------------------------------------------------------------------------------- /10.1.6 redis最适合的场景.md: -------------------------------------------------------------------------------- 1 | #### **题目**:redis 最适合的场景 2 | 3 | #### **参考答案**: 4 | 5 | Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢? 6 | 7 | 如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点: 8 | 9 | 1) Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 10 | 2) Redis支持数据的备份,即master-slave模式的数据备份。 11 | 3) Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用 -------------------------------------------------------------------------------- /1.1.5 关于epoll和select的区别,以下哪些说法是正确的.md: -------------------------------------------------------------------------------- 1 | ##### **问题**:关于 epoll 和 select 的区别,哪些说法是正确的?(多选) 2 | A. epoll 和 select 都是 I/O 多路复用的技术,都可以实现同时监听多个 I/O 事件的状态。 3 | 4 | B. epoll 相比 select 效率更高,主要是基于其操作系统支持的I/O事件通知机制,而 select 是基于轮询机制。 5 | 6 | C. epoll 支持水平触发和边沿触发两种模式。 7 | 8 | D. select 能并行支持 I/O 比较小,且无法修改。 9 | 10 | ##### **出题人**:阿里巴巴出题专家:寈峰/阿里技术专家 11 | 12 | ##### **参考答案**:A,B,C 13 | 14 | 15 | **【延伸】那在高并发的访问下,epoll使用那一种触发方式要高效些?当使用边缘触发的时候要注意些什么东西?** 16 | 17 | 18 | -------------------------------------------------------------------------------- /10.1.4 Memcache与Redis的区别都有哪些?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:Memcache与Redis的区别都有哪些? 2 | 3 | #### **参考答案**: 4 | 5 | 1)、存储方式 6 | 7 | Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 8 | 9 | Redis有部份存在硬盘上,这样能保证数据的持久性。 10 | 11 | 2)、数据支持类型 12 | 13 | Memcache对数据类型支持相对简单。 14 | 15 | Redis有复杂的数据类型。 16 | 17 | 3)、使用底层模型不同 18 | 19 | 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 20 | 21 | Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。 22 | 23 | 4),value大小 24 | 25 | redis最大可以达到1GB,而memcache只有1MB -------------------------------------------------------------------------------- /1.1.8 NFS与SMB的区别?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:NFS 和 SMB 是最常见的两种 NAS(Network Attached Storage)协议,当把一个文件系统同时通过 NFS 和 SMB 协议共享给多个主机访问时,以下哪些说法是错误的:(多选) 2 | 3 | A. 不可能有这样的操作,即把一个文件系统同时通过 NFS 和 SMB协议共享给多个主机访问。 4 | 5 | B. 主机 a 的用户通过NFS 协议创建的文件或者目录,另一个主机 b的用户不能通过 SMB 协议将其删除。 6 | 7 | C. 在同一个目录下,主机 a 通过 NFS 协议看到文件 file.txt,主机b 通过 SMB 协议也看到文件 file.txt,那么它们是同一个文件。 8 | 9 | D. 主机 a 通过 NFS 协议,以及主机 b 通过 SMB 协议,都可以通过主机端的数据缓存,提升文件访问性能。 10 | 11 | #### **出题人**:阿里巴巴出题专家:起影/阿里云文件存储高级技术专家 12 | 13 | #### **参考答案**:A,B,C 14 | 15 | 16 | -------------------------------------------------------------------------------- /1.2.2 有一批气象观测站,现需要获取这些站点的观测数据,并存储到 Hive 中。但是气象局只提供了 api 查询,每次只能查询单个观测点。那么如果能够方便快速地获取到所有的观测点的数据?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:有一批气象观测站,现需要获取这些站点的观测数据,并存储到 Hive 中。但是气象局只提供了 api 查询,每次只能查询单个观测点。那么如果能够方便快速地获取到所有的观测点的数据? 2 | 3 | #### **出题人**:阿里巴巴出题专家:江岚/阿里巴巴数据技术高级技术专家 4 | 5 | #### **参考答案**: 6 | 7 | A. 通过 shell 或 python 等调用 api,结果先暂存本地,最后将本地文件上传到 Hive 中。 8 | 9 | B. 通过 datax 的 httpReader 和 hdfsWriter 插件,从而获取所需的数据。 10 | 11 | C. 比较理想的回答,是在计算引擎的 UDF 中调用查询 api,执行UDF 的查询结果存储到对应的表中。一方面,不需要同步任务的导出导入;另一方面,计算引擎的分布式框架天生提供了分布式、容错、并发等特性。 -------------------------------------------------------------------------------- /10.1.5 Redis 常见的性能问题都有哪些?如何解决?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:Redis 常见的性能问题都有哪些?如何解决? 2 | 3 | #### **参考答案**: 4 | 5 | 1) Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。 6 | 7 | 2) Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。 8 | 9 | 3) Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。 10 | 11 | 4) Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内 -------------------------------------------------------------------------------- /1.2.3 如何实现两金额数据相加(最多小数点两位).md: -------------------------------------------------------------------------------- 1 | #### **题目**:如何实现两金额数据相加(最多小数点两位)? 2 | 3 | #### **出题人**:阿里巴巴出题专家:御术/蚂蚁金服数据可视化高级技术专家 4 | 5 | #### **参考答案**: 6 | 7 | 其实问题并不难,就是考察候选人对 JavaScript 数据运算上的认知以及考虑问题的缜密程度,有很多坑,可以用在笔试题,如果用在面试,回答过程中还可以随机加入有很多计算机基础的延伸。 8 | 9 | 回到这个问题,由于直接浮点相与加会失精,所以要转整数;(可以插入问遇到过吗?是否可以举个例子?)。 10 | 11 | 转整数是第一个坑,虽然只有两位可以通过乘以100转整数,但由于乘以一百和除以一百都会出现浮点数的运算,所以也会失精,还是要通过字符串来转;(可以插入问字符串转整数有几种方式?)字符串转整是第二个坑,因为最后要对齐计算,如果没考虑周全先toFixed(2),对于只有一位小数点数据进入计算就会错误;转整数后的计算是个加分点,很多同学往往就是直接算了,如果可以考虑大数计算的场景,恭喜同学进入隐藏关卡,这就会涉及如何有效循环、遍历、算法复杂度的问题。 -------------------------------------------------------------------------------- /9.1.1 数据库事务的四个特性及含义.md: -------------------------------------------------------------------------------- 1 | #### **题目**:数据库事务的四个特性及含义 2 | 3 | #### **参考答案**: 4 | 5 | 数据库事务transanction正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。 6 | 7 | * 原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 8 | 9 | * 一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。 10 | 11 | * 隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。 12 | 13 | * 持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。 -------------------------------------------------------------------------------- /12.2.1 zk数据复制.md: -------------------------------------------------------------------------------- 1 | #### **题目**:zk数据复制 2 | 3 | #### **参考答案**: 4 | 5 | Zookeeper作为一个集群提供一致的数据服务,自然,它要在所有机器间做数据复制。数据复制的好处: 6 | 1、容错:一个节点出错,不致于让整个系统停止工作,别的节点可以接管它的工作; 7 | 2、提高系统的扩展能力 :把负载分布到多个节点上,或者增加节点来提高系统的负载能力; 8 | 3、提高性能:让客户端本地访问就近的节点,提高用户访问速度。 9 | 10 | 从客户端读写访问的透明度来看,数据复制集群系统分下面两种: 11 | 1、写主(WriteMaster) :对数据的修改提交给指定的节点。读无此限制,可以读取任何一个节点。这种情况下客户端需要对读与写进行区别,俗称读写分离; 12 | 2、写任意(Write Any):对数据的修改可提交给任意的节点,跟读一样。这种情况下,客户端对集群节点的角色与变化透明。 13 | 14 | 对zookeeper来说,它采用的方式是写任意。通过增加机器,它的读吞吐能力和响应能力扩展性非常好,而写,随着机器的增多吞吐能力肯定下降(这也是它建立observer的原因),而响应能力则取决于具体实现方式,是延迟复制保持最终一致性,还是立即复制快速响应。 -------------------------------------------------------------------------------- /10.1.3 MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据.md: -------------------------------------------------------------------------------- 1 | #### **题目**:MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据 2 | 3 | #### **参考答案**: 4 | 5 | 相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略: 6 | 7 | voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 8 | 9 | volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 10 | 11 | volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰 12 | 13 | allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰 14 | 15 | allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰 16 | 17 | no-enviction(驱逐):禁止驱逐数据 18 | 19 | -------------------------------------------------------------------------------- /11.2.5 MongoDB中的命名空间是什么意思.md: -------------------------------------------------------------------------------- 1 | #### **题目**:MongoDB中的命名空间是什么意思? 2 | 3 | #### **参考答案**: 4 | 5 | MongoDB内部有预分配空间的机制,每个预分配的文件都用0进行填充。 6 | 7 | 数据文件每新分配一次,它的大小都是上一个数据文件大小的2倍,每个数据文件最大2G。 8 | 9 | MongoDB每个集合和每个索引都对应一个命名空间,这些命名空间的元数据集中在16M的*.ns文件中,平均每个命名占用约 628 字节,也即整个数据库的命名空间的上限约为24000。 10 | 11 | 如果每个集合有一个索引(比如默认的_id索引),那么最多可以创建12000个集合。如果索引数更多,则可创建的集合数就更少了。同时,如果集合数太多,一些操作也会变慢。 12 | 13 | 要建立更多的集合的话,MongoDB 也是支持的,只需要在启动时加上“--nssize”参数,这样对应数据库的命名空间文件就可以变得更大以便保存更多的命名。这个命名空间文件(.ns文件)最大可以为 2G。 14 | 15 | 每个命名空间对应的盘区不一定是连续的。与数据文件增长相同,每个命名空间对应的盘区大小都是随分配次数不断增长的。目的是为了平衡命名空间浪费的空间与保持一个命名空间数据的连续性。 16 | 17 | 需要注意的一个命名空间$freelist,这个命名空间用于记录不再使用的盘区(被删除的Collection或索引)。每当命名空间需要分配新盘区时,会先查看$freelist是否有大小合适的盘区可以使用,如果有就回收空闲的磁盘空间。 -------------------------------------------------------------------------------- /1.3.7 请评估一下程序的执行结果?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:请评估一下程序的执行结果? 2 | ``` 3 | public class SynchronousQueueQuiz { 4 | public static void main(String[] args) throws Exception { 5 | BlockingQueue queue = new 6 | SynchronousQueue<>(); 7 | System. out .print(queue.offer(1) + " "); 8 | System. out .print(queue.offer(2) + " "); 9 | System. out .print(queue.offer(3) + " "); 10 | System. out .print(queue.take() + " "); 11 | System. out .println(queue.size()); 12 | } 13 | } 14 | 15 | ``` 16 | A. true true true 1 3 17 | 18 | B. true true true (阻塞) 19 | 20 | C. false false false null 0 21 | 22 | D. false false false (阻塞) 23 | 24 | #### **出题人**:阿里巴巴出题专家:桃谷/阿里云中间件技术专家 25 | 26 | #### **参考答案**:D 27 | 28 | -------------------------------------------------------------------------------- /9.1.6 数据库范式.md: -------------------------------------------------------------------------------- 1 | #### **题目**:数据库范式 2 | 3 | #### **参考答案**: 4 | 5 | 1 第一范式(1NF) 6 | 7 | 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。 8 | 所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。 9 | 10 | 2 第二范式(2NF) 11 | 12 | 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键、主码。 13 | 第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。 14 | 15 | 3 第三范式(3NF) 16 | 17 | 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。(我的理解是消除冗余) -------------------------------------------------------------------------------- /1.1.1 如何实现一个高效的单向链表逆序输出?.md: -------------------------------------------------------------------------------- 1 | ##### **问题**:如何实现一个高效的单向链表逆序输出? 2 | 3 | ##### **出题人**:阿里巴巴出题专家:昀龙/阿里云弹性人工智能负责人 4 | 5 | ##### **参考答案**:下面是其中一种写法,也可以有不同的写法,比如递归等。供参考。 6 | 7 | 8 | ``` 9 | typedef struct node{ 10 | int data; 11 | struct node* next; 12 | node(int d):data(d), next(NULL){} 13 | }node; 14 | 15 | void reverse(node* head) 16 | { 17 | if(NULL == head || NULL == head->next){ 18 | return; 19 | } 20 | 21 | node* prev=NULL; 22 | node* pcur=head->next; 23 | node* next; 24 | 25 | while(pcur!=NULL){ 26 | if(pcur->next==NULL){ 27 | pcur->next=prev; 28 | break; 29 | } 30 | next=pcur->next; 31 | pcur->next=prev; 32 | prev=pcur; 33 | pcur=next; 34 | } 35 | 36 | head->next=pcur; 37 | node*tmp=head->next; 38 | while(tmp!=NULL){ 39 | cout<data<<"\t"; 40 | tmp=tmp->next; 41 | } 42 | } 43 | 44 | ``` 45 | -------------------------------------------------------------------------------- /12.1.9 zk的分布式锁.md: -------------------------------------------------------------------------------- 1 | #### **题目**:zookeeper分布式锁 2 | 3 | #### **参考答案**: 4 | 5 | 有了zookeeper的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占,另一个是控制时序。 6 | 对于第一类,我们将zookeeper上的一个znode看作是一把锁,通过createznode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的distribute_lock 节点就释放出锁。 7 | 对于第二类, /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选master一样,编号最小的获得锁,用完删除,依次方便。 8 | 9 | **获取分布式锁的流程** 10 | 11 | 12 | 13 | 在获取分布式锁的时候在locker节点下创建临时顺序节点,释放锁的时候删除该临时节点。客户端调用createNode方法在locker下创建临时顺序节点, 14 | 然后调用getChildren(“locker”)来获取locker下面的所有子节点,注意此时不用设置任何Watcher。客户端获取到所有的子节点path之后,如果发现自己创建的节点在所有创建的子节点序号最小,那么就认为该客户端获取到了锁。如果发现自己创建的节点并非locker所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,然后对其调用exist()方法,同时对其注册事件监听器。之后,让这个被关注的节点删除,则客户端的Watcher会收到相应通知,此时再次判断自己创建的节点是否是locker子节点中序号最小的,如果是则获取到了锁,如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听。当前这个过程中还需要许多的逻辑判断。 15 | 16 | 17 | 18 | 代码的实现主要是基于互斥锁,获取分布式锁的重点逻辑在于BaseDistributedLock,实现了基于Zookeeper实现分布式锁的细节。 19 | -------------------------------------------------------------------------------- /1.1.2 已知sqrt(2)约等于1.414,要求不用数学库,求sqrt(2)精确到小数点后10位.md: -------------------------------------------------------------------------------- 1 | #### **题目**:已知 sqrt (2)约等于 1.414,要求不用数学库,求 sqrt (2)精确到小数点后 10 位。 2 | #### **出题人**:——阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家 3 | #### **参考答案**: 4 | #### * 考察点 5 | 6 | 1. 基础算法的灵活应用能力(二分法学过数据结构的同学都知道,但不一定往这个方向考虑;如果学过数值计算的同学,应该还要能想到牛顿迭代法并解释清楚) 7 | 2. 退出条件设计 8 | 9 | #### * 解决办法 10 | ##### 1. 已知 sqrt(2)约等于 1.414,那么就可以在(1.4, 1.5)区间做二分 11 | 查找,如: 12 | a) high=>1.5 13 | b) low=>1.4 14 | c) mid => (high+low)/2=1.45 15 | d) 1.45*1.45>2 ? high=>1.45 : low => 1.45 16 | e) 循环到 c) 17 | 18 | ##### 2. 退出条件 19 | a) 前后两次的差值的绝对值<=0.0000000001, 则可退出 20 | 21 | ``` 22 | const double EPSINON = 0.0000000001; 23 | 24 | double sqrt2( ){ 25 | double low = 1.4, high = 1.5; 26 | double mid = (low + high) / 2; 27 | 28 | while (high - low > EPSINON){ 29 | if (mid*mid > 2){ 30 | high = mid; 31 | } 32 | else{ 33 | low = mid; 34 | } 35 | mid = (high + low) / 2; 36 | } 37 | 38 | return mid; 39 | } 40 | ``` 41 | 42 | -------------------------------------------------------------------------------- /1.2.4 关于并行计算的一些基础开放问题.md: -------------------------------------------------------------------------------- 1 | #### **题目**: 关于并行计算的一些基础开放问题。 2 | 3 | ◼ 如何定义并计算,请分别阐述分布式内存到共享内存模式行编程的区别和实现(例子代码)? 4 | 5 | ◼ 请使用 MPI 和 OpenMP 分别实现 N 个处理器对 M 个变量的求和? 6 | 7 | ◼ 请说明 SIMD 指令在循环中使用的权限?向量化优化有哪些手段? 8 | 9 | ◼ 请用 Amdahl 定律说明什么是并行效率以及并行算法的扩展性?并说明扩展性的性能指标和限制因素,最后请说明在共享内存计算机中,共享内存的限制?OpenMP 是怎样实现共享内存编程环境的?MPI 阻塞和非阻塞读写的区别? 10 | 11 | #### **出题人**:阿里巴巴出题专家:何万青/阿里云高性能计算资深技术专家 12 | 13 | #### **参考答案**: 14 | 15 | (简要答案,但必须触及,可以展开) 16 | ◼ 同时执行多个/算法/逻辑操作/内存访问/IO,相互独立同时运行,分三个层次:进程级,多个节点分布式内存通过MPI通信并行;线程级,共享内存的多路机器,通过OpenMP实现多线程并行;指令集:通过SIM指令实现单指令多数据。。。。举例吧啦吧啦。 17 | 18 | ◼ MPI代码,,,OpenMP代码,分别写出来 M个元素,N个处理器的累加,后者注意private 参数。 19 | 20 | ◼ SIMD在循环中的应用,限制在于 SIMD指令处理的每一个数组的长度,cache line利用,内部循环间的依赖和条件调用等。 21 | 22 | ◼ 向量化,主要看SSE和AVX指令占比率,通过编译器优化...... 在loop代码中使用。 23 | 24 | ◼ 性能和计算规模随处理器增加的变化曲线,实测HPL和峰值HPL比率,能用用Amdahl定律表达Tpar(N) = (an + (1-a)n/N )t + C (n,N), 能够讲明白串行部分对整个并行的天花板效应,扩展性能够解释清楚算法的扩展性=并行效率随处理器数目的变化关系,画出来。 25 | 26 | ◼ 共享内存计算机OpenMP对变量的限制描述,EREW,CREW,ERCW,CRCW等区别,NUMA概念,如何保持coherent等。 27 | 28 | ◼ 写出OpenMP和MPI的核心函数,回答问题即可。 -------------------------------------------------------------------------------- /9.1.7 数据库优化的思路.md: -------------------------------------------------------------------------------- 1 | #### **题目**:数据库优化的思路 2 | 3 | #### **参考答案**: 4 | 5 | 这个我借鉴了慕课上关于数据库优化的课程。 6 | 7 | 1.SQL语句优化 8 | 1)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 9 | 2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: 10 | select id from t where num is null 11 | 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: 12 | select id from t where num=0 13 | 3)很多时候用 exists 代替 in 是一个好的选择 14 | 4)用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤 15 | 16 | 2.索引优化 17 | 看上文索引 18 | 19 | 3.数据库结构优化 20 | 1)范式优化: 比如消除冗余(节省空间。。) 2)反范式优化:比如适当加冗余等(减少join) 3)拆分表: 分区将数据在物理上分隔开,不同分区的数据可以制定保存在处于不同磁盘上的数据文件里。这样,当对这个表进行查询时,只需要在表分区中进行扫描,而不必进行全表扫描,明显缩短了查询时间,另外处于不同磁盘的分区也将对这个表的数据传输分散在不同的磁盘I/O,一个精心设置的分区可以将数据传输对磁盘I/O竞争均匀地分散开。对数据量大的时时表可采取此方法。可按月自动建表分区。 21 | 4)拆分其实又分垂直拆分和水平拆分: 案例: 简单购物系统暂设涉及如下表: 1.产品表(数据量10w,稳定) 2.订单表(数据量200w,且有增长趋势) 3.用户表 (数据量100w,且有增长趋势) 以mysql为例讲述下水平拆分和垂直拆分,mysql能容忍的数量级在百万静态数据可以到千万 垂直拆分:解决问题:表与表之间的io竞争 不解决问题:单表中数据量增长出现的压力 方案: 把产品表和用户表放到一个server上 订单表单独放到一个server上 水平拆分: 解决问题:单表中数据量增长出现的压力 不解决问题:表与表之间的io争夺 22 | 方案: 用户表通过性别拆分为男用户表和女用户表 订单表通过已完成和完成中拆分为已完成订单和未完成订单 产品表 未完成订单放一个server上 已完成订单表盒男用户表放一个server上 女用户表放一个server上(女的爱购物 哈哈) 23 | 24 | 4.服务器硬件优化 25 | 这个么多花钱咯! -------------------------------------------------------------------------------- /12.2.5 zk是如何选举Leader的?.md: -------------------------------------------------------------------------------- 1 | #### **题目**:zookeeper是如何选举Leader的? 2 | 3 | #### **参考答案**: 4 | 5 | 当leader崩溃或者leader失去大多数的follower,这时zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态。Zk的选举算法有两种:一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。系统默认的选举算法为fast paxos。 6 | 7 | 1、Zookeeper选主流程(basic paxos) 8 | (1)选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server; 9 | (2)选举线程首先向所有Server发起一次询问(包括自己); 10 | (3)选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获取对方的id(myid),并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中; 11 | (4)收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server; 12 | (5)线程将当前zxid最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 + 1的Server票数,设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置自己的状态,否则,继续这个过程,直到leader被选举出来。 通过流程分析我们可以得出:要使Leader获得多数Server的支持,则Server总数必须是奇数2n+1,且存活的Server的数目不得少于n+1. 每个Server启动后都会重复以上流程。在恢复模式下,如果是刚从崩溃状态恢复的或者刚启动的server还会从磁盘快照中恢复数据和会话信息,zk会记录事务日志并定期进行快照,方便在恢复时进行状态恢复。 13 | 14 | 15 | 16 | 2、Zookeeper选主流程(fast paxos) 17 | fast paxos流程是在选举过程中,某Server首先向所有Server提议自己要成为leader,当其它Server收到提议以后,解决epoch和 zxid的冲突,并接受对方的提议,然后向对方发送接受提议完成的消息,重复这个流程,最后一定能选举出Leader。 18 | 19 | 20 | -------------------------------------------------------------------------------- /1.3.2 给定一个链表,删除链表的倒数第N个节点,并且返回链表的头结点.md: -------------------------------------------------------------------------------- 1 | #### **题目**:给定一个链表,删除链表的倒数第 N 个节点,并且返回链表的头结点。 2 | 3 | ◼ 示例: 4 | 给定一个链表: 1->2->3->4->5, 和 n = 2. 5 | 当删除了倒数第二个节点后,链表变为 1->2->3->5. 6 | 说明: 7 | 给定的 n 保证是有效的。 8 | 要求: 9 | 只允许对链表进行一次遍历。 10 | 11 | #### **出题人**:阿里巴巴出题专家:屹平/阿里云视频云边缘计算高级技术专家 12 | 13 | #### **参考答案**: 14 | 15 | 我们可以使用两个指针而不是一个指针。第一个指针从列表的开头向前移动 n+1n+1 步,而第二个指针将从列表的开头出发。现在,这两个指针被 nn 个结点分开。我们通过同时移动两个指针向前来保持这个恒定的间隔,直到第一个指针到达最后一个结点。此时第二个指针将指向从最后一个结点数起的第 n 个结点。我们重新链接第二个指针所引用的结点的 next 指针指向该结点的下下个结点。 16 | 17 | **参考代码**: 18 | 19 | ``` 20 | public ListNode removeNthFromEnd(ListNode head, int n) 21 | { 22 | ListNode dummy = new ListNode(0); 23 | dummy.next = head; 24 | ListNode first = dummy; 25 | ListNode second = dummy; 26 | // Advances first pointer so that the gap between first 27 | and second is n nodes apart 28 | for (int i = 1; i <= n + 1; i++) { 29 | first = first.next; 30 | } 31 | // Move first to the end, maintaining the gap 32 | while (first != null) { 33 | first = first.next; 34 | second = second.next; 35 | } 36 | second.next = second.next.next; 37 | return dummy.next; 38 | } 39 | ``` 40 | 41 | **复杂度分析:** 42 | * 时间复杂度:O(L),该算法对含有 L 个结点的列表进行了一次遍历。因此时间复杂度为 O(L)。 43 | 44 | * 空间复杂度:O(1),我们只用了常量级的额外空间。 -------------------------------------------------------------------------------- /9.1.3 drop,delete与truncate的区别.md: -------------------------------------------------------------------------------- 1 | #### **题目**:drop,delete与truncate的区别 2 | 3 | #### **参考答案**: 4 | 5 | drop直接删掉表 truncate删除表中数据,再插入时自增长id又从1开始 delete删除表中数据,可以加where字句。 6 | 7 | (1) DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。 8 | 9 | (2) 表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。 10 | 11 | (3) 一般而言,drop > truncate > delete 12 | 13 | (4) 应用范围。TRUNCATE 只能对TABLE;DELETE可以是table和view 14 | 15 | (5) TRUNCATE 和DELETE只删除数据,而DROP则删除整个表(结构和数据)。 16 | 17 | (6) truncate与不带where的delete :只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。 18 | 19 | (7) delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 tigger,执行的时候将被触发。 20 | 21 | (8) truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚 22 | 23 | (9) 在没有备份情况下,谨慎使用 drop 与 truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中数据删除,如果于事务无关,用truncate即可实现。如果和事务有关,或老师想触发trigger,还是用delete。 24 | 25 | (10) Truncate table 表名 速度快,而且效率高,因为: truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。 26 | 27 | (11) TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。 28 | 29 | (12) 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。 -------------------------------------------------------------------------------- /1.3.1 最大频率栈.md: -------------------------------------------------------------------------------- 1 | #### **题目**:最大频率栈。 2 | 实现 FreqStack,模拟类似栈的数据结构的操作的一个类。FreqStack 有两个函数:
push(int x),将整数 x 推入栈中。pop(),它移除并返回栈中出现最频繁的元素。如果最频繁的元素不只一个,则移除并返回最接近栈顶的元素。 3 | ◼ 示例: 4 | push [5,7,5,7,4,5] 5 | pop() -> 返回 5,因为 5 是出现频率最高的。
栈变成 6 | [5,7,5,7,4]。 7 | pop() -> 返回 7,因为 5 和 7 都是频率最高的,但 7 最接近栈 8 | 顶。
栈变成 [5,7,5,4]。 9 | pop() -> 返回 5 。
栈变成 [5,7,4]。 10 | pop() -> 返回 4 。
栈变成 [5,7]。 11 | 12 | #### **出题人**:阿里巴巴出题专家:屹平/阿里云视频云边缘计算高级技术专家 13 | 14 | #### **参考答案**: 15 | 16 | 令 freq 作为 x 的出现次数的映射 Map。 17 | 18 | 此外 maxfreq,即栈中任意元素的当前最大频率,因为我们必须弹出频率最高的元素。 19 | 20 | 当前主要的问题就变成了:在具有相同的(最大)频率的元素中,怎么判断那个元素是最新的?我们可以使用栈来查询这一信息:靠近栈顶的元素总是相对更新一些。 21 | 22 | 为此,我们令 group 作为从频率到具有该频率的元素的映射。到目前,我们已经实现了 FreqStack 的所有必要的组件。 23 | 24 | 算法: 25 | 26 | 实际上,作为实现层面上的一点细节,如果 x 的频率为 f,那么我们将获取在所有 group[i] (i <= f) 中的 x,而不仅仅是栈顶的那个。这是因为每个 group[i] 都会存储与第 i 个 x 副本相关的信息。 27 | 28 | 最后,我们仅仅需要如上所述维持 freq,group,以及 maxfreq。 29 | 30 | **参考代码***: 31 | ``` 32 | class FreqStack { 33 | Map freq; 34 | Map> group; 35 | int maxfreq; 36 | 37 | public FreqStack() { 38 | freq = new HashMap(); 39 | group = new HashMap(); 40 | maxfreq = 0; 41 | } 42 | 43 | public void push(int x) { 44 | int f = freq.getOrDefault(x, 0) + 1; 45 | freq.put(x, f); 46 | if (f > maxfreq) maxfreq = f; 47 | group.computeIfAbsent(f, z-> new Stack()).push(x); 48 | } 49 | 50 | public int pop() { 51 | int x = group.get(maxfreq).pop(); 52 | freq.put(x, freq.get(x) - 1); 53 | if (group.get(maxfreq).size() == 0) 54 | maxfreq--; 55 | return x; 56 | } 57 | } 58 | ``` -------------------------------------------------------------------------------- /1.1.3 给定一个二叉搜索树(BST),找到树中第 K 小的节点.md: -------------------------------------------------------------------------------- 1 | #### **题目**:给定一个二叉搜索树(BST),找到树中第 K 小的节点。 2 | #### **出题人**:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家 3 | #### **参考答案**: 4 | 5 | ##### * 考察点 6 | 1. 基础数据结构的理解和编码能力 7 | 2. 递归使用 8 | 9 | ##### * 示例 10 | ``` 11 | 5 12 | / \ 13 | 3 6 14 | / \ 15 | 2 4 16 | / 17 | 1 18 | 19 | ``` 20 | 说明:保证输入的 K 满足 1<=K<=(节点数目) 21 | 22 | 树相关的题目,第一眼就想到递归求解,左右子树分别遍历。联想到二叉搜索树的性质,root 大于左子树,小于右子树,如果左子树的节点数目等于 K-1,那么 root 就是结果,否则如果左子树节点数目小于 K-1,那么结果必然在右子树,否则就在左子树。因此在搜索的时候同时返回节点数目,跟 K 做对比,就能得出结果了。 23 | 24 | ``` 25 | /** 26 | * Definition for a binary tree node. 27 | **/ 28 | 29 | public class TreeNode { 30 | int val; 31 | TreeNode left; 32 | TreeNode right; 33 | TreeNode(int x) { val = x; } 34 | } 35 | 36 | class Solution { 37 | private class ResultType { 38 | 39 | boolean found; // 是否找到 40 | 41 | int val; // 节点数目 42 | ResultType(boolean found, int val) { 43 | this.found = found; 44 | this.val = val; 45 | } 46 | } 47 | 48 | public int kthSmallest(TreeNode root, int k) { 49 | return kthSmallestHelper(root, k).val; 50 | } 51 | 52 | private ResultType kthSmallestHelper(TreeNode root, int k) { 53 | if (root == null) { 54 | return new ResultType(false, 0); 55 | } 56 | 57 | ResultType left = kthSmallestHelper(root.left, k); 58 | 59 | // 左子树找到,直接返回 60 | if (left.found) { 61 | return new ResultType(true, left.val); 62 | } 63 | 64 | // 左子树的节点数目 = K-1,结果为 root 的值 65 | if (k - left.val == 1) { 66 | return new ResultType(true, root.val); 67 | } 68 | 69 | // 右子树寻找 70 | ResultType right = kthSmallestHelper(root.right, k - left.val - 1); 71 | if (right.found) { 72 | return new ResultType(true, right.val); 73 | } 74 | 75 | // 没找到,返回节点总数 76 | return new ResultType(false, left.val + 1 + right.val); 77 | } 78 | } 79 | 80 | ``` 81 | 82 | -------------------------------------------------------------------------------- /1.1.4 LRU缓存机制.md: -------------------------------------------------------------------------------- 1 | **题目**:LRU 缓存机制 2 | 设计和实现一个 LRU(最近最少使用)缓存数据结构,使它应该支持一下操作:get 和 put。 3 | get(key) - 如果 key 存在于缓存中,则获取 key 的 value(总是正数),否则返回 -1。 4 | put(key,value) - 如果 key 不存在,请设置或插入 value。当缓存达到其容量时,它应该在插入新项目之前使最近最少使用的项目作废。 5 | 6 | **出题人**:文景/阿里云 CDN 资深技术专家 7 | 8 | **参考答案**: 9 | 10 | python版本的: 11 | 12 | ``` 13 | class LRUCache(object): 14 | def __init__(self, capacity): 15 | """ 16 | :type capacity: int 17 | """ 18 | self.cache = {} 19 | self.keys = [] 20 | self.capacity = capacity 21 | 22 | def visit_key(self, key): 23 | if key in self.keys: 24 | self.keys.remove(key) 25 | self.keys.append(key) 26 | 27 | def elim_key(self): 28 | key = self.keys[0] 29 | self.keys = self.keys[1:] 30 | del self.cache[key] 31 | 32 | def get(self, key): 33 | """ 34 | :type key: int 35 | :rtype: int 36 | """ 37 | if not key in self.cache: 38 | return -1 39 | self.visit_key(key) 40 | return self.cache[key] 41 | 42 | def put(self, key, value): 43 | """ 44 | :type key: int 45 | :type value: int 46 | :rtype: void 47 | """ 48 | if not key in self.cache: 49 | if len(self.keys) == self.capacity: 50 | self.elim_key() 51 | self.cache[key] = value 52 | self.visit_key(key) 53 | 54 | def main(): 55 | s = 56 | [["put","put","get","put","get","put","get","get","get"],[[1,1],[2,2],[1],[3,3],[2],[ 57 | 4,4],[1],[3],[4]]] 58 | obj = LRUCache(2) 59 | l=[] 60 | for i,c in enumerate(s[0]): 61 | if(c == "get"): 62 | l.append(obj.get(s[1][i][0])) 63 | else: 64 | obj.put(s[1][i][0], s[1][i][1]) 65 | print(l) 66 | 67 | if __name__ == "__main__": 68 | main() 69 | 70 | ``` 71 | 72 | c++版本的: 73 | 74 | ``` 75 | class LRUCache{ 76 | public: 77 | LRUCache(int capacity) { 78 | cap = capacity; 79 | } 80 | 81 | int get(int key) { 82 | auto it = m.find(key); 83 | if (it == m.end()) return -1; 84 | l.splice(l.begin(), l, it->second); 85 | return it->second->second; 86 | } 87 | 88 | void set(int key, int value) { 89 | auto it = m.find(key); 90 | if (it != m.end()) l.erase(it->second); 91 | l.push_front(make_pair(key, value)); 92 | m[key] = l.begin(); 93 | if (m.size() > cap) { 94 | int k = l.rbegin()->first; 95 | l.pop_back(); 96 | m.erase(k); 97 | } 98 | } 99 | } 100 | 101 | ``` 102 | -------------------------------------------------------------------------------- /9.1.4 索引的工作原理及其种类.md: -------------------------------------------------------------------------------- 1 | #### **题目**:索引的工作原理及其种类 2 | 3 | #### **参考答案**: 4 | 5 | **数据库索引**,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。 6 | 7 | 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。 8 | 9 | 为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。 10 | 11 | 12 | 13 | 图展示了一种可能的索引方式。左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在O(log2n)的复杂度内获取到相应数据。 14 | 15 | 创建索引可以大大提高系统的性能。 16 | 17 | 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 18 | 19 | 第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 20 | 21 | 第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 22 | 23 | 第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 24 | 25 | 第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 26 | 27 | 也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?因为,增加索引也有许多不利的方面。 28 | 29 | 第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 30 | 31 | 第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 32 | 33 | 第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 34 | 35 | 索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引:在经常需要搜索的列上,可以加快搜索的速度;在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。 36 | 37 | 同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点: 38 | 39 | 第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。 40 | 41 | 第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。 42 | 43 | 第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。 44 | 45 | 第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。 46 | 47 | 根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。 48 | 49 | 唯一索引 50 | 51 | 唯一索引是不允许其中任何两行具有相同索引值的索引。 52 | 53 | 当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在employee表中职员的姓(lname)上创建了唯一索引,则任何两个员工都不能同姓。 主键索引 数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。 聚集索引 在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。 54 | 55 | 如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。 56 | 57 | 局部性原理与磁盘预读 58 | 由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分分之一,因此为了提高效率,要尽量减少磁盘I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这样做的理论依据是计算机科学中著名的局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用。程序运行期间所需要的数据通常比较集中。 59 | 60 | 由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率。 61 | 62 | 预读的长度一般为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页得大小通常为4k),主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。 63 | 64 | B-/+Tree索引的性能分析 65 | 到这里终于可以分析B-/+Tree索引的性能了。 66 | 67 | 上文说过一般使用磁盘I/O次数评价索引结构的优劣。先从B-Tree分析,根据B-Tree的定义,可知检索一次最多需要访问h个节点。数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在实际实现B-Tree还需要使用如下技巧: 68 | 69 | 每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。 70 | 71 | B-Tree中一次检索最多需要h-1次I/O(根节点常驻内存),渐进复杂度为O(h)=O(logdN)。一般实际应用中,出度d是非常大的数字,通常超过100,因此h非常小(通常不超过3)。 72 | 73 | 而红黑树这种结构,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,所以红黑树的I/O渐进复杂度也为O(h),效率明显比B-Tree差很多。 74 | 75 | 综上所述,用B-Tree作为索引结构效率是非常高的。 -------------------------------------------------------------------------------- /9.1.5 连接的种类.md: -------------------------------------------------------------------------------- 1 | #### **题目**:连接的种类 2 | 3 | #### **参考答案**: 4 | 5 | 查询分析器中执行: 6 | ``` 7 | --建表table1,table2: 8 | create table table1(id int,name varchar(10)) 9 | create table table2(id int,score int) 10 | insert into table1 select 1,'lee' 11 | insert into table1 select 2,'zhang' 12 | insert into table1 select 4,'wang' 13 | insert into table2 select 1,90 14 | insert into table2 select 2,100 15 | insert into table2 select 3,70 16 | 17 | ``` 18 | 如表: 19 | ``` 20 | ------------------------------------------------- 21 | table1 | table2 | 22 | ------------------------------------------------- 23 | id name |id score | 24 | 1 lee |1 90| 25 | 2 zhang| 2 100| 26 | 4 wang| 3 70| 27 | ------------------------------------------------- 28 | ``` 29 | 以下均在查询分析器中执行 30 | 一、外连接 31 | 1.概念:包括左向外联接、右向外联接或完整外部联接 32 | 33 | 2.左连接:left join 或 left outer join 34 | (1)左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。 35 | (2)sql 语句 36 | ``` 37 | select * from table1 left join table2 on table1.id=table2.id 38 | -------------结果------------- 39 | idnameidscore 40 | ------------------------------ 41 | 1lee190 42 | 2zhang2100 43 | 4wangNULLNULL 44 | ------------------------------ 45 | ``` 46 | 注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示 47 | 48 | 3.右连接:right join 或 right outer join 49 | (1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。 50 | (2)sql 语句 51 | ``` 52 | select * from table1 right join table2 on table1.id=table2.id 53 | -------------结果------------- 54 | idnameidscore 55 | ------------------------------ 56 | 1lee190 57 | 2zhang2100 58 | NULLNULL370 59 | ------------------------------ 60 | ``` 61 | 注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示 62 | 63 | 4.完整外部联接:full join 或 full outer join 64 | (1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。 65 | (2)sql 语句 66 | ``` 67 | select * from table1 full join table2 on table1.id=table2.id 68 | -------------结果------------- 69 | idnameidscore 70 | ------------------------------ 71 | 1lee190 72 | 2zhang2100 73 | 4wangNULLNULL 74 | NULLNULL370 75 | ------------------------------ 76 | ``` 77 | 注释:返回左右连接的和(见上左、右连接) 78 | 79 | 二、内连接 80 | 1.概念:内联接是用比较运算符比较要联接列的值的联接 81 | 82 | 2.内连接:join 或 inner join 83 | 84 | 3.sql 语句 85 | ``` 86 | select * from table1 join table2 on table1.id=table2.id 87 | -------------结果------------- 88 | idnameidscore 89 | ------------------------------ 90 | 1lee190 91 | 2zhang2100 92 | ------------------------------ 93 | ``` 94 | 注释:只返回符合条件的table1和table2的列 95 | 96 | 4.等价(与下列执行效果相同) 97 | ``` 98 | A:select a.*,b.* from table1 a,table2 b where a.id=b.id 99 | B:select * from table1 cross join table2 where table1.id=table2.id (注:cross join后加条件只能用where,不能用on) 100 | ``` 101 | 三、交叉连接(完全) 102 | 103 | 1.概念:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生3*3=9条记录) 104 | 105 | 2.交叉连接:cross join (不带条件where...) 106 | 107 | 3.sql语句 108 | ``` 109 | select * from table1 cross join table2 110 | -------------结果------------- 111 | idnameidscore 112 | ------------------------------ 113 | 1lee190 114 | 2zhang190 115 | 4wang190 116 | 1lee2100 117 | 2zhang2100 118 | 4wang2100 119 | 1lee370 120 | 2zhang370 121 | 4wang370 122 | ------------------------------ 123 | ``` 124 | 注释:返回3*3=9条记录,即笛卡尔积 125 | 126 | 4.等价(与下列执行效果相同) 127 | ``` 128 | A:select * from table1,table2 129 | ``` -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ## 2019年最新总结,阿里,腾讯,百度,美团,头条等技术面试题目,以及答案,专家出题人分析汇总。持续更新中。 3 | 4 | * [阿里篇](#1) 5 | * [华为篇](#2) 6 | * [百度篇](#3) 7 | * [腾讯篇](#4) 8 | * [美团篇](#5) 9 | * [头条篇](#6) 10 | * [滴滴篇](#7) 11 | * [京东篇](#8) 12 | * [MySQL篇](#9) 13 | * [Redis篇](#10) 14 | * [MongDB篇](#11) 15 | * [Zookeeper篇](#12) 16 | * [Nginx篇](#13) 17 | * [算法篇](#14) 18 | * [内存篇](#15) 19 | * [cpu篇](#16) 20 | * [磁盘篇](#17) 21 | * [网络通信篇](#18) 22 | * [安全篇](#19) 23 | * [并发篇](#20) 24 | 25 |

阿里篇

26 | 27 | --- 28 | 29 | ##### 1.1.1 如何实现一个高效的单向链表逆序输出? 30 | 31 | ##### 1.1.2 已知sqrt(2)约等于1.414,要求不用数学库,求sqrt(2)精确到小数点后10位 32 | 33 | ##### 1.1.3 给定一个二叉搜索树(BST),找到树中第 K 小的节点 34 | 35 | ##### 1.1.4 LRU缓存机制 36 | 37 | ##### 1.1.5 关于epoll和select的区别,以下哪些说法是正确的 38 | 39 | ##### 1.1.6 从innodb的索引结构分析,为什么索引的 key 长度不能太长 40 | 41 | ##### 1.1.7 MySQL的数据如何恢复到任意时间点? 42 | 43 | ##### 1.1.8 NFS 和 SMB 是最常见的两种 NAS(Network Attached Storage)协议,当把一个文件系统同时通过 NFS 和 SMB 协议共享给多个主机访问时,以下哪些说法是错误的 44 | 45 | ##### 1.1.9 输入 ping IP 后敲回车,发包前会发生什么? 46 | 47 | ##### 1.2.0 请解释下为什么鹿晗发布恋情的时候,微博系统会崩溃,如何解决? 48 | 49 | ##### 1.2.1 现有一批邮件需要发送给订阅顾客,且有一个集群(集群的节点数不定,会动态扩容缩容)来负责具体的邮件发送任务,如何让系统尽快地完成发送? 50 | 51 | ##### 1.2.2 有一批气象观测站,现需要获取这些站点的观测数据,并存储到 Hive 中。但是气象局只提供了 api 查询,每次只能查询单个观测点。那么如果能够方便快速地获取到所有的观测点的数据? 52 | 53 | ##### 1.2.3 如何实现两金额数据相加(最多小数点两位) 54 | 55 | ##### 1.2.4 关于并行计算的一些基础开放问题 56 | 57 | ##### 1.2.5 请计算XILINX公司VU9P芯片的算力相当于多少TOPS,给出计算过程与公式 58 | 59 | ##### 1.2.6 一颗现代处理器,每秒大概可以执行多少条简单的MOV指令,有哪些主要的影响因素 60 | 61 | ##### 1.2.7 请分析 MaxCompute 产品与分布式技术的关系、当前大数据计算平台类产品的市场现状和发展趋势 62 | 63 | ##### 1.2.8 对大数据平台中的元数据管理是怎么理解的,元数据收集管理体系是怎么样的,会对大数据应用有什么样的影响 64 | 65 | ##### 1.2.9 你理解常见如阿里,和友商大数据平台的技术体系差异以及发展趋势和技术瓶颈,在存储和计算两个方面进行概述 66 | 67 | ##### 1.3.0 在云计算大数据处理场景中,每天运行着成千上万的任务,每个任务都要进行 IO 读写。存储系统为了更好的服务,经常会保证高优先级的任务优先执行。当多个作业或用户访问存储系统时,如何保证优先级和公平性 68 | 69 | ##### 1.3.1 最大频率栈 70 | 71 | ##### 1.3.2 给定一个链表,删除链表的倒数第N个节点,并且返回链表的头结点 72 | 73 | ##### 1.3.3 如果让你设计一个通用的、支持各种数据库秒级备份和恢复的系统,你会如何设计 74 | 75 | ##### 1.3.4 如果让你来设计一个支持数据库、NOSQL 和大数据之间数据实时流动的数据流及处理的系统,你会考虑哪些问题?如何设计? 76 | 77 | ##### 1.3.5 给定一个整数数组和一个整数,返回两个数组的索引,这两个索引指向的数字的加和等于指定的整数。需要最优的算法,分析算法的空间和时间复杂度 78 | 79 | ##### 1.3.6 假如给你一个新产品,你将从哪些方面来保障它的质量? 80 | 81 | ##### 1.3.7 请评估一下程序的执行结果? 82 | 83 |
84 | 85 |

华为篇

86 | 87 | --- 88 | ##### 2.1.0 static有什么用途?(请至少说明两种) 89 | 90 | ###### 2.1.1 引用与指针有什么区别? 91 | 92 | ##### 2.1.2 描述实时系统的基本特性 93 | 94 | ##### 2.1.3 全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 95 | 96 | ##### 2.1.4 什么是平衡二叉树? 97 | 98 | ##### 2.1.5 堆栈溢出一般是由什么原因导致的? 99 | 100 | ##### 2.1.6 什么函数不能声明为虚函数? 101 | 102 | ##### 2.1.7 冒泡排序算法的时间复杂度是什么? 103 | 104 | ##### 2.1.8 写出float x 与“零值”比较的if语句 105 | 106 | ##### 2.1.9 Internet采用哪种网络协议?该协议的主要层次结构? 107 | 108 | ##### 2.2.0 Internet物理地址和IP地址转换采用什么协议? 109 | 110 | ##### 2.2.1 IP地址的编码分为哪俩部分? 111 | 112 | ##### 2.2.2 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。 113 | 114 | ##### 2.2.3 不能做switch()的参数类型是 115 | 116 | ##### 2.2.4 int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。 117 | 118 | ##### 2.2.5 写一个程序, 要求功能:求出用1,2,5这三个数不同个数组合的和为100的组合个数 119 | 120 | ##### 2.2.6 实现一个函数,把一个字符串中的字符从小写转为大写 121 | 122 | ##### 2.2.7 随机输入一个数,判断它是不是对称数(回文数)(如3,121,12321,45254)。不能用字符串库函数 123 | 124 | ##### 2.2.8 求2~2000的所有素数.有足够的内存,要求尽量快 125 | 126 | ##### 2.2.9 A,B,C,D四个进程,A向buf里面写数据,B,C,D向buf里面读数据,当A写完,且B,C,D都读一次后,A才能再写。用P,V操作实现。 127 | 128 | ##### 2.3.0 将单向链表reverse,如ABCD变成DCBA,只能搜索链表一次。 129 | 130 | ##### 2.3.1 将二叉树的两个孩子换位置,即左变右,右变左。不能用递规。 131 | 132 | ##### 2.3.2 以下属于物理层的设备是? 133 | 134 | ##### 2.3.3 在以太网中,是根据()地址来区分不同的设备的? 135 | 136 | ##### 2.3.4 以下为传输层协议的是? 137 | 138 | ##### 2.3.5 以下对MAC地址描述正确的是? 139 | 140 | ##### 2.3.6 以下属于数据链路层功能的是? 141 | 142 | ##### 2.3.7 IEEE802.3u标准是指? 143 | 144 | ##### 2.3.8 如果要将两计算机通过双绞线直接连接,正确的线序是? 145 | 146 | ##### 2.3.9 在V.35和V.24规程中,控制信号RTS表示? 147 | 148 | ##### 2.4.0 路由器作为网络互连设备,必须具备以下哪些特点? 149 | 150 | ##### 2.4.1 路由器的作用有? 151 | 152 | ##### 2.4.2 调用上一条历史命令的快捷键是? 153 | 154 | ##### 2.4.3 交换机工作在OSI七层的哪一层? 155 | 156 | ##### 2.4.4 以下对CSMA/CD描述正确的是? 157 | 158 | ##### 2.4.5 以下对STORE ANDFORWARD描述正确的是? 159 | 160 | ##### 2.4.6 以下对交换机工作方式描述正确的是? 161 | 162 | ##### 2.4.7 VLAN的主要作用有? 163 | 164 | ##### 2.4.8 在交换机中用户权限分为几个级别? 165 | 166 | ##### 2.4.9 在路由器的配置过程中查询以S开头所有命令的方法是? 167 | 168 | ##### 2.5.0 第一次配置路由器时可以使用的方法为? 169 | 170 | ##### 2.5.1 在何种状态下可以为路由器改名? 171 | 172 | ##### 2.5.2 某公司申请到一个C类IP地址,但要连接6个的子公司,最大的一个子公司有 26台计算机,每个子公司在一个网段中,则子网掩码应设为? 173 | 174 | ##### 2.5.3 与10.110.12.29mask 255.255.255.224属于同一网段的主机IP地址是? 175 | 176 | ##### 2.5.4 ARP协议的作用是? 177 | 178 | ##### 2.5.5 当路由器接收的IP报文的TTL值等于1时,采取的策略是? 179 | 180 | ##### 2.5.6 在NetWare 网络中,客户需要访问某个类型的服务器时,首先要发送一个 ()广播报文来寻找服务器? 181 | 182 | ##### 2.5.7 IPX地址网络地址有( )个字节? 183 | 184 | ##### 2.5.8 对于帧中继描述正确的是? 185 | 186 | ##### 2.5.9 对于INVERSE ARP的描述正确的是? 187 | 188 |
189 | 190 |

百度篇

191 | 192 | --- 193 | 194 | ##### 3.1.0 在函数内定义一个字符数组,用gets函数输入字符串的时候,如果输入越界,为什么程序会崩溃? 195 | 196 | ##### 3.1.1 C++中引用与指针的区别 197 | 198 | ##### 3.1.2 C/C++程序的内存分区 199 | 200 | ##### 3.1.3 快速排序的思想、时间复杂度、实现以及优化方法 201 | 202 | ##### 3.1.4 IO模型——IO多路复用机制? 203 | 204 | ##### 3.1.5 常用的Linux命令 205 | 206 | ##### 3.1.6 C中变量的存储类型有哪些? 207 | 208 | ##### 3.1.7 动态规划的本质 209 | 210 | ##### 3.1.8 实践中如何优化MySQL? 211 | 212 | ##### 3.1.9 什么情况下设置了索引但无法使用? 213 | 214 | ##### 3.2.0 SQL语句的优化 215 | 216 | ##### 3.2.1 数据库索引的底层实现原理和优化 217 | 218 | ##### 3.2.2 HTTP和HTTPS的主要区别? 219 | 220 | ##### 3.2.3 如何设计一个高并发的系统? 221 | 222 | ##### 3.2.4 两条相交的单向链表,如何求他们的第一个公共节点? 223 | 224 | ##### 3.2.5 求单向局部循环链表的环入口? 225 | 226 | ##### 3.2.6 IP地址如何在数据库中存储? 227 | 228 | ##### 3.2.7 new/delete和malloc/free的底层实现? 229 | 230 | ##### 3.2.8 overload、override、overwrite的介绍? 231 | 232 | ##### 3.2.9 小端/大端机器? 233 | 234 | ##### 3.3.0 守护进程 235 | 236 | ##### 3.3.1 多线程的优缺点 237 | 238 | ##### 3.3.2 长连接与短连接 239 | 240 | ##### 3.3.3 二分图应用于最佳匹配问题(游客对房间的满意度之和最大问题) 241 | 242 | ##### 3.3.4 class与struct的区别? 243 | 244 | ##### 3.3.5 虚函数和纯虚函数 245 | 246 | ##### 3.3.6 menset()函数 247 | 248 | ##### 3.3.7 实现一个函数,对一个正整数n,算得到1需要的最少操作次数。操作规则为:如果n为偶数,将其除以2;如果n为奇数,可以加1或减1;一直处理下去。 249 | 250 | ##### 3.3.8 找到满足条件的数组 251 | 252 | ##### 3.3.9 一个大的含有50M个URL的记录,一个小的含有500个URL的记录,找出两个记录里相同的URL 253 | 254 | ##### 3.4.0 海量日志数据,提取出某日访问百度次数最多的那个IP 255 | 256 | ##### 3.4.1 有10个文件,每个文件1G,每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。如何按照query的频度排序? 257 | 258 | ##### 3.4.2 蚂蚁爬杆问题 259 | 260 | ##### 3.4.3 当在浏览器中输入一个url后回车,后台发生了什么?比如输入url后,你看到了百度的首页,那么这一切是如何发生的呢? 261 | 262 | ##### 3.4.4 判断两棵树是否相等,请实现两棵树是否相等的比较,相等返回1,否则返回其他值,并说明算法复杂度 263 | 264 | ##### 3.4.5 三个警察和三个囚徒的过河问题 265 | 266 | ##### 3.4.6 从300万字符串中找到最热门的10条 267 | 268 | ##### 3.4.7 如何找出字典中的兄弟单词。给定一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给定一个字典,用户输入一个单词,如何根据字典找出这个单词有多少个兄弟单词? 269 | 270 | ##### 3.4.8 找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数。 271 | 272 | ##### 3.4.9 找出被修改过的数字 273 | 274 | ##### 3.5.0 设计DNS服务器中cache的数据结构。要求设计一个DNS的Cache结构,要求能够满足每秒5000以上的查询,满足IP数据的快速插入,查询的速度要快。(题目还给出了一系列的数据,比如:站点数总共为5000万,IP地址有1000万,等等) 275 | 276 | ##### 3.5.1 找出给定字符串对应的序号 277 | 278 | ##### 3.5.2 找出第k大的数字所在的位置。写一段程序,找出数组中第k大小的数,输出数所在的位置。例如{2,4,3,4,7}中,第一大的数是7,位置在4。第二大、第三大的数都是4,位置在1、3随便输出哪一个均可。 279 | 280 | ##### 3.5.3 给40亿个不重复的unsigned int的整数,没排过序的,然后再给几个数,如何快速判断这几个数是否在那40亿个数当中? 281 | 282 | ##### 3.5.4 在一个文件中有10G个整数,乱序排列,要求找出中位数。内存限制为2G。 283 | 284 | ##### 3.5.5 时分秒针在一天之类重合多少次?(24小时) 285 | 286 | ##### 3.5.6 将多个集合合并成没有交集的集合。 287 | 288 | ##### 3.5.7 平面内有11个点,由它们连成48条不同的直线,由这些点可连成多少个三角形? 289 | 290 |
291 | 292 |

腾讯篇

293 | 294 | --- 295 | 296 | #### Java基础 297 | 298 | ##### 4.1.0 JAVA中的几种基本数据类型是什么,各自占用多少字节。 299 | 300 | ##### 4.1.1 String类能被继承吗,为什么。 301 | 302 | ##### 4.1.2 String,Stringbuffer,StringBuilder的区别。 303 | 304 | ##### 4.1.3 ArrayList和LinkedList有什么区别。 305 | 306 | ##### 4.1.4 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序。 307 | 308 | ##### 4.1.5 用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。 309 | 310 | ##### 4.1.6 JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。 311 | 312 | ##### 4.1.7 有没有有顺序的Map实现类,如果有,他们是怎么保证有序的。 313 | 314 | ##### 4.1.8 抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。 315 | 316 | ##### 4.1.9 继承和聚合的区别在哪。 317 | 318 | ##### 4.2.0 IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型。 319 | 320 | ##### 4.2.1 反射的原理,反射创建类实例的三种方式是什么。 321 | 322 | ##### 4.2.2 反射中,Class.forName和ClassLoader区别 。 323 | 324 | ##### 4.2.3 描述动态代理的几种实现方式,分别说出相应的优缺点。 325 | 326 | ##### 4.2.4 动态代理与cglib实现的区别。 327 | 328 | ##### 4.2.5 为什么CGlib方式可以对接口实现代理。 329 | 330 | ##### 4.2.6 final的用途。 331 | 332 | ##### 4.2.7 写出三种单例模式实现 。 333 | 334 | ##### 4.2.8 如何在父类中为子类自动完成所有的hashcode和equals实现?这么做有何优劣。 335 | 336 | ##### 4.2.9 请结合OO设计理念,谈谈访问修饰符public、private、protected、default在应用设计中的作用。 337 | 338 | ##### 4.3.0 深拷贝和浅拷贝区别。 339 | 340 | ##### 4.3.1 数组和链表数据结构描述,各自的时间复杂度。 341 | 342 | ##### 4.3.2 error和exception的区别,CheckedException,RuntimeException的区别。 343 | 344 | ##### 4.3.3 请列出5个运行时异常。 345 | 346 | ##### 4.3.4 在自己的代码中,如果创建一个java.lang.String类,这个类是否可以被类加载器加载?为什么。 347 | 348 | ##### 4.3.5 说一说你对java.lang.Object对象中hashCode和equals方法的理解。在什么场景下需要重新实现这两个方法。 349 | 350 | ##### 4.3.6 在jdk1.5中,引入了泛型,泛型的存在是用来解决什么问题。 351 | 352 | ##### 4.3.7 这样的a.hashcode() 有什么用,与a.equals(b)有什么关系。 353 | 354 | ##### 4.3.8 有没有可能2个不相等的对象有相同的hashcode。 355 | 356 | ##### 4.3.9 Java中的HashSet内部是如何工作的。 357 | 358 | ##### 4.4.0 什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。 359 | 360 | ##### 4.4.1 java8的新特性。 361 | 362 | #### JVM 363 | 364 | ##### 4.4.2 什么情况下会发生栈内存溢出。 365 | 366 | ##### 4.4.3 JVM的内存结构,Eden和Survivor比例。 367 | 368 | ##### 4.4.4 JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor。 369 | 370 | ##### 4.4.5 JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数。 371 | 372 | ##### 4.4.6 你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1,包括原理,流程,优缺点。 373 | 374 | ##### 4.4.7 垃圾回收算法的实现原理。 375 | 376 | ##### 4.4.8 当出现了内存溢出,你怎么排错。 377 | 378 | ##### 4.4.9 JVM内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存等。 379 | 380 | ##### 4.5.0 简单说说你了解的类加载器,可以打破双亲委派么,怎么打破。 381 | 382 | ##### 4.5.1 讲讲JAVA的反射机制。 383 | 384 | ##### 4.5.2 你们线上应用的JVM参数有哪些。 385 | 386 | ##### 4.5.3 g1和cms区别,吞吐量优先和响应优先的垃圾收集器选择。 387 | 388 | ##### 4.5.4 怎么打出线程栈信息。 389 | 390 | #### 开源框架 391 | 392 | ##### 4.5.5 简单讲讲tomcat结构,以及其类加载器流程,线程模型等。 393 | 394 | ##### 4.5.6 tomcat如何调优,涉及哪些参数 。 395 | 396 | ##### 4.5.7 讲讲Spring加载流程。 397 | 398 | ##### 4.5.8 Spring AOP的实现原理。 399 | 400 | ##### 4.5.9 讲讲Spring事务的传播属性。 401 | 402 | ##### 4.6.0 Spring如何管理事务的。 403 | 404 | ##### 4.6.1 Spring怎么配置事务(具体说出一些关键的xml 元素)。 405 | 406 | ##### 4.6.2 说说你对Spring的理解,非单例注入的原理?它的生命周期?循环注入的原理,aop的实现原理,说说aop中的几个术语,它们是怎么相互工作的。 407 | 408 | ##### 4.6.3 Springmvc 中DispatcherServlet初始化过程。 409 | 410 | ##### 4.6.4 netty的线程模型,netty如何基于reactor模型上实现的。 411 | 412 | ##### 4.6.5 为什么选择netty。 413 | 414 | ##### 4.6.6 什么是TCP粘包,拆包。解决方式是什么。 415 | 416 | ##### 4.6.7 netty的fashwheeltimer的用法,实现原理,是否出现过调用不够准时,怎么解决。 417 | 418 | ##### 4.6.8 netty的心跳处理在弱网下怎么办。 419 | 420 | ##### 4.6.9 netty的通讯协议是什么样的。 421 | 422 | ##### 4.7.0 springmvc用到的注解,作用是什么,原理。 423 | 424 | ##### 4.7.1 springboot启动机制。 425 | 426 | #### 操作系统 427 | 428 | ##### 4.7.2 Linux系统下你关注过哪些内核参数,说说你知道的。 429 | 430 | ##### 4.7.3 Linux下IO模型有几种,各自的含义是什么。 431 | 432 | ##### 4.7.4 epoll和poll有什么区别。 433 | 434 | ##### 4.7.5 平时用到哪些Linux命令。 435 | 436 | ##### 4.7.6 用一行命令查看文件的最后五行。 437 | 438 | ##### 4.7.7 用一行命令输出正在运行的java进程。 439 | 440 | ##### 4.7.8 介绍下你理解的操作系统中线程切换过程。 441 | 442 | ##### 4.7.9 进程和线程的区别。 443 | 444 | ##### 4.8.0 top 命令之后有哪些内容,有什么作用。 445 | 446 | ##### 4.8.1 线上CPU爆高,请问你如何找到问题所在。 447 | 448 |
449 | 450 |

美团篇

451 | 452 | --- 453 | 454 | ##### 5.1.0 java虚拟机内存模型 455 | 456 | ##### 5.1.1 内存溢出一般发生在哪个区?永久代会不会导致内存溢出? 457 | 458 | ##### 5.1.2 动态加载类的框架了解哪些? 459 | 460 | ##### 5.1.3 动态代理一般有哪几种实现方式?动态代理的应用场景有哪些? 461 | 462 | ##### 5.1.4 栈会不会溢出?栈溢出一般抛什么异常?jvm在哪里设置栈的大小?设置的参数是什么? 463 | 464 | ##### 5.1.5 用过哪些命令查看jvm的状态、堆栈信息? 465 | 466 | ##### 5.1.6 jvm的垃圾回收机制? 467 | 468 | ##### 5.1.7 java类加载机制?如何实现自定义类加载器?findClass与loadClass的区别? 469 | 470 | ##### 5.1.8 String、StringBuffer、StringBuilder的区别?对应的使用场景? 471 | 472 | ##### 5.1.9 如何实现不可变的类? 473 | 474 | ##### 5.2.0 浅复制和深复制?怎样实现深复制? 475 | 476 | ##### 5.2.1 HashMap、HashTable、ConcurrentHashMap的区别? 477 | 478 | ##### 5.2.2 CAS是一种什么样的同步机制? 479 | 480 | ##### 5.2.3 NIO的原理,包括哪几个组件? 481 | 482 | ##### 5.2.4 简单介绍一下java的反射机制?反射在哪些地方有应用场景? 483 | 484 | ##### 5.2.5 spring加载bean的流程? 485 | 486 | ##### 5.2.6 java线程池?线程池构造函数的几个参数含义?keepAliveTime解释一下? 487 | 488 | ##### 5.2.7 一个接口,要去调用另外5个接口,每一个接口都会返回数据给这个调用接口,调用接口要对数据进行合并并返回给上层。这样一种场景可能用到并发包下的哪些类?你会怎么去实现这样的业务场景? 489 | 490 | ##### 5.2.8 CountDownLatch和CyclicBarrier的区别? 491 | 492 | ##### 5.2.9 线程加锁有哪些方式?synchronized和lock的区别? 493 | 494 | ##### 5.3.0 volatile关键字的作用?为什么使用AtomicLong而不使用Long?AtomicLong的底层是怎么实现的? 495 | 496 | ##### 5.3.1 mysql的存储引擎有哪几种? 497 | 498 | ##### 5.3.2 sql优化有哪些着手点?组合索引的最左前缀原则的含义? 499 | 500 | ##### 5.3.3 springmvc处理请求的流程? 501 | 502 | ##### 5.3.4 spring的事务怎么使用?事务回滚?自定义异常? 503 | 504 | ##### 5.3.5 脏读?幻读? 505 | 506 | ##### 5.3.6 tcp四次挥手的过程?TIME_WAIT为什么至少设置两倍的MSL时间? 507 | 508 | ##### 5.3.7 get和post请求的区别? 509 | 510 | ##### 5.3.8 cookie和session的请求? 511 | 512 | ##### 5.3.9 了解哪些开源的中间件?缓存?消息?分布式框架? 513 | 514 | ##### 5.4.0 用到过哪些设计模式?单例模式的实现? 515 | 516 | ##### 5.4.1 数据库的事务实现原理、操作过程、如何做到事物之间的独立性等问题 517 | 518 | ##### 5.4.2 数据库的脏读,幻读,不可重复读出现的原因原理,解决办法 519 | 520 | ##### 5.4.3 数据库的隔离级别、MVCC 521 | 522 | ##### 5.4.4 乐观锁、悲观锁、互斥锁、读写锁的原理实现与区别 523 | 524 | ##### 5.4.5 线程的生命周期 525 | 526 | ##### 5.4.6 一致性hash算法原理与应用 527 | 528 | ##### 5.4.7 CAP原则 529 | 530 | ##### 5.4.8 CAS操作 531 | 532 | ##### 5.4.9 分布式raft算法 533 | 534 |
535 | 536 |

头条篇

537 | 538 | --- 539 | 540 | ##### 6.1.0 5个人去一个海岛寻宝,最后一共找到了100枚金币。他们约定了一个分配方案。 541 | 542 | ##### 6.1.1 给你一个有序整数数组,数组中的数可以是正数、负数、零,请实现一个函数,这个函数返回一个整数:返回这个数组所有数的平方值中有多少种不同的取值。 543 | 544 | ##### 6.1.2 一个环有10个节点,编号0-9。从0点出发,走N步又能回到0点,共有多少种走法? 545 | 546 | ##### 6.1.3 一个乱序数组,求第K大的数。排序方式使用字典序。 547 | 548 | ##### 6.1.4 一棵二叉树,求最大通路长度。(即最大左右子树高度之和) 549 | 550 | ##### 6.1.5 进程和线程的区别,使用线程真的能节省时间? 551 | 552 | ##### 6.1.6 go协程的调度方式,使用协程真的能节省时间? 553 | 554 | ##### 6.1.7 水平触发边沿触发的区别?在边沿触发下,一个socket有500的数据,已读取200然后不再处理,是不是剩下的300就永远无法读取? 555 | 556 | ##### 6.1.8 有函数如下,输入1,返回什么? 557 | 558 | ##### 6.1.9 设计http协议,A端发送 AAAA,至少让B端知道AAAA已发送完成。 559 | 560 | ##### 6.2.0 流量总入口为api_gateway,api_gateway挂了会导致全部挂挂,用什么机制增大可用性? 561 | 562 | ##### 6.2.1 mysql为什么要用b+树,不用平衡二叉树做索引结构? 563 | 564 | ##### 6.2.2 创建数据库索引应该怎么考虑? 565 | 566 | ##### 6.2.3 使用int 做primary key和使用string 有什么优劣? 567 | 568 | ##### 6.2.4 数据库分表的方法? 569 | 570 | ##### 6.2.5 表结构,订单纪录如下,写一个语句,求卖的最好的 top 10 product_id。 571 | 572 | ##### 6.2.6 微服务,A服务请求B服务B1接口,B1接口又请求A服务A2接口。会不会有问题? 573 | 574 | ##### 6.2.7 不使用高级工具,只使用Linux自带的工具,你会如何debug? 575 | 576 | ##### 6.2.8 如何预估一个mysql语句的性能? 577 | 578 | ##### 6.2.9 go函数中,返回值未命名,发生了panic,但是在函数内recover了。函数返回什么值? 579 | 580 | ##### 6.3.0 socket中,在tcp协议层面,数据分为10个报文发放。1-7次很顺利,第8次丢失。这次通信一定失败吗?如果第8次数据会重发,那在接收端是不是:先读取到1-7次的数据,然后读取到8-10次的数据?还是9-10次的数据会先到达? 581 | 582 | ##### 6.3.1 free -h,buffers 和cached有什么不同 583 | 584 | ##### 6.3.2 后台进程有什么特点,如果要你设计一个进程是后台进程,你会考虑什么 585 | 586 | ##### 6.3.3 僵尸进程是什么,如果产生一个僵尸进程,如何查找僵尸进程 587 | 588 | ##### 6.3.4 孤儿进程是什么 589 | 590 | ##### 6.3.5 一个进程有20个线程,在某个线程中调用fork,新的进程会有20个线程吗? 591 | 592 | ##### 6.3.6 tcp/ip 流量控制和拥塞控制 593 | 594 | ##### 6.3.7 301/302有什么区别?应用上有什么异同。 595 | 596 | ##### 6.3.8 50X相关错误码的内涵是什么? 597 | 598 | ##### 6.3.9 close wait和time wait是什么?如何排查?有什么意义? 599 | 600 | ##### 6.4.0 http req和resp的中数据有哪些 601 | 602 | ##### 6.4.1 什么是连接的半打开,半关闭状态 603 | 604 | ##### 6.4.2 假如一个业务依赖单点redis,此redis故障将导致业务不可用,如何改进 605 | 606 | ##### 6.4.3 redis sharding有哪些做法 607 | 608 | ##### 6.4.4 当大量数据要求用redis保存,单机单点难以满足需要,设计(换寻找)一个负载均衡的方案 609 | ##### 6.4.5 当redis 采用hash做sharding,现在有8个节点,负载方案是 pos = hash(key) % 8,然后保存在pos节点上。这样做有什么好处坏处?当8个节点要扩充到10个节点,应该怎么办?有什么更方便扩充的方案吗?(一致性hash, presharding) 610 | 611 | ##### 6.4.6 如何保证redis和数据库数据的一致性。比如用户名既保存在数据库,又保存在redis做缓存。有如下操作 update_db(username); update_redis(username)。但是执行update_db后故障,update_redis没有执行。有什么简单办法解决这个问题。 612 | 613 | 614 |

滴滴篇

615 | 616 | --- 617 | 618 | ##### 7.1.0 B+树、B-树的区别? 619 | 620 | ##### 7.1.1 数据库隔离级别,幻读和不可重复读的区别? 621 | 622 | ##### 7.1.2 有hell, well, hello, world等字符串组,现在问能否拼接成helloworld,代码实现。 623 | 624 | ##### 7.1.3 快排算法实现 625 | 626 | ##### 7.1.4 线程安全的单例模式 627 | 628 | ##### 7.1.5 25匹马赛跑,有一个赛场,只有五个赛道,没有计时器,只能通过目测来记录快慢,求出第三3快的马要多少场比赛? 629 | 630 | ##### 7.1.6 kmp算法next数组的求解思路 631 | 632 | ##### 7.1.7 数组中有三个数字出现超过3/4,求这三个数字? 633 | 634 | ##### 7.1.8 1到n+2个数组中缺了两个数,如何用O(n)时间,O(1)空间找到这两个数字。 635 | 636 | ##### 7.1.9 一条线段长为1,随机选两个点,将改线段分为三段,三段能成三角形的概率是多少? 637 | 638 | ##### 7.2.0 有一个教授,他三个学生,脑袋背后分别各写了一个数字,其中一个数字是另外两个数字的和,经过几轮后,有一个学生猜出了自己的数字请问是什么原因? 639 | 640 | ##### 7.2.1 B+树做索引时,B+树通常高度为多少层?要参考哪些条件? 641 | 642 |
643 | 644 |

京东篇

645 | 646 | --- 647 | 648 | ##### 8.1.0 一般sql注入怎么发现触点的,从源码阐述sqlmap如何测试注入点的。 649 | 650 | ##### 8.1.1 masscan扫描端口时靠什么检测,为什么这么快? 请详述. 651 | 652 | ##### 8.1.2 你写过哪些小工具,你为你使用过的工具做过什么修改. 653 | 654 | ##### 8.1.3 如何提高采用python编写的扫描速度,谈谈对GIL锁的了解. 655 | 656 | ##### 8.1.4 你觉得你发现的那个漏洞影响比较大. 657 | 658 | ##### 8.1.5 常见的web漏洞有哪些. 659 | 660 | ##### 8.1.6 有没有玩过硬件安全,研究程度如何. 661 | 662 | ##### 8.1.7 反爬虫,如果是你如何进行反爬虫,如何绕过反爬措施。 使用无头浏览器被检测到了,如何绕过 663 | 664 | ##### 8.1.8 nmap扫描如何进行扫描。发包与协议,握手和不握手,哪些协议握手,哪些不握手. 如何不直接接触目标服务器探测对方端口是否开放 665 | 666 | ##### 8.1.9 有没有自己编写过yara扫描模块,如果要解决扫描{k1:v1, k2:v2, k3:v3} ,保证同时在k1中的v1里出现特定值,k2中出现v2特定值,以及k3,v3。怎么实现 667 | 668 | ##### 8.2.0 xss什么原理,如何自己实现一个beef类似的xss平台. 既然这样实现,面临的跨域如何解决? 669 | 670 | ##### 8.2.1 ip 频率限制, ip信誉度模型? 671 | 672 | ##### 8.2.2 SCTP协议是什么?如何使用 SCTP 优化网络? 673 | 674 |
675 | 676 |

mysql篇

677 | 678 | --- 679 | 680 | ##### 9.1.0 主键 超键 候选键 外键 681 | 682 | ##### 9.1.1 数据库事务的四个特性及含义 683 | 684 | ##### 9.1.2 视图的作用,视图可以更改么? 685 | 686 | ##### 9.1.3 drop,delete与truncate的区别 687 | 688 | ##### 9.1.4 索引的工作原理及其种类 689 | 690 | ##### 9.1.5 连接的种类 691 | 692 | ##### 9.1.6 数据库范式 693 | 694 | ##### 9.1.7 数据库优化的思路 695 | 696 | ##### 9.1.8 存储过程与触发器的区别 697 | 698 | 699 |
700 | 701 | 702 |

redis篇

703 | 704 | --- 705 | ##### 10.1.0 使用Redis有哪些好处? 706 | 707 | ##### 10.1.1 redis相比memcached有哪些优势? 708 | 709 | ##### 10.1.2 redis常见性能问题和解决方案 710 | 711 | ##### 10.1.3 MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据 712 | 713 | ##### 10.1.4 Memcache与Redis的区别都有哪些? 714 | 715 | ##### 10.1.5 Redis 常见的性能问题都有哪些?如何解决? 716 | 717 | ##### 10.1.6 redis 最适合的场景 718 | 719 | ##### [10.1.7 Redis的同步机制了解么?](https://github.com/0voice/interview_internal_reference/blob/master/3.1.7%20Redis%E7%9A%84%E5%90%8C%E6%AD%A5%E6%9C%BA%E5%88%B6%E4%BA%86%E8%A7%A3%E4%B9%88%EF%BC%9F.md) 720 | 721 | ##### 10.1.8 是否使用过Redis集群,集群的原理是什么? 722 | 723 | ##### 10.1.9 redis集群如何保证一致性? 724 | 725 | 726 |
727 | 728 |

MongDB篇

729 | 730 | --- 731 | ##### 11.1.0 什么是MongoDB? 732 | 733 | ##### 11.1.1 MongoDB是由哪种语言写的? 734 | 735 | ##### 11.1.2 MongoDB的优势有哪些? 736 | 737 | ##### 11.1.3 什么是数据库? 738 | 739 | ##### 11.1.4 什么是集合? 740 | 741 | ##### 11.1.5 什么是文档? 742 | 743 | ##### 11.1.6 MongoDB和关系型数据库术语对比图 744 | 745 | ##### 11.1.7 什么是“mongod”? 746 | 747 | ##### 11.1.8 “mongod”参数有什么? 748 | 749 | ##### 11.1.9 什么是“mongo”? 750 | 751 | ##### 11.2.0 MongoDB哪个命令可以切换数据库? 752 | 753 | ##### 11.2.1 什么是非关系型数据库? 754 | 755 | ##### 11.2.2 非关系型数据库有哪些类型? 756 | 757 | ##### 11.2.3 为什么用MOngoDB? 758 | 759 | ##### 11.2.4 在哪些场景使用MongoDB? 760 | 761 | ##### 11.2.5 MongoDB中的命名空间是什么意思? 762 | 763 | ##### 11.2.6 哪些语言支持MongoDB? 764 | 765 | ##### 11.2.7 在MongoDB中如何创建一个新的数据库? 766 | 767 | ##### 11.2.8 在MongoDB中如何查看数据库列表? 768 | 769 | ##### 11.2.9 MongoDB中的分片是什么意思? 770 | 771 | ##### 11.3.0 如何查看使用MongoDB的连接? 772 | 773 | ##### 11.3.1 什么是复制? 774 | 775 | ##### 11.3.2 在MongoDB中如何在集合中插入一个文档? 776 | 777 | ##### 11.3.3 在MongoDB中如何除去一个数据库? 778 | 779 | ##### 11.3.4 在MongoDB中如何创建一个集合? 780 | 781 | ##### 11.3.5 在MongoDB中如何查看一个已经创建的集合? 782 | 783 | ##### 11.3.6 在MongoDB中如何删除一个集合? 784 | 785 | ##### 11.3.7 为什么要在MongoDB中使用分析器? 786 | 787 | ##### 11.3.8 MongoDB支持主键外键关系吗? 788 | 789 | ##### 11.3.9 MongoDB支持哪些数据类型? 790 | 791 | ##### 11.4.0 为什么要在MongoDB中用"Code"数据类型? 792 | 793 | ##### 11.4.1 为什么要在MongoDB中用"Regular Expression"数据类型? 794 | 795 | ##### 11.4.2 为什么在MongoDB中使用"Object ID"数据类型? 796 | 797 | ##### 11.4.3 如何在集合中插入一个文档? 798 | 799 | ##### 11.4.4 “ObjectID”有哪些部分组成? 800 | 801 | ##### 11.4.5 在MongoDb中什么是索引? 802 | 803 | ##### 11.4.6 如何添加索引? 804 | 805 | ##### 11.4.7 MongoDB有哪些可替代产品? 806 | 807 | ##### 11.4.8 如何查询集合中的文档? 808 | 809 | ##### 11.4.9 用什么方法可以格式化输出结果? 810 | 811 | ##### 11.5.0 如何使用"AND"或"OR"条件循环查询集合中的文档? 812 | 813 | ##### 11.5.1 在MongoDB中如何更新数据? 814 | 815 | ##### 11.5.2 如何删除文档? 816 | 817 | ##### 11.5.3 在MongoDB中如何排序? 818 | 819 | ##### 11.5.4 什么是聚合? 820 | 821 | ##### 11.5.5 在MongoDB中什么是副本集? 822 | 823 | ##### 11.5.6 Mongodb存储特性与内部原理? 824 | 825 | 826 |
827 | 828 |

Zookeeper篇

829 | 830 | --- 831 | ##### 12.1.0 zookeeper是什么? 832 | 833 | ##### 12.1.1 zookeeper提供了什么? 834 | 835 | ##### 12.1.2 zookeeper文件系统 836 | 837 | ##### 12.1.3 zookeeper的四种类型的znode 838 | 839 | ##### 12.1.4 zookeeper通知机制 840 | 841 | ##### 12.1.5 zookeeper有哪些应用场景? 842 | 843 | ##### 12.1.6 zk的命名服务 844 | 845 | ##### 12.1.7 zk的配置管理服务 846 | 847 | ##### 12.1.8 zk的集群管理 848 | 849 | ##### 12.1.9 zk的分布式锁 850 | 851 | ##### 12.2.0 zk队列管理 852 | 853 | ##### 12.2.1 zk数据复制 854 | 855 | ##### 12.2.2 zk的工作原理 856 | 857 | ##### 12.2.3 zk是如何保证事物的顺序一致性 858 | 859 | ##### 12.2.4 zk集群下server工作状态 860 | 861 | ##### 12.2.5 zk是如何选举Leader的? 862 | 863 | ##### 12.2.6 zk同步流程 864 | 865 | ##### 12.2.7 分布式通知和协调 866 | 867 | 868 |
869 | 870 |

nginx篇

871 | 872 | --- 873 | ##### 13.1.0 请解释一下什么是Nginx? 874 | 875 | ##### 13.1.1 请列举Nginx的一些特性? 876 | 877 | ##### 13.1.2 请列举Nginx和Apache 之间的不同点? 878 | 879 | ##### 13.1.3 请解释Nginx如何处理HTTP请求。 880 | 881 | ##### 13.1.4 在Nginx中,如何使用未定义的服务器名称来阻止处理请求? 882 | 883 | ##### 13.1.5 使用“反向代理服务器”的优点是什么? 884 | 885 | ##### 13.1.6 请列举Nginx服务器的最佳用途。 886 | 887 | ##### 13.1.7 请解释Nginx服务器上的Master和Worker进程分别是什么? 888 | 889 | ##### 13.1.8 请解释你如何通过不同于80的端口开启Nginx? 890 | 891 | ##### 13.1.9 请解释是否有可能将Nginx的错误替换为502错误、503? 892 | 893 | ##### 13.2.0 在Nginx中,解释如何在URL中保留双斜线? 894 | 895 | ##### 13.2.1 请解释ngx_http_upstream_module的作用是什么? 896 | 897 | ##### 13.2.2 请解释什么是C10K问题,后来是怎么解决的? 898 | 899 | ##### 13.2.3 请陈述stub_status和sub_filter指令的作用是什么? 900 | 901 | ##### 13.2.4 解释Nginx是否支持将请求压缩到上游? 902 | 903 | ##### 13.2.5 解释如何在Nginx中获得当前的时间? 904 | 905 | ##### 13.2.6 用Nginx服务器解释-s的目的是什么? 906 | 907 | ##### 13.2.7 解释如何在Nginx服务器上添加模块? 908 | 909 | ##### 13.2.8 nginx中多个work进程是如何监听同一个端口的?如何处理客户连接的惊群问题? 910 | 911 | ##### 13.2.9 nginx程序的热更新是如何做的? 912 | 913 | 914 |
915 |
916 | 917 | **获取大牛视频资料,专家架构交流3群:783153655** 918 | 919 | **若群已满,添加QQ:469254771 , 备注github** 920 | 921 | **关注公众号,更多权威架构设计方案。 另附企业内推,架构设计资料,相关视频资料** 922 | 923 | 924 | 925 | 926 | 927 | 928 | 929 | --------------------------------------------------------------------------------