初级程序员面试专题整理(下)

Posted 寒月菌菌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初级程序员面试专题整理(下)相关的知识,希望对你有一定的参考价值。

目录:

2.6 高级部分

2.6.1 有没有用过linux?你都用它来做什么?

Linux是一个长时间运行比较稳定的操作系统,所有我们一般会拿它作为服务器(web,db,app)

Linux本身具有C的编译环境、我们的一些软件是没有软件包(redisnginx)的,需要在LinuxC编译环境编译得到软件包.

 

2.6.2 说一下linux下面的一下常用命令?

常用:

Pwd 获取当前路径

Cd 跳转到目录

Su -u 切换到管理员

Ls ls 列举目录

文件操作命令:

文件

   tail 查看

   rm -rf

   vi

文件夹

   mkdir

   rm -r

 

2.6.3 你是使用什么来连接远程的Linux服务器的?

需要依赖于Linux服务器安装ssh服务端,一般这个ssh服务的端口22.

需要依赖于Linux服务器安装sftp服务端,一般这个sftp服务的端口25.

 

使用ssh客户端连接linux服务器,就有点儿像windows下面的远程连接。但是linux通过ssh连接上以后是没有图形界面,全是命令行。

Putty

Xshell

使用sftp客户端来连接sftp服务端,来上传和下载文件.(上传安装包,修改了配置文件上传。)

 

Winscp

xftp

 

企业中常用的两种组合:

     putty+winscp

     Xshell+xftp=xmanager

 

 

面试:使用xshellputtyssh客户端来连接服务器,使用xftpwinscpsftp客户端来上传和现在文件。连接和上传、下载必须依赖于服务器的sshsftp服务,也就是linux服务器需要启动这两个服务。

 

2.6.4 有没有使用过云主机?

使用过,在原来的公司,我们没有使用自己的服务器,而是租用阿里的云主机。

没有使用过,但是有所了解。

 

云主机就是一些云服务运营商(阿里、华为、西部数码、新浪等),提供的远程的服务器功能,我们开发者或者企业只需按需付费就可以租用对应的服务器。

 

使用sshsftp来进行操作。

 

2.6.5 有没有做过数据库优化方面的事情?

 做过mysql数据库的优化、其他数据库类似

定位:查找、定位慢查询

优化手段:

a) 创建索引:创建合适的索引,我们就可以现在索引中查询,查询到以后直接找对应的记录。

b) 分表   :当一张表的数据比较多或者一张表的某些字段的值比较多并且很少使用时,采用水平分表和垂直分表来优化

c) 读写分离:当一台服务器不能满足需求时,采用读写分离的方式进行集群。

d) 缓存:使用redis来进行缓存

e) 一些常用优化技巧

 

   2.6.6 查找慢查询并定位慢查询?

   在项目自验项目转测试之前,在启动mysql数据库时开启慢查询,并且把执行慢的语句写到日志中,在运行一定时间后。通过查看日志找到慢查询语句。

 

要找出项目中的慢Sql

1、关闭数据库服务器(关闭服务)

2把慢查询记录到日志中

 

3、设置慢查询时间

 

4、找出日志中的慢查询SQL

  

   使用explain 慢查询语句,来详细分析语句的问题.

 

 

 

 

2.6.6 数据库优化之遵循范式?

 数据库表设计时需要遵循方式

 表的范式,是首先符合1NF, 才能满足2NF , 进一步满足3NF

1NF: 即表的列的具有原子性,不可再分解,即列的信息,不能分解.只要数据库是关系型数据库(mysql/oracle/db2/sysbase/sql server),就自动的满足1NF.关系型数据库中是不允许分割列的。

2NF:表中的记录是唯一的.通常我们设计一个主键来实现

3NF:即表中不要有冗余数据, 就是说,表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放.(外键)

3NF :没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余 订单和订单项、相册浏览次数和照片的浏览次数

2.6.7 选择合适的存储引擎

在开发中,我们经常使用的存储引擎 myisam / innodb/ memory

MyISAM存储引擎

如果表对事务要求不高,同时是以查询和添加为主的,我们考虑使用myisam存储引擎. 比如 bbs 中的 发帖表,回复表.

 

INNODB存储引擎:

对事务要求高,保存的数据都是重要数据,我们建议使用INNODB,比如订单表,账号表.

 

Memory 存储

我们数据变化频繁,不需要入库,同时又频繁的查询和修改,我们考虑使用memory, 速度极快.

 

MyISAM INNODB的区别(主要)

1. 事务安全 myisam不支持事务而innodb支持

2. 查询和添加速度 myisam不用支持事务就不用考虑同步锁,查找和添加和添加的速度快

3. 支持全文索引 myisam支持innodb不支持

4. 锁机制 myisam支持表锁而innodb支持行锁(事务)

5. 外键 MyISAM 不支持外键, INNODB支持外键. (通常不设置外键,通常是在程序中保证数据的一致)

 

 

 

 

 

2.6.8 数据库优化之创建合适的索引?

索引(Index)是帮助DBMS高效获取数据的数据结构

分类:普通索引/唯一索引/键索引/全文索引

普通索引:允许重复的值出现

唯一索引:除了不能有重复的记录外,其它和普通索引一样(用户名、用户身份证、email,tel)

主键索引:是随着设定主键而创建的,也就是把某个列设为主键的时候,数据库就会給改列创建索引。这就是主键索引.唯一且没有null

全文索引:用来对表中的文本域(charvarchartext)进行索引, 全文索引针对MyIsam

explain select * from articles where match(title,body) against(database);【会使用全文索引】

2.6.9 索引使用小技巧?*****

索引弊端

1.占用磁盘空间

2.dml(插入、修改、删除)操作有影响,变慢

使用场景:

a: 肯定在where条件经常使用,如果不做查询就没有意义

b: 该字段的内容不是唯一的几个值(sex)

c: 字段内容不是频繁变化.

 

具体技巧:

1. 对于创建的多列索引复合索引不是使用的第一部分就不会使用索引。

alter table dept add index my_ind (dname,loc); // dname 左边的列,loc就是右边的列

explain select * from dept where dname='aaa'\G 会使用到索引

explain select * from dept where loc='aaa'\G 就不会使用到索引

 

2. 对于使用like的查询,查询如果是%aaa’不会使用到索引aaa%’会使用到索引。

   explain select * from dept where dname like '%aaa'\G不能使用索引

   explain select * from dept where dname like 'aaa%'\G使用索引.

所以like查询时,关键字最前面不能使用 % 或者 _这样的字符.,如果一定要前面有变化的值,则考虑使用 全文索引->sphinx.

 

3. 如果条件中有or有条件没有使用索引,即使其中有条件带索引也不会使用。换言之,就是要求使用的所有字段,都必须单独使用时能使用索引.

   

 

4. 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。否则不使用索引

expain select * from dept where dname=111;

expain select * from dept where dname=111;(数值自动转字符串)

expain select * from dept where dname=qqq;报错

也就是,如果列是字符串类型,无论是不是字符串数字就一定要用 ‘’ 包括起来.

5. 如果mysql估计使用全表扫描要比使用索引快,则不使用索引。

   表里面只有一条记录

 

2.6.10 数据库优化之分表?

分表分为水平(按行)分表垂直(按列)分表

 

根据经验,Mysql表数据一般达到百万级别,查询效率会很低,容易造成表锁,甚至堆积很多连接,直接挂掉;水平分表能够很大程度较少这些压力。

按行数据进行分表。

 

如果一张表中某个字段值非常多(长文本、二进制等),而且只有在很少的情况下会查询。这时候就可以把字段多个单独放到一个表,通过外键关联起来。

     考试详情,一般我们只关注分数,不关注详情。

水平分表策略:

1.按时间分表

这种分表方式有一定的局限性,当数据有较强的实效性,如微博发送记录、微信消息记录等,这种数据很少有用户会查询几个月前的数据,如就可以按月分表。

2.按区间范围分表

一般在有严格的自增id需求上,如按照user_id水平分表:

table_1  user_id1~100w

table_2  user_id101~200w

table_3  user_id201~300w

3.hash分表*****

通过一个原始目标的ID或者名称通过一定的hash算法计算出数据存储表的表名,然后访问相应的表。

2.6.11 数据库优化之读写分离

一台数据库支持的最大并发连接数是有限的,如果用户并发访问太多。一台服务器满足不要要求是就可以集群处理。Mysql的集群处理技术最常用的就是读写分离。

 

主从同步

数据库最终会把数据持久化到磁盘,如果集群必须确保每个数据库服务器的数据是一直的。能改变数据库数据的操作都往主数据库去写而其他的数据库从主数据库上同步数据。

读写分离

   使用负载均衡来实现写的操作都往主数据去,而读的操作往从服务器去。

2.6.12 数据库优化之缓存

 持久层(dao)数据库(db)之间添加一个缓存层,如果用户访问的数据已经缓存起来时,在用户访问时直接从缓存中获取,不用访问数据库。而缓存是在操作内存级,访问速度快。

 

作用:减少数据库服务器压力,减少访问时间。

 

Java中常用的缓存有,

   1hibernate的二级缓存。该缓存不能完成分布式缓存。

 

2、可以使用redis(memcahe)来作为中央缓存。

        对缓存的数据进行集中处理

2.6.13 语句优化小技巧

DDL优化:

1 、通过禁用索引来提供导入数据性能 。 这个操作主要针对有数据库的表,追加数据

//去除键

alter table test3 DISABLE keys;

//批量插入数据

insert into test3 select * from test;

//恢复键

alter table test3 ENABLE keys;

 

2、 关闭唯一校验

set unique_checks=0  关闭

set unique_checks=1  开启

 

3、修改事务提交方式(导入)(变多次提交为一次)

set autocommit=0   关闭

//批量插入

set autocommit=1   开启

DML优化(变多次提交为一次)

insert into test values(1,2);

insert into test values(1,3);

insert into test values(1,4);

//合并多条为一条

insert into test values(1,2),(1,3),(1,4)

DQL优化

Order by优化

 1、多用索引排序

2、普通结果排序(非索引排序)Filesort

   group by优化

      是使用order by null,取消默认排序

   子查询优化

在客户列表找到不在支付列表的客户

#在客户列表找到不在“支付列表”的客户 , 查询没买过东西的客户

explain

select * from customer where customer_id not in (select DISTINCT customer_id from payment); #子查询      -- 这种是基于func外链

 

explain

select * from customer c left join payment p on(c.customer_id=p.customer_id) where p.customer_id is null   -- 这种是基于“索引”外链

   Or优化

在两个独立索引上使用or的性能优于

1or两边都是用索引字段做判断,性能好!!

2or两边,有一边不用,性能差

3、 如果employee表的nameemail这两列是一个复合索引,但是如果是 :name='A' OR email='B' 这种方式,不会用到索引!

  limit优化

select film_id,description from film order by title limit 50,5;

 

select a.film_id,a.description from film a inner join (select film_id from film order by title limit 50,5)b on a.film_id=b.film_id

 

 

 

2.6.14 jdbc批量插入几百万数据怎么实现?*****

1、变多次提交为一次

3、使用批量操作

 

 

省出的时间可观。

 

像这样的批量插入操作能不使用代码操作就不使用,可以使用存储过程来实现。

2.6.15 有没有使用过redis? Redis是什么  

 

Redis是一个key-valuenosql数据库.先存到内存中,会根据一定的策略持久化到磁盘,即使断电也不会丢失数据。支持的数据类型比较多。

 

主要用来做缓存数据库的数据和web集群时当做中央缓存存放seesion

 

2.4.15 Redismemche的比较?

 

 

1RedisMemcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等。

2Redis不仅仅支持简单的k/v类型的数据,同时还提供listsethash等数据结构的存储。

3、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘

   

2.6.16 简单说一下redis的使用场景?

缓存

把经常需要查询的、很少修改数据,放到读速度很快的空间(内存),以便下次访问减少时间。减轻压力,减少访问时间.

计数器

     redis中的计数器是原子性的内存操作

       可以解决库存溢出问题.进销存系统库存溢出。

session缓存服务器:

web集群时作为session缓存服务器

 

缓存队列等

2.6.17 redis对象保存方式?

Json字符串:

需要把对象转换为json字符串,当做字符串处理。直接使用set get来设置或者或。

优点:设置和获取比较简单

缺点:没有提供专门的方法,需要把把对象转换为json(jsonlib)

字节:

   需要做序列号,就是把对象序列化为字节保存。

 

如果是担心JSON转对象会消耗资源的情况,这个问题需要考量几个地方,

第一点:就是使用的JSON转换lib是否就会存在性能问题。

第二点:就是数据的数据量级别,如果是存储百万级的大数据对象,建议采用存储序列化对象方式。如果是少量的数据级对象,或者是数据对象字段不多,还是建议采用JSON转换成String方式。

毕竟redis对存储字符类型这部分优化的非常好。具体采用的方式与方法,还要看你所使用的场景。

 

 

2.6.18 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(驱逐):禁止驱逐数据

 

 

2.6.19 Java访问Redis

1、使用jedis java客户端来访问redis服务器,有点类似通过jdbc访问mysql一样。

2、当然如果是spring进行集成时,可以使用spring data来访问redis,spring data只是对jedis二次封装。jdbcTemplate jdbc关系一样

2.6.20 Redis集群

当一台数据无法满足要求,可以使用reids集群来处理,类似于mysql的读写分离。

2.6.21简单介绍一下微信公共号的分类?

   服务号:企业才能申请

   企业号:企业才能申请

2.6.22 微信开发原理

 

 

 

微信公众平台开发者,通过接入认证的方式,让我们的服务器能处理来自微信服务器转发的微信用户的请求,处理完成后返回给微信服务器,有微信服务器对用户响应。

2.6.23怎么把微信和业务平台绑定?

 

微信用户和注册用户绑定?

让微信用户也能完成注册用户的功能。

 

第一步:用户同意授权,获取code

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。

获取code后,请求以下链接获取access_token:  https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

{ "access_token":"ACCESS_TOKEN",    

 "expires_in":7200,    

 "refresh_token":"REFRESH_TOKEN",    

 "openid":"OPENID",    

 "scope":"SCOPE" }

 

 

 

 

 

2.7 项目和业务部分  

2.7.1项目分类

在公司中做的项目可以分为两种产品、项目.

项目:就是给一些公司接的项目,项目开发完成后。就交互,后面这个项目代码就不在维护了

产品:充分考虑扩展性和基本业务,来做一个产品。在这个产品上可以进行定制开发


2.7.2 项目参与者

   产品经理?PM?架构师(SE)?(开发PL? MDE?可能会有多个) (测试PL TSE可能会有多个)   UI 资料

 

 

开发团队:开始代码能完成需求

测试团队:测试功能

UI:负责界面设计、静态代码的编写

资料:负责界面的文字描述。

QA:通过项目质量监控,PM,SE同级

 

开发和UI和资料,协同设计和开发,开发完成后转测试(测试策略)交给测试团队进行测试,测试完成后会出一个测试报告。

2.7.3 项目流程

   可行性分析和立项和开工会

   需求分析

   需求设计

   项目开发(多个迭代)

        迭代开工会

        迭代设计

   迭代开发

   迭代测试

   集成测试

   迭代发布

        迭代总结

        ....不断迭代

   项目验收

   项目总结

   

 

2.7.4 业务注意事项

1、不要多个项目都说你同一个模块。如果要说,就说后面是进行改进。

   pss,crm,shopping都写权限模块

2多写点业务


以上是关于初级程序员面试专题整理(下)的主要内容,如果未能解决你的问题,请参考以下文章

你会的还只有初级安卓工程师的技术吗?专题解析

Spring经典面试题,帮你整理好了,公司初级程序员Java面试题

C#130问,初级程序员的面试宝典

阿里Java面试官分享初级Java程序员通过面试的技巧

程序源代码初级程序员面试那道关

程序员面试注意事项-通用版(初级篇)