一、数据库部分

  1. 简单介绍下关系数据库三范式
    范式指的是数据库设计时要遵循的三个规范,但并不是强制式的,这三个规范呈阶梯式的关系,现有第一层然后在第一层的基础上有第二层...
    第一范式规定列数据不可分割,即实体中的某个属性不能有多个值或者重复的属性;第二范式要求每个行必须可以被唯一的区分,就是表中必须有主键存在的意思;第三范式规定表中不包含已在其他表中已包含的非主关键字信息,意思是除了外键之外不能存储其他表的数据信息。
    反三范式:出于对效率和便利性的追求,可以违反三范式设置重复或可以推导出的字段,比如为了在查询订单的总价时可以不用去计算每个订单项中的单价和在订单表中设置订单总价字段。
  2. 可以简单介绍下什么是事务?
    事务是并发控制的最小单位(需要满足ACID),用户定义的一个操作序列要么都执行成功,要么都执行失败,比如转账,A扣钱,B加钱,这两个操作必须是不可分割的,在commit之后也不能被干扰,将执行的代码try/catch并调用回滚rollback撤销当前事务操作。
  3. mysql数据库的默认的最大连接数?
    mysql数据的默认连接数大小是100,数据库在安装时都会设置一个最大连接数,这是因为一般服务器都只能支持一定数目同时连接。
  4. 说一下msyql的分页?oracle的分页?
    oracle的分页是采用了三层嵌套查询,没有用过不赘言。
    mysql是使用关键字limit来进行分页查询的''
String sql ="select * from students order by id limit " + pageSize*(pageNumber-1) + "," + pageSize;
  1. 存储过程是什么?它有什么优缺点?
    存储过程本质上是sql语句的集合,这些集合像一个方法一样实现某一特定的功能,通过设置名称的方式提供调用。
    由于是预编译的代码块,所以执行效率会比较高;由于很多SQL一起执行,所以节省网络带宽;存储过程提供安全机制,可以对于没有权限执行存储过程的用户进行控制;
    缺点则是调试和更改时比较麻烦,而且也没办法做缓存和做数据库集群。因此对于存储过程的使用要慎重,对于提高SQL查询的性能而言,ORM框架做的会比存储过程好。
    SQL语言本质是一种结构化查询语言,复杂的业务逻辑还是应该通过代码去实现。
  2. 有没有做过数据库优化方面的事情?
    主要是使用索引、分表和缓存来做数据库优化,当有多个数据库服务器时,还可以采用读写分离的方式做数据库集群。
  3. 数据库优化之创建合适的索引
  • 普通索引:允许重复的值出现
  • 唯一索引:除了不能重复记录之外,其它的和普通索引一样,例如用户名,身份证,email,tel
  • 主键索引:将表中某列设置为主键的时候数据库引擎会自动将该列设置为主键索引,这个主键索引唯一并且没有不能为null
  • 全文索引:主要针对表中的文本域进行索引,比如char,varchar,text等字段
    索引的弊端一是占用磁盘空间,二是对DML(增删改)操作会降低效率。
    索引配合where条件,一般在字段内容不是频繁变化的时候使用,并且该字段的内容不是唯一的几个值,例如性别这个字段只有男女或未知
    索引使用的技巧:对于like查询,如果模糊信息为'%aaa'的话就不会使用索引,因此在like查询中,关键字的最前面最好不要使用'%'或者'_'这样的字符,如果前面的值一定要有变化,则考虑使用全文索引(sphinx);如果条件查询中带有'or'关键字就不会使用索引,所以要避免使用'or'关键字;如果列是字符串类型,无论是不是字符串数字都要使用''包括起来,否则当值是数值类型的话会自动转换,如果不是数值类型则会报错;当表中只有一条数据时,全表扫描要比索引快,所以为了"效率"的查询数据,应该使用全表扫描的方式,233...
  1. 数据库优化之分表
    当数据库单个表中数据越来越大(百万级别)的时候会导致数据查询缓慢,又因为数据库是多用户共享资源,并发存取同一数据的时候时需要添加锁机制来控制用户操作,所以会出现数据库性能瓶颈。这个时候就需要对数据库进行分表,就是把数据量大的表分成多个数据表,比如商品SPU和SKU表的商品描述信息进行表抽取和对单个数据比如价格,0-100和100-200在不同表中或通过自增长ID切割,这是水平分表。比如在电商项目中类似商品的分类、创建时间、品牌和规格等信息具有变化频率慢,查询次数多,而且有很好的实时性的数据,把这样的数据称之为冷数据;类似商品评论,广告,销量和价格排序这些变化频率慢的数据称之为热数据。将这些数据通过更改存储引擎,使用memcache、redis和从库配置等进行不同的处理。
  2. 数据库优化之读写分离
    一台数据库服务器所支持的最大并发连接数是有限的,如果用户并发访问太多就需要考虑搭建集群,读写分离就是mysql处理集群的相关技术。使用负载均衡来实现写操作往主数据库库中去,读操作往从数据库中去。数据库最终都会把数据库持久化到磁盘,因此集群必须保证每个数据库服务器中数据是一致的,这就是主从同步技术。
  3. 数据库优化之缓存
    每次读取数据都需要操作数据库,这对数据库很不友好,所以需要在持久层DAO和数据库DB中添加一个缓存层,这个缓存层一般都使用内存实现,如果访问的数据能够从缓存服务器中读取,那么就不会访问数据库。在Java中的缓存有ORM框架的二级缓存,需要注意的是Hibernate的二级缓存不能完成分布式缓存,还有可以使用memcache或者redis来对缓存的数据进行集中处理。

二、前端部分

  1. 简单说一下html,css,javascript在网页开发中的定位?
  • HTML 超文本标记语言 定义网页的结构
  • CSS 层叠样式表,用来美化页面
  • JavaScript主要用来验证表单,做动态交互(其中ajax)
  1. 简单介绍一下Ajax?
    如果不使用ajax,拿直播页面来说,你点击直播间的刷新按钮,那么包括弹幕在内的整个网页都会刷新。所以ajax不只是一门技术,只要是通过js调用异步通讯组件并使用格式化数据来更新页面上的内容就可以说是ajax,它实现了页面中局部位置的定点刷新。
    ajax全称AsynchronousJavascript+XML(异步传输+js+xml),所谓异步就是在向服务器发送请求的时候不需要等待结果就可以做其他事,这就代表你可以在一个页面上同时看直播视频界面和弹幕。现在一般使用json来代替xml,好处是json更加简洁,解析速度也更快。
    ajax原理是通过创建XmlHttpRequest对象,XmlHttpRequest是js提供的一个为客户端提供客户端与服务器之间传输数据的API对象。通过这个API对象调用onreadystatechange事件,该事件用于获取客户端浏览器向服务器发送数据的状态(200,404等),得到状态之后就会调用编写的回调函数。在这个过程中,其他代码还是在不断接收数据解析数据的,只是不会阻塞js代码。
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () { //存储函数 当readyState属性发生改变时就会调用 Fuck(xhr.readyState);//readyState属性 0=请求未初始化,1=服务器连接已建立,2=请求已连接,3=请求处理中,4=请求已完成,且响应就绪 Fuck(xhr.status);//status属性 200=ok,404=访问资源未找到,401=没有访问权限,402=预留的状态码,403=禁止访问,500=服务器内部错误等等 }
缺点:ajax破坏了浏览器的back和history机制;违反了URL资源定位设计的初衷;对搜索引擎(SEO)有影响;不能很好的支持移动设备;破坏了程序的异常处理机制;由于现在的程序将大量原先在后端的代码放到了js文件中会导致客户端程序复杂并存在安全隐患。

使用场景:登录失败时不跳转页面,注册时提示用户名是否存在,二级联动。
  1. js和jQuery的关系?
    JQ是一个封装了js属性和方法的框架,可以让开发者使用便利的同时也增强了js的功能,如果是使用原生js的话就需要处理很多兼容性问题和事件绑定,dom操作,ajax,注册事件等。JQ常用的选择器有ID选择器,class选择器,标签选择器等。
  2. jQuery的页面加载完毕事件?
    在js中想要获取元素必须要先加载元素,可以将获取元素的js代码放到元素标签后,但是这样会造成管理上的不便,所以一般等页面全部加载之后在获取元素。一般使用$(funcation(){});//当页面加载完毕之后会执行花括号中的函数,这是相对简单的方式,因此使用也是最多的。
    需要注意的是JQ中的页面加载是指页面结构被加载完毕,而window.onload表示的是页面被加载完毕。
<img src=”htttp://baidu.com/1.jpg”/>

onload必须等页面中的图片、声音、图像等远程资源被加载完毕后才调用,而jQuery中只需要页面结构被加载完毕。

  1. 简单说一下html5和css3?你对现在的那些新技术有了解?
    html5是最新版本的html,在html4的基础上增强了一些标签,比如画板,声音,视频,web存储这些功能。但是html5过于强调语义,比如使用header标签表示头部,footer表示底部。以前在开发都是采用div标签定义模块。
    css3在css2的基础上做了增强,实现了一些原来在css2中实现起来比较困难,或者不能实现的功能,比如盒子和文字阴影,渐变,动画等。css3的缺点在于需要根据不同的浏览器处理兼容性,其实html5也有兼容性问题,比如html5播放器panda.tv就出于兼容性的考虑没有使用html5播放器。

三、框架部分

  1. 什么是框架?
    it语境中的框架是指为了解决某一开放性问题而设计的具有一定约束性的支撑结构,在这种结构上可以根据具体问题进行扩展,从而便捷的构建完整的解决问题的方案。
  • 框架不能完全解决实际上遇到的问题,但可以快速的解决普遍问题。
  • 框架是为了扩展而设计的
  • 一般框架会提供很多辅助性的实用工具,比如java的一系列jar包就是对jdk功能的扩展。
  1. 简单讲一下SpringMVC的执行流程?
    SpringMVC本质上是一个前端控制器(DispatcherServlet),通过对处理器映射器,处理器适配器和视图解析器的调度来实现接收请求和响应数据。
  2. 说一下struts2和springMVC有什么不同?
    MVC的核心是Servlet,Strtus2的核心是Filter;MVC一般使用注解开发,Strtus2一般使用xml配置;MVC处理ajax请求,直接返回数据,在方法中通过注解@RequestBody,MVC就会自动将对象转换成json数据;而strtus2是通过插件转换的。
  3. 说一下Spring中的两大核心?
    IoC(Inversion of Control)或者称之为DI(Dependency Injection)是指程序将DAO的创建权交付Spring管理,通过配置文件和反射再加上Map来实现自动创建Bean。
    AOP(Aspect Oriented Programming)被称之为面向切面编程,使用动态代理的方式在执行方法前后或应用程序出现异常时加入相关逻辑。比如对于事务和日志的处理。
  4. 什么是ORM?
    对象关系映射简称ORM(Object Relational Mapping),通过对数据和对象之间映射元数据的方式,将程序中的对象自动持久化到关系数据库。
  5. iBatis(mybatis)与Hibernate有什么不同?
    mybatis的好处在于将sql语句与java代码分离并提供将结果集自动封装为实体对象和对象集合的功能,还提供了自动将实体对象的属性传递给sql语句的参数这样的功能。
    hibernate的好处在于可以自动生成sql语句并执行同时返回java结果。
    两者最大的不同在于mybatis是面向sql的所以需要在xml配置文件中写sql,而hibernate是自动生成sql,需要考虑对象之间复杂的映射关系。因为这个特性所以hibernate无法完成特别复杂的查询。

四、其他部分

  1. 有没有用过linux?你都用它来做什么?
    linux的特点是长时间运行比较稳定,所以一般会用做服务器。linux提供C语言编译环境,所以需要C语言支持的redis和nginx等可以通过在C语言编译环境中获取软件包并运行。
  2. 说一下linux下面的一下常用命令?
  • 查看文件 tail -f
  • 删除文件 rm -rf
  • 编辑文件 vi
  • 创建文件夹 mkdir
  • 删除文件夹 rm -f
  • 获取当前路径 pwd
  • 跳转目录 cd
  • 切换用户 su -root
  • 列举目录 ls
  1. 你是使用什么来连接远程的Linux服务器的?
  • 需要依赖于Linux服务器安装ssh服务端,一般这个ssh服务的端口22.
  • 需要依赖于Linux服务器安装sftp服务端,一般这个sftp服务的端口25.
  • 使用xshell、putty等ssh客户端来连接服务器,使用xftp、winscp等sftp客户端来上传和现在文件。连接和上传、下载必须依赖于服务器的ssh、sftp服务,也就是linux服务器需要启动这两个服务。
  1. 没有使用过云主机?
    客户有租用过阿里的云主机,云主机就是一些云服务运营商比如阿里,腾讯,华为等提供远程的服务器功能,开发者只需要按需付费即可租用。使用ssh和sftp操作
  2. 有没有使用过redis? redis是什么
    redis是一个key-value的nosql的数据库,redis会先将数据存储到内存中,然后根据一定的策略持久化到磁盘,已达到断电也不会丢失数据。主要用来做缓存数据库的数据和做web集群的时候当做中央缓存存放session。
  3. redis的数据淘汰机制
    在 redis 中,允许用户设置最大使用内存大小 server.maxmemory,在内存限定的情况下是很有用的。譬如,在一台 8G 机子上部署了 4 个 redis 服务点,每一个服务点分配 1.5G 的内存大小,减少内存紧张的情况,由此获取更为稳健的服务。
    内存大小有限,需要保存有效的数据?redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
    redis 提供 6种数据淘汰策略:
  • volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  • no-enviction(驱逐):禁止驱逐数据
  1. 微信开发原理
    微信公众平台开发者,通过接入认证的方式,让我们的服务器能处理来自微信服务器转发的微信用户的请求,处理完成后返回给微信服务器,有微信服务器对用户响应。
  2. 怎么把微信和业务平台绑定?
    用户注册实体中包含一个微信号的字段,进行绑定操作的时候就是修改这个微信号的字段,我们需要通过微信网页授权的方式获取微信号。
    当用户同意授权的时候我们可以得到一个code,通过这个code换取网页授权的微信号,就是openid,最后将openid存入到微信号字段中即可