title: 2021年3月15日 腾讯PCG运营开发实习面试(一、二、三面)
tags: 面经


2021年3月15日 腾讯PCG运营开发实习面试(一面2h)

自我介绍你能讲一下Java中的集合,你都了解些什么呢?请说一说他们之间的区别以及底层实现(见JavaGuide)数据库中的日志你都了解什么?请说一下他们之间的作用以及应用(redo log, bin log, undo log)(见下文)InnoDB 和 MyISAM 引擎有哪些区别?(见JavaGuide)再讲讲 MVCC 是什么?(见下文)你了解哪些常用的linux命令?然后面试官还会说几个场景让你说一下linux命令用哪个(top、pmap、awk、grep、ps、sed等)比如如何如何查看cpu的情况等等。(top)char 和 varchar的最大长度是多少,以及他们之间的区别(见下文)varchar16 和 varchar32 分别有多少字符?(见下文)常见字符集你了解哪些?(其实就是那些UTF8,GBK,ASCII)(见下文)创建索引的时候,你一般会考虑些哪些因素?比如说我需要其查看sql语句的执行计划用什么命令呢?(explain)这一块索引问了很多,如有关索引如何优化等等(由于没有录音,记得不太清楚了)算法题:(两道算法题,一道兔子生兔子的问题,另一道是用两种排序算法对数组进行排序)

1.1 数据库中的日志你都了解什么?请说一下他们之间的作用以及应用(redo log, bin log, undo log)

redo log(重做日志):

当有一条记录需要更新,InnoDB 引擎就会把记录写到 redo log 里面,并更新内存。这个时间更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面。有了 redo log,InnoDB 就可以保证即使库发生异常重启,之前提交的记录都不会丢失,这个能力成为 crash safe。redo log是指回放日志的时候把commit的事务重做一遍,对于没有commit的事务按照abort 处理,不进行任何操作。

bin log(归档日志):

bin log日志只能用于归档,没有 crash safe 能力。

这两种日志之间的区别:

① redo log 是InnoDB引擎持有的;bin log是MySQL的server 层实现的,所有的引擎都可以使用。

② redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;bin log是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID = 2这一行的 c 字段加1”。

③ redo log 是循环写的,空间固定会用完;bin log是可以追加写的。“追加写”是指bin log 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

undo log(回滚日志):

undo log 是把所有没有commit的事务回滚到事务开始前的状态,系统崩溃时,可能有些事务还没有commit,在系统恢复时,这些没有commit的事务就需要借助 undo log 来进行回滚。

1.2 再讲讲 MVCC 是什么?

MVCC:多版本控制—锁机制可以控制并发操作,但是系统开销较大,而MVCC可在大多数情况下替代行锁,使用MVCC 能降低其系统开销。

MVCC 是通过保存数据在某一个时间点的快照来实现的,不同存储引擎的MVCC 是不同的。InnoDB 的 MVCC 是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的创建时间,以及这个行的删除时间。这里存储的并不是真正的实际时间,而是系统的版本号。

MVCC 只适用于MySQL隔离级别的 读已提交可重复读

MVCC 的创建版本和删除版本只在事务提交后才会产生。

在InnoDB引擎中,使用MVCC(多版本并发控制)。InnoDB为每行记录添加了一个版本号(系统版本号),每当修改数据时,版本号加一。在读取事务开始时,系统会给事务一个当前版本号,事务会读取版本号<=当前版本号的数据,这时就算另一个事务插入一个数据,并立马提交,新插入这条数据的版本号会比读取事务的版本号高,因此读取事务读的数据还是不会变。

1.3 char 和 varchar的最大长度是多少,以及他们之间的区别

varchar与char的区别:

char的特点:

  • char表示定长字符串,长度是固定的;
  • 如果插入数据的长度小于char的固定长度时,则用空格填充;
  • 因为长度固定,所以存取速度要比varchar快很多,甚至能快50%,但正因为其长度固定,所以会占据多余的空间,是空间换时间的做法;
  • 对于char来说,最多能存放的字符个数为255,和编码无关

varchar的特点:

  • varchar表示可变长字符串,长度是可变的;
  • 插入的数据是多长,就按照多长来存储;
  • varchar在存取方面与char相反,它存取慢,因为长度不固定,但正因如此,不占据多余的空间,是时间换空间的做法;
  • 对于varchar来说,最多能存放的字符个数为65532

总之,结合性能角度(char更快)节省磁盘空间角度(varchar更小),具体情况还需具体来设计数据库才是妥当的做法。

1.4 varchar16 和 varchar32 分别有多少字符?

1.5 常见字符集你了解哪些?

1.6 创建索引的时候,你一般会考虑些哪些因素?

① 适合建立索引的列是出现在where 子句中的列,或者连接子句中指定的列;

② 基数较小的类,索引效果较差,没有必要在此列建立索引;

③ 使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间;

④ 不要过度的索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只需要保持所需要的索引即可,不应过度索引,这样更利于查询。

⑤ 避免where 子句对字段施加函数,否则不会命中索引;

⑥ 在使用InnoDB 时使用与业务无关的自增主键作为主键,即使用逻辑主键而不要使用业务主键;

⑦ 将打算加索引的列设置为Not null,否则将导致引擎放弃使用索引而进入全表扫描;

⑧ 删除长期未使用的索引,不用的索引的存在会造成不必要的性能损耗。

其实回答面试官,用上面的的几点即可。下面为拓展知识:

分两种情况来说:

1)哪些情况需要建立索引:

① 主键自动建立唯一索引;

② 频繁作为查询条件的字段应该建立索引

③查询中与其他表关联的字段,外键关系建立索引;

④ 单键/组合索引的选择问题,组合索引的性价比更高些;

⑤ 在经常需要排序的列创建索引,因为索引已排序,这样查询可以利用索引的排序,加快排序查询时间;

2)哪些情况不需要建立索引

① 表记录太少;

② 经常增删改的表或字段;因为虽然索引提高查询的速度,同时却降低更新表的速度,因为更新表时,MySQL不仅需要保存数据,还要保存一下索引文件,所以会带来很大的性能开销。

③ where 条件里用不到的字段就不创建索引;

④ 过滤性不好的就不要创建索引了,比如说,性别。



2021年3月18日 腾讯PCG运营开发实习面试(二面70min)

自我介绍项目介绍(这里介绍的是我简历中的三个项目,着重去介绍的是我的研究生课题项目,因为他会挑你最熟悉的项目去问)你参与华为的这个项目有什么收获吗?你能介绍一下黑客松的比赛的具体内容吗?你有什么优势对于这个项目呢?你能介绍一下hadoop这个架构吗?(这个hadoop只是因为我项目提到,所以被问到了)那介绍一下你的科研项目(到这问了将近40分钟了)那Java虚拟机的JVM的原理能介绍一下吗?那JVM的内存模型介绍一下(查看JavaGuide即可)能介绍一下GC算法有哪些吗?(查看JavaGuide即可)如何调优JVM的参数呢?(见下文)就是我的程序跑着跑着变慢了,这是为什么呢?(见下文)我现在发现我的Java服务很慢,我发现我的cpu跑的很高,这是什么原因引起的呢?怎么去排查这个问题呢?(见下文)为什么这个进程占用cpu这么高?(这个根据前面的回答来进行回答)你还有Java处理过什么东西吗?你最近半年写过的Java的代码行有多少呢?你熟悉mysql吗?那你从工程开发的角度看,如果你去开发数据库你需要去注意哪些地方?怎么用好数据库?我设计表的时候,数据字段有什么需要注意的地方吗?(见下文)你自己有没有搭建过数据库服务呢?有没有做过什么项目用到了mysql呢?你对linux命令熟悉吗?linux的文本编辑工具有哪些?(vim,gEditor,Nano Editor,gVim Editor, Emacs Editor)linux中性能分析或查看性能的命令有哪些?磁盘的I/O的负载怎么看?(见下文)tcp/ip的五层网络模型介绍一下(应用层、传输层、网络层、数据链路层、物理层)对网络层除了ip协议还有哪些常见的协议?ICMP是什么协议?(ICMP:控制报文协议,它是一种TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。)tcp与udp的区别?(见JavaGuide)tcp是如何保证可靠的呢?(见JavaGuide)http有哪些状态码?(见JavaGuide)http与https有什么区别?(见JavaGuide)https的加密算法说一下?(见JavaGuide)http的请求过程说一下?(见JavaGuide,即跟输入url的那个是一样的道理)你是哪里人?你的职业规划有什么打算?你的实习计划是什么呢?你有女朋友吗?对工作地点有什么要求吗?然后问了一下编程语言的事情你觉得从事互联网开发你觉得你有哪些方面不足,那接下你有什么打算怎么去改正这些不足呢?那我问你实践从了找实习之外,还有什么方法能够增加了一下实践能力呢?反问环节。

1.1 你能介绍一下hadoop这个架构吗?

1)Hadoop是一个能够对大量数据进行分布式处理的软件框架。以一种可靠、高效、可伸缩的方式进行数据处理。主要包括三部分内容:HDFS,MapReduce,YARN。

①HDFS: Hadoop分布式文件系统,它是Hadoop数据存储层;

它是一个具有故障容错,分布式的,高可靠的且可扩展的用于数据存储的文件系统;HDFS是为了存储海量数据而开发的,数据量可以达到TB级别。

②MapReduce:数据计算框架;

它是一种编程模型,是Hadoop最重要的组件之一。它是用于计算海量的数据,并把计算任务分割成许多在集群并行计算的独立运行的task,是Hadoop的核心,它会把计算任务移动到离数据最近的地方执行,因为移动大量数据是非常耗费资源的。因此,MapReduce 是分布式处理海量数据的计算框架。由于数据存储以分布式方式存储在HDFS,它为MapReduce执行任务提供了基础。

③YARN:负责资源管理和任务调度。

它是一种资源管理系统,在集群模式下管理、分配和释放资源(cpu、内存、磁盘)变得非常复杂。而YARN可以非常高效的管理这些资源。

Hadoop是怎么工作的:

1)输入数据被划分为若干个128MB(默认的)块,然后把它们移动到不同的点;

2)在多个datanode 存储完所有的块之后,用户才能处理这些数据;

3)接着,master把用户提交的程序调度到独立的节点上;

4)等所有节点处理完数据之后,输出计算结果并写回HDFS。

Hadoop的优点和应用:

高可靠性:这个是由它的基因决定的。它的基因来自Google。Google最擅长的事情,就是“垃圾利用”。Google起家的时候就是穷,买不起高端服务器,所以,特别喜欢在普通电脑上部署这种大型系统。虽然硬件不可靠,但是系统非常可靠。

高扩展性:Hadoop是在可用的计算机集群间分配数据并完成计算任务的,这些集群可以方便地进行扩展。说白了,想变大很容易。

高效性:Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。

高容错性:Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。这个其实也算是高可靠性。

低成本:Hadoop是开源的,依赖于社区服务,使用成本比较低。

基于这些优点,Hadoop适合应用于大数据存储和大数据分析的应用,适合于服务器几千台到几万台的集群运行,支持PB级的存储容量。

Hadoop的应用非常广泛,包括:搜索、日志处理、推荐系统、数据分析、视频图像分析、数据保存等,都可以使用它进行部署。

总结:

Hadoop的框架最核心的设计就是HDFSMapReduceHDFS 为海量的数据提供了存储,则 MapReduce 为海量的数据提供了计算。

HDFS 理解为一个分布式的,有冗余备份的,可以动态扩展的用来存储大规模数据的大硬盘。

MapReduce 理解成为一个计算引擎,按照MapReduce的规则编写Map计算/Reduce计算的程序,可以完成计算任务。

1.2 那Java虚拟机的JVM的原理能介绍一下吗?

JVM 的 工作原理,层次结构 以及 GC工作原理

Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制。JVM实现了Java语言最重要的特征:即平台无关性。原理:编译后的 Java 程序指令并不直接在硬件系统的 CPU 上执行,而是由 JVM 执行。JVM屏蔽了与具体平台相关的信息,使Java语言编译程序只需要生成在JVM上运行的目标字节码(.class),就可以在多种平台上不加修改地运行。Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。因此实现java平台无关性。它是 Java 程序能在多平台间进行无缝移植的可靠保证,同时也是 Java 程序的安全检验引擎(还进行安全检查)。

1.3 如何调优JVM的参数呢?

JVM调优参数简介、调优目标及调优经验

1.4 就是我的程序跑着跑着变慢了,这是为什么呢?

java程序运行一段时间后内存爆满,cpu使用率迅速增加(解决)

初步分析,是由于程序占用过多的系统资源,导致cpu使用率过高,怀疑是资源没有合理释放,或者程序在运行时出现死循环。

GC占用cpu线程,那肯定是程序中资源占用不释放了,那就去排查代码喽,通过一系列鬼知道发生了什么的操作(什么开启关闭部分功能,代码logger打印查看…),最终定位到了一个定期任务上,然后就去看看哪的资源不释放。

1.5我现在发现我的Java服务很慢,我发现我的cpu跑的很高,这是什么原因引起的呢?怎么去排查这个问题呢?

原因可以参考1.4 ,那如何去排查这个问题呢?

Java进程CPU使用率高排查

思路:

1、先找到耗CPU高的进程;

2、找到耗CPU高的线程;

3、找到耗CPU高的线程对应的业务代码;

1.6 我设计表的时候,数据字段有什么需要注意的地方吗?

MySQL 数据表设计规范

(一)数据库基本设计规范:

① 没有特殊要求(即 InnoDB 无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用InnoDB存储引擎。MySQL 5.6 以后默认的为 InnoDB 支持事务,支持行级锁,更好的恢复性,高并发下性能更好。

数据库和表的字符集统一使用 UTF8MB4。兼容性更好,统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效。

所有表和字段都需要添加注释

尽量控制单表数据量的大小,建议控制在 500 万以内。

谨慎使用MySQL 分区表

分区表在物理上表现为多个文件,在逻辑上表现为一个表 谨慎选择分区键,跨分区查询效率可能更低 建议采用物理分表的方式管理大数据。

尽量做到冷热数据分离,减小表的宽度。

MySQL 限制每个表最多存储 4096 列,并且每一行数据的大小不能超过 65535 字节 减少磁盘 IO,保证热数据的内存缓存命中率(表越宽,把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的 IO) 更有效的利用缓存,避免读入无用的冷数据 经常一起使用的列放到一个表中(避免更多的关联操作)

禁止在表中建立预留字段。

禁止在数据库中存储图片,文件等大的二进制数据。

禁止在线上做数据库压力测试。

禁止从开发环境,测试环境直接连接生成环境数据库。

(二)数据库字段设计规范:

优先选择符合存储需要的最小的数据类型。

列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的 IO 次数也就越多, 索引的性能也就越差。

避免使用 TEXT、BLOB 数据类型,最常见的 TEXT 类型可以存储 64k 的数据。

避免使用 ENUM 类型。

尽可能把所有列定义为 NOT NULL。

使用 TIMESTAMP(4 个字节)或 DATETIME 类型(8 个字节)存储时间。

同财务相关的金额类数据必须使用 decimal 类型。

(三)索引设计规范

限制每张表上的索引数量,建议单张表索引不超过 5 个。

  • 索引并不是越多越好!索引可以提高效率同样也可以降低效率;索引可以增加查询效率,但同样也会降低插入和更新的效率,甚至有些情况下会降低查询效率。
  • 因为 MySQL 优化器在选择如何优化查询时,会根据统一信息,对每一个可以用到的索引来进行评估,以生成出一个最好的执行计划,如果同时有很多个索引都可以用于查询,就会增加 MySQL 优化器生成执行计划的时间,同样会降低查询性能。

禁止给表中的每一列都建立单独的索引。

每个 InnoDB 表必须有个主键。

  • InnoDB 是一种索引组织表:数据的存储的逻辑顺序和索引的顺序是相同的。每个表都可以有多个索引,但是表的存储顺序只能有一种 InnoDB 是按照主键索引的顺序来组织表的。
  • 不要使用更新频繁的列作为主键,不适用多列主键(相当于联合索引) 不要使用 UUID、MD5、HASH、字符串列作为主键(无法保证数据的顺序增长)。主键建议使用自增 ID 值。

1.7 linux中性能分析或查看性能的命令有哪些?磁盘的I/O的负载怎么看?

【Linux基础】用10条命令查看系统性能



2021年3月26日 腾讯PCG运营开发实习面试(三面40min)

先自我介绍(整个过程中感觉这个面试官好凶的样子)然后说了一下平时学习的方式然后说说,如果你参加活动,你在整个团队中,你会产生什么作用呢?说一下你为什么想做运营开发的职位,顺便说一说运营开发、后台开发,前端开发的区别以及如何以什么指标去评判这三者呢然后还问了一些其他的问题,问的时候感觉这个面试官脾气特别不好,我有点被唬住了最后写一道算法题读入一个文件里面的有内容,然后再每一行的行尾输出该行出现频度最高的单词。(这个地方我可能写的不是很好,然后就被挂了,感觉像是压力面,难受)
//虽然该程序并不是面试中的遇到的程序题,但是这个程序与它很像
//得到一个字符串中出现频率最高的字符
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;public class HashMap_tongji {public static void main(String[] args) {HashMap<Character, Integer> map = new HashMap<>();String s = "absdaaaedf";char[] c = s.toCharArray();for(int i = 0; i < c.length; i++){if(map.containsKey(c[i])){map.put(c[i], map.get(c[i]) + 1);}else{map.put(c[i], 1);}}Collection<Integer> collection = map.values();Object[] array = collection.toArray();Arrays.sort(array);//取map中最大的value值int max = (int)array[array.length - 1];//通过遍历map对比得到keyfor (Character key : map.keySet()){//System.out.println(key + "=" + map.get(key));if(map.get(key) == max){System.out.println(key);}}}
}

2021年3月15日 腾讯PCG运营开发实习面试(一、二、三面)(面经含总结)相关推荐

  1. 2021年2月8日 抖音直播后端开发实习面经

    title: 2021年2月8日 抖音直播后端开发实习面经 tags: 面经 2021年2月8日 抖音直播后端开发实习面经 2021-2-8 抖音直播后端开发实习面经 岗位:后端开发实习岗 自我介绍~ ...

  2. 2021.4.6 腾讯 IEG 运营开发实习面试(一面)(含总结)

    title: 2021.4.6 腾讯 IEG 运营开发实习面试(一面) tags: 面经 2021.4.6 腾讯 IEG 运营开发实习面试(一面) 自我介绍 线程与进程的区别 说一下常见的锁(sync ...

  3. 计算机视觉最新进展概览2021年8月15日到2021年8月21日

    参考计算机视觉最前沿进展2021年8月15日到2021年8月21日 - 云+社区 - 腾讯云 1.PIT: Position-Invariant Transform for Cross-FoV Dom ...

  4. 北交所开市工作准备就绪 定于2021年11月15日开市

    11月12日消息,北交所发布公告称,目前,北交所开市各项工作已准备就绪,定于2021年11月15日开市. 2021年11月12日,北交所发布<北京证券交易所合格境外机构投资者和人民币合格境外机构 ...

  5. 苍蓝誓约服务器维护什么时候结束,苍蓝誓约手游2021年7月15日停服维护公告

    苍蓝誓约手游将在2021年7月15日进行短暂的维护更新哦!想了解2021年7月15日更新情况如何的小伙伴们,下面就让我们一起来看一下吧! 尊敬的指挥官您好: 时间是让人猝不及防的惊喜!<苍蓝誓约 ...

  6. 苍蓝誓约服务器维护什么时候结束,苍蓝誓约手游2021年7月15日停服维护公告_苍蓝誓约手游2021年7月15日更新了什么_玩游戏网...

    苍蓝誓约手游将在2021年7月15日进行短暂的维护更新哦!想了解2021年7月15日更新情况如何的小伙伴们,下面就让我们一起来看一下吧! 尊敬的指挥官您好: 时间是让人猝不及防的惊喜!<苍蓝誓约 ...

  7. pytorch 和torchvision 版本对应(2021年12月15日最新版)

    pytorch 和torchvision 版本对应 原文链接 2021年12月15日更新: 2021年10月20日更新: 2021年7月14日更新:

  8. 2021年4月19日 深圳头条后台开发实习面试(二面)(含总结)

    title: 2021年4月19日 深圳头条后台开发实习面试(二面) tags: 面经 2021年4月19日 深圳头条后台开发实习面试(二面) 自我介绍 面试直接跟我讲你想让我问哪个方面的问题呢?(这 ...

  9. 10月15日绿健简报,星期六,农历九月二十

    10月15日绿健简报,星期六,农历九月二十 1. 国家统计局:9月CPI同比上涨2.8%,环比上涨0.3%,PPI同比上涨0.9%,环比下降0.1%. 2. 中央气象台:新一股冷空气蓄势待发,东北华北 ...

最新文章

  1. svn 403 Forbidden
  2. 史上最牛研究生已成院士,给出“维持科研创新能力”的秘诀
  3. JVM 运行机制及基本原理
  4. Oracle数据库的DDL操作
  5. Jenkins环境拓扑及部署流程
  6. 赚钱的一大障碍:知道的赚钱门路太多
  7. vba下标越界9怎么解决_铝模气泡怎么解决?看9个常见问题防治
  8. 编译OpenJDK8 b232版本
  9. 思科OSPF详细配置命令过程
  10. 基于Hive数据仓库的标签画像实战
  11. linux下安装mysql
  12. 学习笔记 Tianmao 篇 recyclerView 辅助的RecycleAdapterImpl类(适配自定义care 一型 使用了frecso SimpleDraweeView)
  13. DSP28377 I2C开发笔记
  14. centos 下mono安装
  15. 计算机应用基础课考试题B,大工《计算机应用基础》课程考试模拟试卷B
  16. 玩家交互体验—剑网3师徒系统
  17. ArcGIS教程:模糊叠加
  18. 一分钟了解蒙特卡洛方法
  19. 科学计算机sd mode使用方法,你是否知道科学计算器的使用方法
  20. FTP文件传输协议原理详解(两种工作模式)

热门文章

  1. Python 超简单3行代码提取音乐高潮部分
  2. 用python+pillow模块实现抖音晃眼睛的特效,图像处理之路(附源码)
  3. 几种常见的攻击方式扫盲(一)——NTP反射放大
  4. java 内部类 引用_在Java中如何从内部引用匿名内部类?
  5. open python语言实现 pdf_使用python操作Pdf代码实现
  6. oracle增量备份如何恢复,【Oracle】增量备份和全库备份怎么恢复数据库
  7. python发邮件包含表格,在Python中在电子邮件正文中包含Excel表
  8. think in java笔记_Thinking in java读书笔记 PDF 下载
  9. c 结构体 不允许使用不完整的类型_C语言必学知识点 quot;结构体quot;详细解析!...
  10. c语言孩子兄弟法存储一棵树,数据结构(C语言版)---树