高级篇

以前遇到的面试题及答案


1.你在你以前的项目中,主要解决了什么技术性难题,如果出现问题,你如何迅速找到问题,你遇到问题都是怎么解决的

1.  先根据出现的问题,大概排查出问出问题的几个点,逐个排查, 错误日志- sql查询计划-定位程序错误,

2.  技术性难题: 自己解决---csdn(博客园)---谷歌---请教技术大牛

3.  解决的技术难题:

1).微信支付,苹果和安卓的支付力度不一样

2.)消息推送 signalr(以前是长轮询)


2. 在浏览器输入网址,Enter之后发生了什么?

         输入网址后DNS(域名解析协议)将网址转换成对应的IP,然后网络在路由表中查找最适合一条路由连接到对应的服务器ip,也就是刚刚转换的ip.此时,传输层tcp经过三次握手后简历连接,服务器收到http请求(get/post)等后,进行相应的处理并把结果数据返回到浏览器上,此时输入网址后对应的信息就会显示出来.

        

3.sql语句慢,你怎么调试出来?怎么解决?

1. Sql执行计划

      2. 统一SQL语句的写法,包括大小写,空格都要一致

      3. 不要把SQL语句写得太复杂,一般,将一个Select语句的结果作为子集,然后从该子集中再进行查询,这种一层嵌套语句还是比较常见的,但是根据经验,超过3层嵌套,查询优化器就很容易给出错误的执行计划

      4.使用“临时表”暂存中间结果,将临时结果暂存在临时表,这可以避免程序中多次扫描主表,也大大减少了程序执行中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能

      5.OLTP()系统SQL语句必须采用绑定变量 ,select*from orderheader where changetime >@chgtime,这样大量的类似查询可以重用该执行计划,一次解析,多次重用.

      6.绑定变量窥测也有不适用的时候, 比如在where条件中的字段是“倾斜字段”的时候,“倾斜字段”指该列中的绝大多数的值都是相同的,比如一张人口调查表,其中“民族”这列,90%以上都是汉族

      7.只在必要的情况下才使用begin tran:Begin tran付出的代价是在提交之前,所有SQL语句锁住的资源都不能释放,直到commit掉。有些情况下可以采用触发器同步数据。

      8.一些SQL查询语句应加上nolock,这样读的时候可以允许写,但缺点是可能读到未提交的脏数据(能采用临时表提高并发性能的,不要用nolock )。使用 nolock有3条原则。

         1.查询的结果用于“插、删、改”的不能加nolock !

2.查询的表属于频繁发生页分裂的,慎用nolock !

3.使用临时表一样可以保存“数据前影”,起到类似oracle的undo表空间的功能,

9. 使用like进行模糊查询时,除非必要,否则不要在关键词前加%

10.首先考虑在 where及order by涉及的列上建索引

11.尽量避免在where中对null判断、!=或<>、or 
来连接条件(适用union all)、in (exists 代替 in)和 not in 也要慎用(使用between)、避免在 where 子句中对字段进行表达式操作,函数操作,否则就是全表扫描

 

4.数据库移植,就是sql,换成mysql,底层怎么做


5.ORM 有哪些框架? 框架原理?

         1.SqlSugar 2.IBatis.net  3.NFramework   4.EF 

         对象关系映射。它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将这些对象组织起来,实现系统业务逻辑的过程.在ORM过程中最重要的概念是映射(Mapping),通过这种映射可以使业务对象与数据库分离。从面向对象来说,数据库不应该和业务逻辑绑定到一起,ORM则起到这样的分离作用,使数据库层透明,开发人员真正的面向对象. ORM是通过使用描述语言来描述数据库与对象之间的映射关系,并将程序中的对象自动持久化到关系数据库中

 

6.写一个上传多张图上控件


7.性能监控 优化系统性能 都会从哪方面操作,用到哪些工具,怎么操作

         OneAPM 通过自动探知 Web 端用户、关键应用、数据库请求、外部调用等各层级应用组件,绘制全局拓扑,直观展示组件性能及相互调用时间,其中包括网络耗时。可以实时了解哪些环节成为了系统的性能瓶颈,做出有针对性的优化

 

         百度应用性能监测中心(http://developer.baidu.com/apm/)

           齐云测(http://ce.cloud.360.cn/)


8.数据库如何优化

         1、数据库运维方面的优化:启用数据库缓存。对于一些比较常用的查询可以采用数据库缓存的机制,部署的时候需要注意设置好缓存依赖项,防止“过期”数据的产生。

         2、数据库索引方面的优化:比如常用的字段建索引,联合查询考虑联合索引。(PS:如果你有基础,可以敞开谈谈聚集索引和非聚集索引的使用场景和区别)

         3、数据库查询方面的优化:避免select * 的写法、尽量不用in和not in 这种耗性能的用法等等

         4、数据库算法方面的优化:尽量避免大事务操作、减少循环算法,对于大数据量的操作,避免使用游标的用法等等

        

9.项目中你用到的设计模式有哪些,举例说明

单例:可以保证系统中一个类只有一个实例,并且自行实例化向整个系统提供(例如一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务)

 

         最简单的就是写考虑线程安全的单例模式,

         public class Singleton

         {

                   // 定义一个静态变量来保存类的实例

                   private static Singleton uniqueInstance;

                   // 定义一个标识确保线程同步

                   private static readonly object locker = new object();

                   // 定义私有构造函数,使外界不能创建该类实例

                   private Singleton() {}

                   // 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点

                   public static Singleton GetInstance()

                   {

                            // 双重锁定只需要一句判断就可以了

                            if (uniqueInstance == null)

                            {

                                     lock (locker)

                                     {

                                                // 如果类的实例不存在则创建,否则直接返回

                                                if (uniqueInstance == null)

                                                {

                                                        uniqueInstance = new Singleton();

                                                }

                                     }

                            }

                             return uniqueInstance;

                   }

         }

 

 

抽象工厂:

10.你认为最大的优点是什么或者说你的技术优势

   喜欢钻研,具有良好的学习归纳能力,有良好的沟通、团队合作能力。技术上目标是项目经理、系统架构师、系统分析师等。


11.堆栈的数据结构内存是如何分配的

栈:所分配的内存是在一块连续的内存区域内.当我们声明变量时,那么编译器会自动接着当前栈区的结尾来分配内存

堆:一般由程序员分配释放(new), 若程序员不释放,程序结束时可能由操作系统回收


12.前端优化:

         减少 HTTP 请求的次数,启用浏览器缓存,css文件放 在<head>里面,js文件尽量放在页面的底部,使用压缩的css和js文件,如果条件允许,尽量使用CDN的方式引用文件

         尽量避免重复的css,尽量减少js里面循环的次数


13.后端优化:

         程序的优化:减少代码的层级结构、避免循环嵌套、避免循环CURD数据库、优化算法等等

         数据库的优化:启用数据库缓存、常用的字段建索引、尽量避免大事务操作、避免select * 的写法、尽量不用in和not in 这种耗性能的用法

         服务器优化:负载均衡、Web服务器和数据库分离、UI和Service分离


14.是否做过负载均衡?怎么理解负载均衡?

         负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。能够平均分配客户请求到服务器列阵,籍此提供快速获取重要数据,解决大量并发访问服务问题

         一种是通过硬件来进行,需要额外的增加负载均衡器,成本比较高,所以适用于流量高的大型网站系统,在多台服务器间安装相应的负载均衡设备,也就是负载均衡器来完成均衡负载技术,与软件负载均衡技术相比,能达到更好的负载均衡效果

         一种是通过软件来进行: 软件负载均衡技术是在一个或多个交互的网络系统中的多台服务器上安装一个或多个相应的负载均衡软件来实现的一种均衡负载技术。软件负载均衡技术配置简单、操作也方便,最重要的是成本很低。


15.Js继承实现

         function Person(name,age){this.name=name;this.age=age}

         //通过原型链给Person添加一个方法

         Person.prototype.getInfo=function(){console.log(this.name+'-'+this.age)}

          function Teacher(staffId){ this.staffId = staffId; }

         //通过prototype声明Teacher继承Person

         Teacher.prototype = new Person();

         var will = new Teacher(1000);

         will.name = "Will";

         will.age = 28;

         will.getInfo();


16.数据库的索引失效?

         删掉索引,然后再重建索引


17.这个表正在用 索引不能删除 要怎么处理


18.IIS的工作原理?

         此题主要考的是.net framework和IIS是如何结合呈现页面的;

         1、当客户端发送HTTP Request时,服务端的HTTP.sys(可以理解为IIS的一个监听组件) 拦截到这个请求;

         2、HTTP.sys 联系 WAS 向配置存储中心请求配置信息。

         3、然后将请求传入IIS的应用程序池。

         4、检查请求的后缀,启动aspnet_isapi.dll这个dll,这个dll是.net framework里面的,也就是说到这一步,请求进入了.net framework的管辖范围。

         5、这个时候如果是WebForm,开始执行复杂的页面生命周期(HttpRuntime→ProcessRequest→HttpContext→HttpHandler);

                   如果是MVC,则启动mvc的路由机制,根据路由规则为URL来指定HttpHandler

         6、httpHandler处理请求后,请求结束,给出Response,客户端处理响应,整个过程结束


19.IIS 经典模式和集成模式的区别

         经典形式是为了与之前的版本兼容,运用ISAPI扩展来调用ASP.NET运转库

         集成形式是一种统一的乞求处置管道,它将ASP.NET恳求管道与IIS中心管道组合在一同,这种形式可以提供更好的性能,可以完成配置和管理的模块化,

         而且增加了运用托管代码模块扩展IIS时的灵敏性。假设老的Web应用程序运转于IIS7.0的集成形式下,

         可能需求对应用程序的web.config文件停止修正,特别是运用了完成IHttpHandler接口的自定义模块的状况。IIS7.0在同一个效劳器上可以同时支持两种形式的应用程序。

        

         web.config文件的变化:system.webServer节指定了应用于web应用程序的IIS7.0设置,其父节点是configuration,

       该节点中能够设置的内容包括:当恳求未包含指定资源时,Web效劳器返回给客户端的默许文档(defaultDocument);

         响应的紧缩设置(httpCompression) 自定义头部(httpProtocol节的customHeaders) 模块(modules) 处置程序(handlers)

         其中的一些设置仅适用于集成形式,而不适用于经典形式,如经典形式下运转的应用程序则疏忽web.config的system.WebServer节中指定的一切托管代码模块和处置程序,

         这种形式下web应用程序应该在syste.web节的httpModules和httpHandlers中定义模块和处置程序。


20.Http协议

         1、http协议是浏览器和服务器双方共同遵循的规范,是一种基于TCP/IP应用层协议

         2、http是一种典型的请求/响应协议。客户端发送请求,请求的内容以及参数存放到请求报文里面,服务端收到请求后,做出响应,

            返回响应的结果放到响应报文里面。通过F12可以查看请求报文和响应报文

         3、http协议是”无状态”的,当客户端向服务端发送一次http请求后,服务端收到请求然后返回给客户端相应的结果,服务器会立即断开连接并释放资源。

            在实际开发过程中,我们有时需要“保持”这种状态,所以衍生出了Session/Cookie这些技术。

         4、http请求的方式主要有get/post。http状态码:200(请求成功)、404(请求的资源不存在)、403(禁止访问)、5xx(服务端错误)

 

21.关于代码优化你怎么理解?你会考虑去代码重构吗?

         1、对于代码优化,之前的公司每周会做代码审核,审核的主要作用就是保证代码的正确性和执行效率,

            比如减少代码的层级结构、避免循环嵌套、避免循环CURD数据库、尽量避免一次取出大量数据放在内存中(容易内存溢出)、优化算法等。

         2、对于陈旧代码,可能很多地方有调用,并且开发和维护人员很有可能不是同一个人,所以重构时要格外小心,

            如果没有十足的把握,不要轻易重构。如果必须要重构,必须做好充分的单元测试和全局测试。


23.MVC 架构的技术实现,怎样理解的

         MVC的架构方式会让系 统的可维护性更高,使得每一部分更加专注自己的职责,并且MVC提供了强大的路由机制,方便了页面切换和界面交互


24.Session 的几种存储方式及优缺点

         1.基于数据库的Session共享

         2.基于NFS共享文件系统

         3.基于memcached 的session,如何保证 memcached 本身的高可用性?

         4. 基于resin/tomcat web容器本身的session复制机制

         5. 基于TT/Redis 或 jbosscache 进行 session 共享。

         6. 基于cookie 进行session共享


25.多线程 有几种启动方式

         使用new Thread()和new Thread(Runnable)形式

         第一种直接调用thread的run方法,所以,往往使用Thread子类,new Thread(){}.start();这表示调用Thread子类对象的run方法,

         new Thread(){}表示一个Thread的匿名子类的实例对象。

         第二种调用Runnable的run方法。

         new Thread(new Runnable(){}).start();这表示调用Thread对象接受的Runnable对象的run方法,new Runnable(){}表示一个Runnable的匿名子类的实例对象,

 

26.数据库锁有几种

         共享(S)锁:多个事务可封锁一个共享页;任何事务都不能修改该页; 通常是该页被读取完毕,S锁立即被释放。

         排它(X)锁:仅允许一个事务封锁此页;其他任何事务必须等到X锁被释放才能对该页进行访问;X锁一直到事务结束才能被释放。

         更新(U)锁:用来预定要对此页施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;当被读取的页将要被更新时,则升级为X锁;U锁一直到事务结束时才能被释放。

 

27.两个html页面之间怎么传递参数值

         1 如果页面A和页面B是同域的情况,使用Cookie传递参数 ,a页面保存Cookie,b页面读取

         2.如果页面A和页面B不同域的情况,页面A通过点击链接跳转到页面B的话,那么数据可以通过search和hash附加在B页面的URL上,传递给页面B,window对象它们是共享的,

           因此我们可以通过window.xx来传递数据,比如window.name=123;

         3.如果页面A和B,不同域,也没有跳转关系,如果浏览器支持HTML5的话,我们可以使用window.postMessage来跨域发送数据。

         4.剩下的,除非使用第三方的插件,比如flash,activex或者通过借助中转服务器,那么两者之间的数据是无法正常交互的。

 

28.用到了那些分布式\集群

         简单说,分布式是以缩短单个任务的执行时间来提升效率的(WCF),而集群则是通过提高单位时间内执行的任务数来提升效率(图片上传另一台服务器)。

         例如:如果一个任务由10个子任务组成,每个子任务单独执行需1小时,则在一台服务器上执行该任务需10小时。

         采用分布式方案,提供10台服务器,每台服务器只负责处理一个子任务,不考虑子任务间的依赖关系,执行完这个任务只需一个小时。

         (这种工作模式的一个典型代表就是Hadoop的Map/Reduce分布式计算模型)

         而采用集群方案,同样提供10台服务器,每台服务器都能独立处理这个任务。假设有10个任务同时到达,10个服务器将同时工作,1小时后,10个任务同时完成

         ,这样,整身来看,还是1小时内完成一个任务!

         集群一般被分为三种类型,高可用集群如RHCS、LifeKeeper等,负载均衡集群如LVS等、高性能运算集群;分布式应该是高性能运算集群范畴内。

         分布式:不同的业务模块部署在不同的服务器上或者同一个业务模块分拆多个子业务,部署在不同的服务器上,解决高并发的问题

         集群:同一个业务部署在多台机器上,提高系统可用性


29. viewstate内部结构?是如何加密的?

         ViewState并不神秘,就是一个Hidden字段,实际上它的内部也就是个Hash表,通过Key值来保存和检索数据,ViewState中产生一个标记(唯一的Hash值)

         ,使这个ViewState只适用与对应的页面

 

===================================汽车之家笔试题=========================

32. 最进学习的比较深刻的知识点

         Angular.js: AngularJS 是一个 JavaScript 框架, 最为核心的特性是 MVVM、模块化、自动化双向数据绑定、语义化标签、依赖注入等等

      

33. 平时是如何学习的