[PHP]面试问题探讨3

6. 面试的需求

6.1 JQuery 作了哪些事情?

答:JQuery 主要是对对javascript作了封装,使得使用js开发更加高效。 更好的提升项目开发的效率。 主要的封装有:javascript

  1. 搜索器的封装。 更好的查找和定位节点元素。 如document.getElementbyid,
  2. 封装了对ajax的请求,能够直接使用$.ajax就能够调用和处理ajax的事情
  3. 优化HTML文档操做、事件处理、动画设计和Ajax交互
  4. 也增长了都css过滤器的优化
  5. 对于ie,火狐,chrome浏览器的一些版本作了兼容
6.3 你使用了Weblogic主要作了哪些事情?

答:Weblogic 是java的服务器,其实咱们主要是使用weblogic进行系统的部署。 知足业务的开发须要。Weblogic 其实本质是servlet的容器,处理大量的Request或者Response的HTTP请求。对servlet进行管理工做。 servlet的的管理周期通常是,建立,启动,链接,销毁的过程。 WebLogic是美国Oracle公司出品的一个application server。 金融公司比较多使用weblogic主要也是考虑其稳定性和可扩展性。 而且对javaee的大量标准是支持的。 如ejb,servlet/jspphp

6.5 你说下对beanstalkd 理解?

答:beanstalkd 是facebook开源的一款基于内存的轻量级的消息处理的中间件。咱们在项目中的使用场景是处理同步lifetime的广告同步数据,这部分数据量比较多,而且对实时性要求不是很高。 因此咱们会专门的消息队列来进行处理。 Beanstalkd 的原理机制是,采用channel的方式,生成者把消息放入channel中,而消费者能够进行关注和订阅channel,而且能够设置消息的优先级。 这样就可构建起生成者和消费的消息队列。 以前facebook用于该消息中间件处理950w用户的应用服务。css

6.6 你说下你理解的logstash的实现机制?查看

答:logstash 是一个很是优秀的日志采集组件。 咱们的使用场景是将不一样服务器的nginx 报错日志经过logstash 统一采集,而且写入到数据库中。 logstash 的实现机制是采集增量的获取日志信息,而且能够设置必定的规则条件,把这些日志信息加载到内存中进行过滤和筛选处理,而后能够输出制定的格式,而且也提供相应的接口。 咱们是使用mysql的数据库进行处理。html

6.7 你说下你理解的Redshift机制?

答: Redshift是亚马逊很是优秀的列式存储的数据库。 它对于大数据的查询和存储都提供了很是好的性能。 尤为是对于大表直接的关联索引性能很是好。 Redshift 处理大表的机制主要是把大表直接的执行解析成SQL语法树,而根据语法树木生成大量的执行任务。 而Redshift的执行器自己是分布式机制。能够把任务分配给不一样的节点,而不一样的计算后的统一结果汇总进行计算。 因此Redshift也是很是耗费内存的处理。 可是执行的效率很是的高。前端

Redshift能够轻松自动执行大多数常规管理任务,以管理、监控和扩展数据仓库。经过处理全部这些耗时耗力的任务,Amazon Redshift 使您获得了解脱并专一于您的数据和业务。java

6.9 说下php几个大版本的改动状况? PHP/Mysql中几个版本的进化史,好比mysql4.0到4.1,PHP 4.x到5.1的重大改进等等。查看

答: PHP 4.x这个版本以前没有使用到,我使用的早期版本是php5.2.x, 使用了glob来查找全局类文件的过滤,在5.4中安全模式和一些python

  • 5.3 :支持命名空间,static 引用当前的类,支持了匿名函数,增长了魔术方法,__call,__invoke, 支持heredoc 文档模式,三目运算符省略中间的
  • 5.4 : 新增了Traits,新增短数组语法,新增支持对函数返回数组的成员访问解析,内置开发的CLI的web server模式,新增实例化时,访问类成员,新增了动态访问静态方法的方式,session提供了上传进度支持,json更懂中文,默认的字符集改为了utf-8
  • 5.5 :新增finally, empty 支持传入一个任意表达式,而不只仅是一个变量,直接经过下标访问数组和元素,新增array列的方式,能够直接读取列的信息(这个很重要)
  • 5.6 : 使用... 变长参数函数,支持use function 以及 use const ,能够在内中导入外面的函数或者变量

Mysql 的版本特性变化mysql

  • 5.5 :innoDB做为默认存储引擎,支持版同步复制,主库写入binlog,从库不必定可以被读取
  • 5.6 innoDB支持全文索引,也使用是倒排序的社交,分词完成后,词汇将会存储在独立的索引表中。对进行分词,同时先将分词结果进入内存缓存,以后再刷入索引表中,避免一次写入带来大量的附加小规模的更改操做。 多线程复制,会对每一个数据库开启独立的复制线程,对主从同步延迟有必定的改善,加入了GTID,能够在方便宕机重启后,进行位置的指向,这样能够自动恢复。
  • 5.7 innoDB 进一步加强,系统表默认仍是采用innoDB存储引擎的表。 支持多源复制,能够支持多个主库的数据归并到一个从库的实例中。 而同步的机制主要采用channel的方式。 json的数据格式会支持,默认会把字符集改为utf8mb4;对于安全这一块增长了初始化安全工具。 innodb_buffer_pool_size能够在线调整不须要重启mysql.
  • 8.0 : 用户角色的功能;加强了innoDB而且对于死锁进行检测,而且针对高并发来动态调整,提升特性,json的完善。
6.10 PHP的一些特性的介绍
6.10.1 HEREDOC介绍 是什么东西,怎么来使用?怎么来实现的

答:HEARDOC其就是一个代码块。 里面会忽略单引号或者双引号,可是不会忽略变量的值。 在解析代码块的时候进行判断,把引号保留,对于变量进行替换解析。linux

6.10.2 一些编译php时的configure参数

答:configure 是对php的一些配置,包括php的bin路径,php.ini文件还有php的根目录的配置。 这样在编译和执行php源码或者扩展的时候能够直接使用configure来操做。还有一些编译的条件,如编译内存的限制,使用的线程nginx

6.10.3 mysql 里面的常见的数据类型默认最大的字节是怎么样的?如int,char,varchar,datetime,text

答:int :8字节, char :1字节, varchar : 可伸缩的定义大小,最大65535, datetime : text :65535(2的16次方) 固定的大小 mediumtext 2的24次方, longtext 2的32次方 timestamp : 自动存储记录修改时间 datetime: 日期时间 '2008-12-2 22:06:44'

6.10.4 posix和perl标准的正则表达式区别

两种不一样的标准规范,一种是IEEE(电气电子协会一套),另一套是perl核心库中支持的。

6.10.5 Safe_mode 打开后哪些地方受限

答:这个在php5.3进行移除了。 safe_mode 主要是避免一些重要对目录或者对system可以操做的权限。 还有一些禁用的函数。

6.10.6 写代码来解决多进程/线程同时读写一个文件的问题。

答:若是产生死锁。

$ppid = posix_getpid();
$pid = pcntl_fork();
if($pid == -1) //父进程
{
    exit("create sub process fail!");
}else if($pid >0)
{
    echo "My process id :".$pid;
    
}else{
    
    $cpid = posix_getpid();
    echo "my child process:".$cpid;
}

复制代码
6.10.7 介绍xdebug,apc,eAccelerator,Xcache,Zend opt的使用经验。

答:xdebug 是php的调试扩展工具,客户端发送http请求/或者命令行的CLI请求,xdebug会监听请求的socket的端口和请求的地址信息,而后检查breakpoint,断点的具体位置,而后解析加载到内存的块的变量信息和方法区的信息。 而且显示在IDE出来。 每一步执行都会从新把内存区的变量信息用IDE进行打印出来。

apc: php加速缓存,能够把php的代码的字节码文件缓存起来,并能够设定失效的时间,若是php的过时时间没有到,则这个缓存没有失效。 这样能够提高线上环境的性能。一样的在开发环境很容易形成代码执行无效的状况。

eAccelerator : 也是加速缓存,跟进动态内容进行缓存的操做。 php加速器,优化和动态内容缓存,提升了php脚本的缓存性能,

Xcache :字节码缓存机制。 这意味着他可以提升您服务器上的 PHP 性能. 他经过把编译 PHP 后的数据缓冲到共享内存从而避免重复的编译过程, 可以直接使用缓冲区已编译的代码从而提升速度. 一般可以提升您的页面生成速率 2 到5 倍, 下降服务器负载.

6.10.8 写出一种排序算法(原理),并说出优化它的方法。基本排序算法要会写,时间复杂度要会推算, 主要是冒泡排序, 快速排序, 选择排序.

答:常见的排序算法有多种:(对于最小值进行作标记,若是有比它更小的,就进行插入)

  • 冒泡(比大小,下沉) Q的二次方,
  • 插入排序(将排序的元素插入到已经排序的序号地方,而后进行比较)
  • 快速排序(Q(nlogn)): 每次排序都分出来最小的一组和最大的一组,直到递归完成全部组的大小拆分,后而后进行合并输出。
6.10.9 请介绍Session的原理,大型网站中Session方面应注意什么?

答:Session 是为了解决http协议的无状态的状况提供的一种方案。 http有cookie,可是cookie存储在本地,这样很容易产生数据的丢失,这样就须要一个存储到服务器的东西,方便http进行请求的时候来识别该用户是已经登陆了。 还在线的状态。 Session 就是会话,就是保持到服务器,这样每次请求的时候须要检查这个会话是否存在,存在表示这个用户已经登陆了。 不然用户进行从新的登陆。

在大型网站中,session的产生会很是多,而且须要保证的session可靠。 通常会对session进行分布式管理。 session应用的时候要主要设置session的过时时间和在一些不一样的应用场景关闭或者登出的时候都可以关闭会话。 常见的方案有:

  1. 使用session的复制,把全部的session所有放入到一台机器进行处理,经过replication的机制,把全部的session复制到不一样的服务器进行处理。 保证全部的机器的session的一致。可是这样会加剧每台服务器的session的量,而且产生大量的冗余,因此通常对于这种的方式采用。session集群,而后统一对session服务器进行管理。可是这样在必定程度上会有必定的性能影响。 不过这样也能够构建sso,单点登陆的机制。 保证全部用户的受权登陆后,并验证session是否正常OK了。
6.10.10 介绍一下常见的SSO

答: SSO就是单点登陆的机制。机制:子系统跳到统一的验证服务器,对帐号和密码验证后会返回一个惟一标识码和这个用户的帐号,而后子系统会把这个标识码和帐号进行存储(session的存储)。 若是用户在子系统登出这回销毁session,并通知sso服务器session key 过时。 用户从新登陆后有能够从新获取session的信息。 用户有了session key 或者叫ticket 就能够到支持该平台的全部应用进行登陆。 而全部的接入的系统也会优先查询下这个用户的ticket是否失效,是否存在。

6.10.11 一个10G的文件,里面存放关键字, 但内存只有10M, 问如何实现统计, 出现关键字次数最高的前100个

答:这是典型了map reduce的思路。

  1. 申请10M的内存空间,用于存放map,key和value的数据。
  2. 打开文件把每一个关键加载到map和value计数中。 写满了10M的内存文件,写入1个文件中,并清空内存,输出时要按单词的字典序排序。最后会生成1000个文件。 而后
  3. 递归的方式这样把10G的文件读取完成,而且把这些单词按照字典的排序方式来处理。这样能够根据字典填充的内容合并成文件,而后把字典单词加载到最大堆中。
  4. 维护一个大小为100的最大堆,并按单词出现次数来组织堆。扫描一遍归并后的文件,留在堆中的单词便是最高频的100个单词。 复杂度O(nlogn)
6.10.12 堆的算法

答: 堆分为最大堆和最小堆的方式。 最大堆排序:左边大于右边, 父节点大于子节点。 因此每次从父节点进行比较,若是比它小就自动向下找,若是比它大就进行拆堆,当前的节点当作父节点,父节点变成左节点这样递归来拆分。

最小堆排序:根节点的值最小。 最左边的节点最大。 因此元素的查找从最左边查找,直到查找到须要的节点元素。

6.10.13 http1.0与http1.1的区别

答: http1.0 和http1.1的区别。 http1.0 主要仍是创建链接。相对http1.1来讲没有缓存的处理。这样会耗费大量的链接消耗。 http1.1还支持keepalive ,长链接机制。 除了上面的区别还增长了,host的域处理。

  • 支持了keep-alive的长链接机制,能够大量的节省http请求的开销
  • 支持了host主机,1.0 只支持一个绑定一个IP, 而1.1 支持IP地址的虚拟化,能够一次性绑定多个IP字段的处理
  • 100 的状态能够节省宽带,能够在100的宽带请求判断是否须要请求body的数据。 大量的节省http请求数据的消耗。
  • 在1.0 基础上添加了一些缓存的特性。 提升资源的复用效果。 当缓存对象的Age超过Expire时变为stale对象
  • 1.1 增长了Chunked transfer-coding发送方将消息分割成若干个任意大小的数据块,每一个数据块在发送时都会附上块的长度,最后用一个零长度的块做为消息结束的标志。
6.11 linux 负载值是怎么计算的?

答:uptime 或者top出现了负载值的状况。 这个值的来源有1分钟,5分钟,15分钟统计的结果。 这个负载值是进程在指定时间内等待的长度。 进程的队列的条件(处于等待的状态):

  1. 没有等待I/O的操做
  2. 没有主动进入等待的状态。
  3. 它没有中止。
6.12 ssh @todo
6.12.1 ssh 的通讯/实现机制是什么

答:ssh 是安全的xshell机制,主要仍是方便远程登陆,它是简单来讲采用SSL加密传输。它支持的通讯方式包括帐号和密码进行socket的链接服务,也支持基于RSA非对称加密的方式进行处理。 主要是创建服务器链接的机制。 ssh 安全协议支持两种方式:

  1. 方式一,主要是经过帐号和密码的方式来创建tcp的链接。 而这种链接多是会对全部传输的数据进行加密,可是这种方式可能会存在中间人的状况。 就是你把请求的帐号和口令发送到中间人机器,而后中间人把这些帐号和密码跟服务器进行通讯。 这样会存在被窃取的风险。
  2. 方式二:针对方式一的中的中间人的问题,提供了基于非对称算法的方式来解决以上的问题。 它解决的方式,先服务器根据用户信息生成一对秘钥,把公钥放到服务器中。 客户端先发送公钥请求,跟服务端进行匹配,若是成功后,服务端会把公钥加密的“质询”发送给客户端,客户端使用本身的私钥进行解密。 若是成功,就能够完成正常的数据的通讯。 而在通讯过程当中,使用散列hash(sha1+sha2+md5)来保证传输的信息不可以串改的操做。

其实https是在这个ssh加密的方式上作了扩展,支持了第三签名也就是CA. 而证书的颁发也是第三方请求后发送的。 浏览器对证书的可靠性进行验证。 看是否来于合法的二级加密算法中。

6.12.2 ssh1.0和ssh2.x的区别

答:ssh1.x 在加密算法上存在一些漏洞,因此后期升级到ssh2,如今主要仍是使用ssh2来进行加密的操做。

6.13 gdb,strace,valgrind的基本使用
  • GDB是一个由GNU开源组织发布的、UNIX/LINUX操做系统下的、基于命令行的、功能强大的程序调试工具
  • strace经常使用来跟踪进程执行时的系统调用和所接收的信号。必须由用户态模式切换至内核态模式,经过系统调用访问硬件设备。
  • Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其余调试工具组成。内核相似于一个框架(framework),它模拟了一个CPU环境,
6.14 session与cookie的区别及如何解决session的跨域共享. 查看

答:session 和cookie在以前的地方已经提到,这里就再也不赘述。那如何解决session的跨域共享的问题呢? session的跨域共享能够经过造成session的独立服务器,这样全部的session都由通用的服务器进行管理,或者构建出恒sso的单点登陆的验证服务器来解决不一样域名的访问都是正常的。

最好的仍是由通用的受权中心进行验证和管理session的登陆机制。

6.15 php的垃圾回收机制, php变量,数组 c源代码如何实现.

答:PHP的垃圾回收机制是根据时间来处理的。 在php5.2版本的时候垃圾回收机制采用了引用计数器,这个计数器的思路很是简单,对于应用的变量或对象都会记录一次,当引用的计数器的数量为0时就清理该对象的应用。 可是这种计数器的方式很容易产生不少计数器的堆积。 基于此,使用了IBM的一套算法进行改进,思路以下:

  1. 若是是计数器等于0的,仍是跟以前同样
  2. 若是是计数器在减小,而且减小的频率很是快,这样的计数器放入高速缓冲区中。咱们能够对计数器能够分类,一类是更新频率比较快的能够做为新生代,另一类是更新比较慢的,咱们叫年老代。这样对于新生代是更换比较频繁的,天然计数器的变量回收的要更快些。 当新生代的技术器缓存区不够处理的时候,把一些年老代的计数器变量同步到新生代计数器中。
6.16 php运行模式有几种,分别是什么?

答: PHP 咱们经常使用的运行模式有这同样一些:

  1. CLI , 命令行能够访问php的命令。
  2. 一种是经过http的方式,经过fastcgi 进行请求。
  3. 基于web的请求的模式,最后仍是转换成cgi的模式
  4. cgi的请求模式。
  5. ISAPI(Internet Server Application Program Interface)这种模式使用的比较少。
6.17 如何实现跨域请求? 跨域的原理和机制? 查看

答:

6.18 在正式服务器上, 如何操做一个存储大数据表上增长一个字段或添加索引或改变数据字段类型?

答:方法一:在从库添加字段,而后切换成为主库。 方法二:创建一张临时表,把表结构和索引复制。最后把增量的数据根据移过来。 方法三:停服更新

6.19 mysql 执行计划分析三看, explain,profiling,optimizer_trace

答:explain 能够显示sql的索引状况,显示sql命中的统计数据,而optiwozer_trace能够查看到每条sql执行和解析的过程,能够方便sql执行的调试操做。这种的状况对于复杂sql的组合操做仍是很是的重要的。

6.20 mysql分库分表策略, 如何解决增表,减表问题?

答:分表和分库主要是对业务的拆分,把一个大的业务体系不断的拆分红小的数据库和不一样的表。对于怎么来拆分库和拆分表,须要考虑场景。咱们拆分表主要是根据时间,也有根据用户,时间,广告帐号等条件来拆分的。 数据的拆分也是把核心库和非核心库拆分,这样核心库的io不会受到非核心库的大量产生阻塞做用。

怎么来解决增表和减表的操做。这个要看具体的场景。若是咱们以前在分表的时候创建的逻辑数据库访问层的话。那么须要调整逻辑策略和数据库的迁移。 举个例子, 若是是根据时间来增长表,如每一年一个表,那么要增长表的时候,能够定时任务,提早建立两张表结构,若是是要删除表,那么能够把表进行归档。并废弃表。

除了时间分表,还能够基于用户的ID来+时间来拆分,如2018年用户ID后两位是01做为一张表,这样一年就有100张表进行存储。一张表能够存储1kw的时候,那么这样的分表策略能够支持一年1亿条数据的存储。


6.21 一致性hash原理是什么?

答:一致性hash算法是memcached集群使用的算法结构方式,他使用的方式是采用hash映射的方式,把2的32次方的hash节点映射成memcached沛泽集群。而且集群的memcahe须要解决集群中的问题。包括,单一性原则即便增长和删除节点均可以共享到数据;,平衡的原则保证,还有就是负载的原则,保证不一样节点分配的存储的节点内容是负载是均衡的。

一致性hash能够来解决这类的问题,主要的思路:不一样的节点的增长和删除hashkeyi会顺时针的迁移。其实一致性的hash充当是一个逻辑的分配。hash对物理的节点创建了虚拟的复制节点,能够访问节点的有副本。若是节点挂掉了会把复制节点的内容进行顺时针的迁移操做。

6.22 如何统计日志文件中访问次数最多的十个ip地址

答:这个须要使用liunx的命令操做。

6.23 进程与线程的区别

答: 线程是进程中的一部分,他们的本质都是操做系统的任务,不过线程的的开启和关闭的资源消耗低于进程。一个进程能够开启多个线程进行处理。 相对来讲,进程更加的稳定和高效。 进程有本身的地址空间和资源,进程之间是相互独立的,而线程之间是能够相互的访问的,也能够获取进程的共享资源。线程之间能够互相影响存在不稳定的状况,检测起来也比较麻烦。因此对资源消耗大的优化能够采用线程,反之对于稳定性高的可使用进程来处理。

6.24 高并发,高流量状况下,如何设计秒杀或抢红包架构?

答:秒杀系统,这种场景随处能够见到。有春运抢票,抢红包。 主要须要考虑的几个点:

  1. 队列的长度要多长,也就是说商品的长度,设置一个最大容许接受的队列长度
  2. 对于超过的最大的商品队列的给予提示
  3. 针对秒杀能够设计单独的服务器,不影响现有的服务器的状况,后台能够针对并发请求的流量进行分流/负载均衡。
  4. 对于秒杀的用户进行商品的锁定,而后用户能够进入支付系统进行处理器。
  5. 这里对于用户的重复请求须要考虑咪等性的提交处理。放入到缓存中,若是重复提交则不去进行处理。
  6. 对于秒杀的咱们采用cap原则,保证数据的最终一致性,系统的高可用和数据进行分区。对于不一样副本的数据同步咱们增长了消息通知重试的机制,对于没有处理失败的请求咱们会设置超时时间,并尝试重试处理。
6.25 腾讯面试的要求
6.25.1 异步事件回调机制

答:PHP增长了跟js同样的事件回掉机制。这样的好处在于,代码执行完成后,能够经过回掉机制进行异步提交,不须要等待提升效率。 其实异步回掉机制机制主要是把回掉函数封装成对象传入,当知足条件后,就能够直接调用其回掉机制的方法进行处理了。

而异步回掉机制机制最后仍是依赖于操做中系统中的异步事件的注册,而后系统会检查是否存在知足条件的事件,若是知足就直接调用这个事件进行处理。

6.25.2 REST架构 机制

答:RESTful是轻量级的http服务架构,它对http进行了封装,支持轻量级的调用和处理。包括对get,post ,put ,delete的支持,而且还支持了统一资源的路由方式,能够直接经过ID获取对象的资源。使得http的请求更加简单和方便。 restful把互联网看成资源池,经过uri的资源能够获取任何的资源。restful其实把整个网站做为软件,restful就是一种资源表现转换的一种架构风格。

6.25.3 模板引擎机制

答:模版引擎,咱们是处处可见,常见的html本质上就是一个前端渲染模版。而咱们讨论的版本引擎更多的是动态语言或者自定义语言封装的模版引擎。如PHP view,smarty ,vectoty,这些模版首先会制定本身的模版渲染语法,常见的包括解析器的if,for switch等。从而能够更快的渲染输出结果。

6.25.4 中间件的原理? @todo

答:中间件自己是解决必定场景的问题的工具,通常跟具体的业务关系不大。如redis能够做为消息中间件,解决消息发布和消费的过程。

中间的原理提供统一的输入和输出的接口,而后提供中间的配置,能够接入业务系统,方便总体业务的对接。

中间件主要是在应用和操做系统层之间的调用,中间件须要解决平台化和消息通讯,这样通常要支持分布式的处理。如分布式消息中间件,分布式事务中间件,还有其余的事件处理。

中间件整体来讲是解决多操做系统的复杂接口的封装,提供统一的,标准的调用接口。极大的提升的开发的效率和解决了不一样的操做系统和不一样的组建之间的消息通讯的处理机制。

6.25.5 经常使用的设计模式有哪些?@todo

答:常见的设计模式包括,单例模式,工厂模式,适配器模式,还有模版模式,策略模式。这些模式都是开发中都是常见处理的。单例模式更多的是怎么来处理对象的共享对象的处理,把构造函数私有化,这样统一的建立对象方法能够负责方法的建立。

工厂模式: 负责生产对象。而后消费者,只须要对象的产品的名称,调用工厂对象就能够生产出该对象或者查询已经生产的对象。

适配器模式:咱们常见的是经过插口的方式进行处理。为了知足方法接口的调用,对不能哦使用的对象进行封装,并增长须要知足特性的接口,而后进行接口的调用。

模版模式: 一个抽象类把要作成事情的步骤出来,如把大象装进冰箱里面,能够把找来大象和找来冰箱,而后打开冰箱,最后把大象装进冰箱经过继承的对象进行实现处理。从而实现模版模式。

策略模式:咱们经常使用的人物是应用的算法模式,好比说排序有多种算法,所排序的有的类都实现sort排序的方法,而后经过排序的算法名称就能够实现算法的调用。从而实现

6.25.6 面向对象的设计原则有哪些?

答: 总的设计原则是高内聚,低耦合。 常见的原则包括: 单一性原则,一个类只作一件事情 依赖倒置原则,抽象不依赖于具体的实现。 里氏原则:子类能够替换父类全部的状况。这样父类尽量的设计的简单和抽象。这样子类能够覆盖父类的方法。 接口隔离原则:多个不一样的场景实现,最好把多个接口分开实现进行调用。

接口的开闭原则:对扩张是支持开放的,这样能够扩展其特性,对修改进行关闭,这样内部的修改,通常只有内部本身能够完成修改操做。

6.25.7 网络安全的理解

答:网络的安全。这个话题真的有点大,我说下我我的的理解。互联网整体来讲是无数的主机经过网络链接在一块儿的。网络的本质就是解决不一样主机之间能够通讯的问题。同时主机之间本质上都是独立的不相认识的。默认的状况主机通讯是没有安全问题,可是随着互联网把人类的生活场景映射到互联网的时候,就容易造成互联网的维护者,另外一方面是破坏者。这样网络的安全问题就诞生了。 常见出现的网络安全问题有:

  1. 假冒主机进行通讯,包括发送信息和接受信息,骗子
  2. 在中间劫持核心和重要的数据,小偷
  3. 网络的攻击,使得你的系统不能正常的使用。强盗

解决网络的安全问题主要有:

  1. 制定安全的传输协议,如ssl,tls协议,这就比如创建法律的条条框框。
  2. 增长认证机制,好比说第三方的证书认证。
  3. 加密技术的处理。
  4. 监控技术,监控规则。

而协议这一块,基本上已经有了成熟的体系了。因此通常是创建在现有的安全协议上通讯。前面两点在现有的体系有人负责处理了。咱们更多的是关注于加密技术和系统监控。 常见的加密有rsa非对称加密,des,aes对称加密,还有散列算法的加密,md5,sha1,sha2. 而系统的监控,能够经过请求的特征分析是否为安全的。包括监控是否存在木马,蠕虫病毒的攻击。

6.25.8 Mysql的存储优化

答:mysql的存储优化这里能够从两个角度来讲,一个是基于业务的数据库,表的存储优化,另一个是存储引擎的优化。 从第一种状况来看,mysql数据库存储要根据核心业务和非核心业务拆分,减小非核心业务库都核心库业务的i/o影响。这就是咱们常见的分库。这个须要考虑业务的场景。若是是对表进行优化的话,须要考虑表包含的三个点,表结构,表索引,表数据。能够分别进行考虑,如是否存在废弃的表,废弃的大字段,是否存在存储的大字段的拆分。 而后对表的索引优化,能够基于业务判断,索引是否存在足够的命中,同理索引是否存在大量的冗余等。 表数据的优化主要考虑是否进行表拆分,一个大表拆分红多个表。而后进行业务的使用。具体的拆分都须要跟具体的应用场景来讲看。 另外一个说下对存储引擎优化。咱们经常使用的存储引擎基于事物的innodb,特别是最近的mysql5.5以后重点仍是对innodb的优化。对于innodb的优化主要集中在配置的优化,包括innodb的缓存大小,还有缓缓冲队列的长度调整。具体也须要根据业务的场景来调整。

6.26 阿里巴巴
6.26.1 熟悉TCP/IP、HTTP协议相关知识,熟悉Unix/Linux环境和系统编程,深刻掌握服务器编程模型

答:详见,服务器网络编程的5种编程模型的操做。

6.26.2 熟悉高可用高并发的架构设计,曾主导或支撑过亿级访问量中等规模复杂度系统,说说大家的项目场景?处理亿级别的系统设计场景能够聊下

答:简单聊聊高并发吧,高并发是在单位时间里面可以支撑起流量的请求而且可以进行快速的处理。咱们常见的是用户的请求,或者接口的调用。这些流量的大量的堆积在一块儿,造成流量洪峰。在咱们搞的项目中有几点应对的经验能够聊下:

  1. 流量的分流,常常会采用一些反向代理器或者负载均衡器。这些组件主要解决的是把流量均衡的分发到服务器进行处理。
  2. 流量的控流机制,要知道你服务器真正可以支撑多大的体量,通常会空流会进行设置设置不一样的级别。对于超过的流量体系能够尽早提示返回。
  3. 服务器的处理机制,通常采用异步事件机制。服务器会把要处理的流量事件注册进行注册,服务器能够根据流量的洪峰进行启动最大线程处理。好比说咱们使用nignx服务器,4核服务器开启了4个work,而每一个work能够开启1wconnsection,
  4. 对于服务器的代码处理,能够优先把结果存储到缓存中,对于查询的流量尽可能在缓存中进行查询,对于插入的事物,能够先锁定,而后放到消息队列中,进行处理。咱们如今主要使用redis集群进行处理。
  5. 咱们的流量主要来自于咱们的数据同步压力。
6.26.4 你是怎么理解敏捷开发的?

答:这个已经答了。在关闭这个窗口的时候就没有序列化了。 本质是快速迭代,快速交互,小步快跑。

6.26.5 python 语言和PHP的区别

答:python也是一门脚本语言,而且愈来愈多的搞数学和算法的人选择了这门语言,那为何会出现了,有这门语言。它又相对PHP来讲解决了什么问题呢? 对于PHP的语言整体不是很高,PHP的基础组件不是很完善,而主要仍是针对web的开发,这样在必定程难度上很容易被局限了。

php随着web兴起,对html的标签支持的很是好,可是随着web的兴起和移动互联网对开发的效率提升,天然拉升了对PHP的需求。天然而然的PHP就更多人来开发和管理和使用了。可是PHP随着基础库不够完善和对于其余的web平台的开发就变得不是那么的有竞争力。因此,就能够真正的提升总体的体验。

python随着大数据和人工智能的发展,这门语言变的很是有必要进行开发和使用了。python语言仍是能够尝试学习下,而后进行必定的开发和调试操做。慢慢去解决存在的问题和遇到的问题。

6.26.6 Python 构建自动化的机制

答:python 也是一门脚本语言。 咱们采用的是behave的框架,这种框架是行为驱动的测试场景,很是简单的方式,就是能够把一些测试用例的描述转变成系统的开发测试经验。从而保证系统的执行的效率。因此,能够采用常常的数据库的操做和方式的处理。只须要把测试用例的描述信息转化成behave的制定的语法就能够造成测试。本质就是测试关键字与语法的对应。

6.27 迅雷的招聘需求
6.27.1 优化共识机制

答:分布式一致性的算法确认,在不一样的分布式结构过程当中

6.27.2 优化智能合约,开发底层合约应用

答:智能合约就是在知足数字协议的条件上进行自动执行合约的操做。

6.28 算法
6.28.1 冒泡算法

答:冒泡算法整体逻辑

  1. 当前元素跟后面的每个元素比较,若是后面元素比当前元素小则进行交换
  2. 遍历全部的节点,最后会出现小的排在前面,大的值排在后面。
6.28.2 插入排序

答:插入排序,能够前插入排序,也能够后插入排序。前插入排序主要是

  1. 当前节点的后一个节点,跟前面节点比较,若是是比当前元素小则,继续向前比较,若是比前面节点小比当前节点大,则后一个节点与当前节点交互。
  2. 遍历全部的元素,都向前插入。最后造成顺序的排序列表。
6.28.3 快速排序

答:快速排序的算法思路:

  1. 在排序前设置基准元素,能够是第一个,也能够是最后一个
  2. 根据基准元素进行比较,比基准元素大的放右边,比基准元素小的放左边。
  3. 按一样的方式递归左边的元素和右边的元素。最后把这些递归结果数组进行合并。使用array_merge

6.29 数据结构
6.29.1 链表

答:什么是链表?链表就是物理上是分离的,可是逻辑上经过指针连接各个节点的次序。 对链表就是节点的指针,包括头节点,为节点,经过指针进行链接/指向。 class Node{

public $val="";
public $name ="";
复制代码

}

链表是物理上分散,逻辑上是连续的。 就比如,有不少珠子,那根线串起来就是链表。而每颗珠子都记录下一颗珠子的引用。这样就就能够应用的位置找到下一个节点的地址块,已经该节点的地址块元素的值。同理,循环查找或者把地址的位置断开,而后进行衔接。 开始要建立头节点,头节点能够建立元素。next节点能够为null。 咱们采用节点指向的方式来处理。

  1. 头节点要指向下一个节点。能够先建立一个空节点,而后把头节点指向的下一个位置设置为空节点
  2. 把这个空节点设置值。
6.29.2 栈

答:这个是先进后出的,很是适合操做符或者一些变量和释放。

6.29.3 队列

答:先进先出,可使用数组做为队列,采用push,pop的方式进行处理。 也可使用双向链表做为做为队列的机制进行关联和处理。

6.29.4 堆

答:最小堆和最大堆。左边大于右边。进行处理!

6.29.5 树

答:树的数据结构主要包含了跟节点和叶子结点。这样就构成了树的数据格式。 树的格式包括左节点和右节点。

6.29.6 指针
6.29.7 引用

引用是对对象或者变量进行标识,能够经过标识能够获取地址块。而指针表示真实分配的地址块,是物理内存中能够查看到的。因此使用指针要防止指向的内存地址是否存在,这就是常见的空指针的状况。

其实PHP的回收机制就很大程度上就是根据应用的地址来查看的。

相关文章
相关标签/搜索