0%

面试准备

并发编程(11.5上午)

并发和并行的区别?
  • 并发:两个及两个以上的作业在同一时间段内执行。

  • 并行:两个及两个以上的作业在同一时刻执行。

注:在计算机操作系统中,作业(Job)是计算机操作员(或称为作业调度程序的程序)提供给操作系统执行任务的工作单元

同步和异步的区别?
  • 同步:发出一个调用后,在没有得到结果前,该调用就不可以返回,一直等待。

  • 异步:调用在发出之后,不用等待返回结果,该调用直接返回。

java集合(11.5下午)

8:30

Mysql索引(11.5下午)

10:30

操作系统(11.5晚上)

9:00

JVM(11.6上午)

内存溢出(OutOfMemory OOM)

指应用程序系统中存在无法释放的内存或者使用的内存过多,最终导致程序运行需要的内存大于能提供的最大内存,导致程序运行失败,提示内存溢出。

内存泄露

指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

Reids

10:00

Java框架 ssm+dubbo+zookeeper(11.6下午)

算法

烧一根不均匀的绳子需要1小时,若干条材质相同的绳子,要计时1小时15分,需要最少绳子?

有1000瓶药水,只有一瓶是有毒的,小白鼠喝了就会身亡,但是需要一天的时间才会有结果,而且你只有一天时间去判断,问题是,如何使用最少的小白鼠,试验出哪瓶是毒药?

面试流程

自我介绍

面试官您好 我叫周威威 ,今年24岁,河南商丘人,本科毕业于长春理工大学软件工程专业,大学期间成绩优异,保送到东北大学攻读硕士研究生,现在是软件工程专业研三学生,我有扎实的计算机理论基础,熟悉操作系统、计算机网络、数据结构等,大学期间时参加了java培训班,系统学习了java、ssm框架、mysql,了解redis、消息队列、集群分布式等技术,项目经验丰富,先后开发的项目有《校园二手书交易平台》,《面对面餐饮管理系统》、《瑞吉外卖》、《传智健康管理系统》我乐观开朗,积极向上,学生期间参加过校运动会、国际马拉松迷你赛、班级篮球赛、新生迎新活动、担任过中美课程助教。喜欢运动、健身,有良好的身体素质,具备出色的学习能力,对未来充满信心,希望可以进入贵公司继续努力,与贵公司共同进步,祝您身体健康,万事如意,谢谢老师。

做的项目哪个最满意?
项目难点是什么?怎么解决的?

瑞吉外卖

1编辑菜品那块需要发送多次ajax请求 首先查询出所有的菜品分类 然后还要过去当前菜品所对应的口味数据进行页面回显

2新增菜品 需要上传图片到服务器 然后把图片名称存到数据库中 然后还需要图片下载进行页面回显

3短信验证码登陆 用到了阿里云的短信服务 算是个新东西吧 然后生成的验证码要缓存到redeis数据库中 之后与用户输入的验证码进行比对

4删除菜品 批量删除 接收前台数据是一个菜品id数组 需要先查询出所有对应的菜品记录 然后判断菜品是否处于停售状态 若不是则无法删除 否则 删除时还需要查询当前菜品对应的口味数据 从口味数据表中删除

5页面访问权限控制 配置了过滤器 用于页面访问控制 对于无法直接访问的资源 要先判断 用户是否登录 登录成功后要把用户id存到threadlocal线程类中 用于后续用户id获取

6设置了全局异常捕获 不用再在类中处理异常 而是统一到一个文件中处理 简化开发 方便高效

7定义了返回到前台的数据模型 这样后台返到前台数据统一 开发高效简洁

8 设计了数据传输对象dto 用于封装 实现了表现层和Model之间的解耦

服务器提示6379端口 存在违规行为 对外攻击

原因是因为6379端口对应的redis数据库没有设置密码

有一天系统无法使用了,我发现是登陆界面一直显示加载中,然后我就到服务器上查看日志,发现显示连接数据库出错了,然后查看了一下mysql数据库,发现我建的数据库不见了,然后多了一张表,是被比特币勒索了,需要三天内支付比特币才能恢复我的数据。这个问题是因为我的mysql数据库使用了弱密码,比特币也太贵了,而且也不能向不法分子低头,好在我本地还有备份,于是后来我就重新安装了mysql,设置了强密码,连接数据库时也不再使用root用户连接了,而是新建了一个用户,赋予它指定的权限,如果本地没有数据库备份或者备份不是最新的怎么办,于是我又加入了分库分表 数据库主从复制机制,大大提高了容灾能力。

Mysql主从复制

Mysql主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能,就是一台或多台MySQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。Mysql主从复制是Mysql数据库自带功能,无需借助第三方工具。

Mysql复制过程分为三步:

  • master将改变记录到二进制日志(binary log)
  • slave将master的binary log拷贝到它的中继日志(relay log)
  • slave重做中继日志中的事件,将改变应用到自己的数据库中
  1. 数据更安全:做了数据冗余,不会因为单台服务器的宕机而丢失数据
  2. 性能大大提升:一主多从,不同用户从不同数据库读取,性能提升
  3. 扩展性更优:流量增大时,可以方便的增加从服务器,不影响系统使用
  4. 负载均衡:一主多从相当于分担了主机任务,做了负载均衡。

项目部署

以前部署过java项目,但是分布式项目部署,以及数据库的分库分表还是第一次部署,对于nginx tomcat的配置以及linux查看日志排查错误有了更深一步的认识。

有一天系统访问失败了,查看日志发现数据库mysql挂掉了,重新启动发现无法启动,根据提示信息判断出是可用内存空间不足导致的,

传智健康

定时任务Quartz

有天发现存储图片的业务在服务器上占用存储很大,经过检验发现,存在垃圾图片,然后就使用定时任务组件Quartz,定时对图片服务器上垃圾图片进行处理。

新增套餐时套餐的基本信息和图片是分两次提交到后台的,也就是用户首先将图片上传到服务器,然后再提交新增窗口中输入的其他信息,如果用户只是上传了图片而没有提交录入的其他信息,此时的图片就变成了垃圾图片,因为数据库中并没有记录它的存在,如何处理呢。

解决方案就是通过定时任务组件定时清理这些垃圾组件,为了能够区分出来哪些是垃圾图片,我们在文件上传成功后将图片保存到了一个redis集合中,当套餐数据插入到数据库中我们又将图片名称保存到了另一个redis集合中,通过计算这两个集合的差值就可以获得所有垃圾图片的名称。

页面静态化freemarker

在实现了移动端套餐列表页面和套餐详情页面的动态展示后,我们需要思考一个问题,就是对于这两个页面来说,每次用户访问这两个页面都需要查询数据库获取动态数据进行展示,而且这两个页面的访问量是比较大的,这就对数据库造成了很大的访问压力,并且数据库中的数据变化频率并不高。那我们需要通过什么方法为数据库减压并提高系统运行性能呢?答案就是页面静态化。

页面静态化其实就是将原来的动态网页(例如通过ajax请求动态获取数据库中的数据并展示的网页)改为通过静态化技术生成的静态网页,这样用户在访问网页时,服务器直接给用户响应静态html页面,没有了动态查询数据库的过程。

那么这些静态HTML页面还需要我们自己去编写吗?其实并不需要,我们可以通过专门的页面静态化技术帮我们生成所需的静态HTML页面,例如:Freemarker、thymeleaf等。
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。

第一步:创建一个 Configuration 对象,直接 new 一个对象。构造方法的参数就是 freemarker的版本号。

第二步:设置模板文件所在的路径。

第三步:设置模板文件使用的字符集。一般就是 utf-8。

第四步:加载一个模板,创建一个模板对象。

第五步:创建一个模板使用的数据集,可以是 pojo 也可以是 map。一般是 Map。

第六步:创建一个 Writer 对象,一般创建 FileWriter 对象,指定生成的文件名。

第七步:调用模板对象的 process 方法输出文件。

第八步:关闭流

springSecurity框架使用

前面完成了传智健康后台管理系统的功能,例如检查项管理、检查组管理、套餐管理、预约设置等。

那么需要思考2个问题

1、在生产环境下如果不登录后台系统就可以完成这些功能操作吗?

答案显然是否定的,要操作这些功能必须首先登陆到系统才可以。

2、是不是所有用户,只要登陆成功都可以操作所有功能呢?

答案是否定的,并不是所有的用户都可以操作这些功能,不同的用户可能拥有不同的权限,这就需要授权了。

认证:系统提供的用于识别用户身份的功能,通常提供用户名密码进行登录就是在进行认证,认证的目的是让系统知道你是谁

授权:用户认证成功后,需要为用户授权,其实就是指定当前用户可以操作哪些功能。

对后台系统进行权限控制,本质就是对用户进行认证和授权。

基础知识
内存泄露

内存泄漏( Memory Leak )是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

静态变量通过类访问和通过实例对象访问效率一样吗?

场景题
题目一:只用2G内存在20亿个整数中找到出现次数最多的数

有一个包含20亿个全是32位整数的大文件,在其中找到出现次数最多的数。
内存限制为2G

分析一:

  • 对于在很多数中找到出现次数最多的数这种问题,通常的做法是使用哈希表对出现的每一个数做词频统计,哈希表的key为对应的整数,value为该整数出现的次数。
  • 就本题来说,假设一个数出现了20亿次,用32位的整数可以表示该次数不会产生溢出,所以哈希表的key为4B,value为4B,则哈希表的一条记录占用了8B。当哈希表中的记录个数为2亿个时,至少需要1.6GB的内存
  • 如果20亿个数中不同的数超过2亿个,最极端的情况是20亿个数都不相同,那么所占内存为20亿*8B,很显然内存是不够用的。
  • 解决办法是把包含20亿个数的小文件用哈希函数分成16个小文件,根据哈希函数的性质,同一种数是不可能被散列到不同的小文件中。假设哈希函数足够优秀,那么每个小文件中不同的数一定不会大于2亿种。
  • 然后对每一个小文件用哈希表来统计每个数出现的次数,因此得到16个小文件中各自出现次数最多的数和相应的次数统计。
  • 最后只要在16个数中选出出现次数最多的那个即可。
  • 之所以分成16个小文件是与内存限制为2G对应的。

把一个大的集合通过哈希函数分配到多台机器中,或者分配到多个文件里,是处理大数据问题常用的方法,具体分配多少台机器,多少个文件根据内存的限制来确定。
比如:

  • 有一个包含100亿个url的大文件,假设每个url占用64B,请找出其中所有重复的url。
  • 解决办法:
    • 通过哈希函数将大文件中的url哈希到若干台机器中或者单机上拆分成若干个小文件(哈希函数的性质决定了同一条url不会被分配到不同的机器或者不同的文件中),具体的数目根据资源的限制来选择。
    • 然后对每一个小文件再利用哈希表遍历,找出重复的url。

参考链接

------------- THE END! THANKS! -------------