随手科技(随手记)2017招聘Java工程师笔试题

一  如何解决多台web服务器粘性会话的问题?

粘性session:web服务器会把某个用户的请求,交给tomcat集群中的一个节点,以后此节点就负责该保存该用户的session,如果此节点挂掉,那么该用户的session也会消失。
非粘性session:通过负载均衡器会根据节点的情况,把用户的请求进行分发,也就是会复制多份session分发给多个节点,这样,如果节点中其中一个session挂掉的话,其它的还能继续工作,也就是只要有一个节点没有挂掉,该用户的信息就不会消失:

1. 利用Memcache/Redis共享Session数据:搭建Memcache/Redis集群,将用户Session写入Memcache/Redis,设置key值的有效期,即Session的有效期。一般来说缓存的并发性能高于数据库,这个方法可以获得较大的负载量

2 利用数据库共享Session数据:创建一个数据库库专门存放用户Session,用户登录一次插入一条数据(如果第一次登录),并由程序去维护Session的时效性。这个做法的弊端是,数据库的负担很大而且本来就是容易产生瓶颈的地方,日活的增加导致性能问题。

二  假如某项目上线后,系统经常出现宕机或者假死,请问应该从哪几个方面去分析解决?

三  描述一下常见一些hash算法的应用场景

1. 校验安装文件的完整性,在软件部署的时候,计算软件包当前的哈希值是否与预设值相等,防止软件包被篡改或被替换
2. 存储和校验用户口令,用户口令不能用明文存储,更进一步,如果系统不知道用户口令明文,那就更好了,而哈希算法就可以做到既不知道用户明文,又可以校验用户口令
3. 作为数据库表分区的分区条件

四  假如有100W个敏感词汇表,如何从一段网络文章里快速找出是否存在敏感词。

https://www.cnblogs.com/AlanLee/p/5329555.html

五  请描述ThreadLocal的作用以及使用场合,在程序中用来传递数据合适不合适?

  ThreadLocal并不是一个Thread,而是Thread的局部变量。针对每个线程提供自己的变量版本,每个线程维护自己的版本,彼此独立,修改不会影响到对方,避免线程冲突。譬如在Web开发中,存放一次请求的Context。在程序中传递数据是不合适的,ThreadLocal携带多个线程变量版本,传递数据浪费性能

六  请描述一下系统信息安全方面的一些常见攻击手段与预防方法?

1 口令破解:可以采用字典破解和暴力破解来获得口令。

2 IP欺骗::攻击者可以通过伪装成被信任的IP地址等方式来获取目标的信任。这主要是针对防火墙的IP包过滤以及LINUX/UNIX下建立的IP地址信任关系的主机实施欺骗。 

3 DNS欺骗:由于DNS服务器相互交换信息的时候并不建立身份验证,这就使得黑客可以使用错误的信息将用户引向错误主机。 

5 DdoS攻击 :DdoS攻击(Distributed Denial of Server,分布式拒绝服务)是一种基于DOS的特殊形式的拒绝服务攻击,是一种分布协作的大规模攻击方式,主要瞄准比较大的站点,像商业公司、搜索引擎和政府部门的站点。他利用一批受控制的机器向一台目标机器发起攻击,这样来势迅猛的攻击令人难以防备,因此具有很大的破坏性。 

6 缓冲区溢出攻击(buffer overflow)
通过往程序的缓冲区写超过其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其他指令,以达到攻击的目的。缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在,根据统计:通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上。利用缓冲区溢出攻击可以导致程序运行失败、系统死机、重新启动等后果,更严重的是,可以利用他执行非授权的指令,甚至可以取得系统特权,进而进行各种非法操作。由于他历史悠久、危害巨大,被称为数十年来攻击和防卫的弱点。
社交工程(Social Engineering)

七  请列举几个Linux常见命令:

实时查看服务器日志文件内容

tail -f 

修改文件用户所有者以及所在组

chown命令来改变文件所有者:chown [-R] 账号名称 文件或目录
chgrp命令来改变文件所属用户组:chgrp [-R] 用户组名称 文件或目录

查看服务器内存使用情况

 free 

查找进程名称包括tomcat的进程ID

ps -ef|grep tomcat

查看服务器磁盘空间使用情况

 dh -f

查看服务器IO压力情况

 top

检测连接到服务器每个节点的连接速度

netstat -an

创建一个/local/usr/mysql/dbfile到/data/mysql/dbfile目录的软链接  

 ln -s /local/usr/mysql/dbfile/   /data/mysql/dbfile/

八  在多服务器集群部署的情况下,如何避免并发带来的问题,比如一个理财产品剩余金额为10000,如何应对抢购?

解决秒杀抢购类的关键思路是:尽量将请求拦截在系统上游,减轻数据库压力

1 最简单的方式是采用数据库事务处理,由于数据库并发量有效,无法应对极大流量的抢购

当某用户进入抢购时,假定一个用户只能抢购一份,执行事务伪代码如下:

begin transaction;

select balace from 产品表 where product_id = xx for update;

if(balace<1) return;

...创建订单

update 产品表 set balace=balace-1;

end transaction;

2 采用Redis的事务功能和Watch特性,可以承受较大并发量

http://blog.csdn.net/e421083458/article/details/49741451

 http://www.cnblogs.com/longtaosoft/p/6627568.html

九 Java中自带哪些线程池,分别的应用场景是什么?

Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行

http://cuisuqiang.iteye.com/blog/2019372

http://www.importnew.com/16797.html

十  mysql数据库有以下三个表及字段说明

Columns of "Person" Table,人员表
Column Name DataType Comment
 pcode  int  人员代码,主键
name varchar(100) 姓名
gender varchar(10) 性别
age int 年龄
org_code int 所在单位的单位代码,外键
email varchar(100) 电子邮件

 

Columns of "Organization" Table,单位表
Column Name DataType Comment
org_code int 单位代码,主键
name varchar(100) 单位名称
province varchar(100) 单位所在省份或者直辖市

 

Columns of "UserGroup" Table,人员角色表
Column Name DataType Comment
pcode int 人员代码
group_no varchar(10) 角色码,“20”:项目负责人,“10”:单位联络人

 

A 由于深圳大学的邮箱发生变更,需要紧急将深圳大学所有单位联络人的邮箱(eg:zhangshan@szdx.edu.cn),域名"szdx.edu.cn"从替换成"szu.edu.cn",请写出SQL语句

update person set email = replace(email, 'szdx,edu.cn', 'szu.edu.cn') 
where email like '%szdx.edu.cn' and org_code in (select org_code from organization where name = '深圳大学') and pcode in (select pcode from usergroup where group_no = '10')

B 现在要查询出北京市每个单位的单位联络人平均年龄,请写出SQL语句,结果输出:单位代码,单位名称,平均年龄

select p.org_code as 单位代码,o.name as 单位代码, avg(p.age) as 平均年龄 from person p left join organization o on p.org_code = o.org_code where pcode in (select pcode from usergroup where group_no = '10')
group by o.org_code

C 统计全国每个单位的项目负责人年龄小于40岁的人数,结果输出:单位代码,单位名称,人数

select p.org_code as 单位代码,o.name as 单位代码, count(p.age) as 人数 from person p left join organization o on p.org_code = o.org_code where pcode in (select pcode from usergroup where group_no = '20')  and p.age < 40
group by o.org_code

  

posted @ 2017-11-27 16:44  编码专家  阅读(4327)  评论(2编辑  收藏  举报