面试问题探讨3

514 阅读29分钟

6. 面试的需求

6.1 JQuery 做了哪些事情?

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

  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/jsp

6.5 你说下对beanstalkd 理解?

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

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

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

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

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

Redshift可以轻松自动执行大多数常规管理任务,以管理、监控和扩展数据仓库。通过处理所有这些耗时耗力的任务,Amazon Redshift 使您得到了解脱并专注于您的数据和业务。

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

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

  • 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 的版本特性变化

  • 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其就是一个代码块。 里面会忽略单引号或者双引号,但是不会忽略变量的值。 在解析代码块的时候进行判断,把引号保留,对于变量进行替换解析。

6.10.2 一些编译php时的configure参数

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

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的回收机制就很大程度上就是根据应用的地址来查看的。