腾讯(大连)研发一面-20190620

面试时下午18:00开始的

面试官为了不让我紧张,一直在强调,我们就是随便谈谈,没什么的

1、说说你这个微信点餐服务吧

是去年12月份开始做的,一共用了3个月,由于是给学校食堂开发的,需要学校领导审核才能通过,目前老师在积极争取。

这个项目前端是基于微信小程序的,用户直接使用微信小程序注册并使用,而后端是用PC端的,订单信息直接回发布在卖家的电脑上,项目是用Spring boot集成了Spring+Spring MVC+Spring data jpa部分持久层用了Mybatis做了级联和动态SQL查询,前端是使用Bootstrap+少部分Vue,前端引擎为thymeleaf。
2、你用了Redis,大概是怎么样的?

项目中我们想象了一样的一个场景,假设商家在食堂有一个活动,有1000个西瓜,大家通过秒杀来抢,这时候就发生了高并发,为了保证线程安全,我们做了一个基于Redis的分布式锁,主要用到了SETNX和GETSET这两个命令,从而不使用synchronized关键字,既保证了安全又保证了速度,和响应时间。

而且在大部分数据的查询都使用了Redis的缓存机制,保证了数据的在高并发时间的交换,主要是Redis的命中,失效,和更新问题。
3、那你知道分布式锁是怎么样的?

我知道用了两个命令来写一个线程安全的秒杀,具体是什么我对分布式了解不是很多

(面试官说:我们假如有一个数据需要被很多的服务器来读取,那么我们怎么做到线程安全呢?我们就需要给它加锁,让每个服务器都读到正确的结果)

4、锁是怎么实现的

我记不太清我怎么回答的了,大概就说了CAS原理的什么什么

5、你在项目中用了MySQL,那你说说你对它的理解?

我使用MySQL是5.7版本的,默认的存储引擎是InnoDB,它和MyISAM的区别在于

  • InnoDB支持外键,MyISAM不支持
  • InnoDB支持事务,MyISAM不支持
  • InnoDB是行级锁,而MyISAM是表级锁
  • 对于count(*)来说,MyISAM的速度比InnoDB快很多很多,因为它内嵌了一个计数器
  • 对于两者都是索引都是B+树的,但是InnoDB是集聚索引,而MyISAM是非聚集索引

6、说一说Spring MVC的注解你用了哪些?

首先每个Controller都需要有一个URL的配置

比如URL路径映射:@RequestMapping("/hello"),可以将多个url映射到同一个方法上。

我们需要将这个类作为Bean放入IOC容器

就需要@Controller或者@RestController

这两个区别在@RestController注解相当于@ResponseBody + @Controller合在一起的作用,这样我们返回的数据就会变成JSON格式,会很大方便和前端的数据对接

我们在传数据的时候会用到

@PathVariable

用于将请求URL中的模板变量映射到功能处理方法的参数上

@requestParam

控制层获取参数,类似一种是request.getParameter("name")

@ResponseBody

该注解用于将Controller的方法返回的对象,一般用于返回json的数据

在bean的注入时使用

@Resource和@Autowired

7、你用了AOP了吗?它主要用在什么地方?

  • 日志功能
  • 事务管理
  • 权限管理

当然你也可以使用 AspectJ ,Spring AOP 已经集成了AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。

使用 AOP 之后我们可以把一些通用功能抽象出来,在需要用到的地方直接使用即可,这样大大简化了代码量。我们需要增加新功能时也方便,这样也提高了系统扩展性。。

8、动态代理是什么?有哪些应用?

答得不好,略

9、数据怎么保证安全?或者说线程怎么是安全的?

我想错了,面试官提醒了我

ACID

  • 原子性

    原子性是指一个事务是一个不可再分割的工作单位,事务中的操作要么都执行,要么都不执行

  • 2. 一致性

    一致性是指在执行一个事务前和后,数据库的完整性约束没有没有被破坏。也就是说事务不能破坏数据库的完整性以及业务逻辑的一致性。

  • 3. 隔离性

    隔离性是指多个事务并发时,每个事务应该是隔离的,一个事务不应影响其他事务的运行效果

  • 4. 持久性

    持久性意味着事务执行完成后,该事务对数据库的更改便持久到了数据库中,这个更改是永久的。

 10、mybatis 中 #{}和 ${}的区别是什么?

#{}是预编译处理,${}是字符串替换;

Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

Mybatis在处理${}时,就是把${}替换成变量的值;

使用#{}可以有效的防止SQL注入,提高系统安全性。

 11、怎么避免SQL注入?

  1. PreparedStatement(简单又有效的方法)

  2. 使用正则表达式过滤传入的参数

  3. 字符串过滤

  4. JSP中调用该函数检查是否包函非法字符

  5. JSP页面判断代码

 12、异常处理会向上抛出吗?

throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。而throw则是指抛出的一个具体的异常类型。

13、我看了你的博客你说说你的单例模式吧?

面试官竟然看来我的博客,可惜我早已记不清写的是什么?可能还被误认为是抄的

然后面试官拿出了一个本子,开始给我讲了单例模式的实现,为什么是单例的,怎么才能使单例的,然后又讲了怎么才能使单例保证线程安全,言传身教,在这里我要好好谢谢面试官,让我懂得了很多,我发现了我自己底层知识的不足。

 

最后面试官问了我,有什么想问他的,我说我发现自己底层知识很薄弱,怎么才能加强?

面试官说,你其实不错了,在我遇到的实习生面试中,你在努努力,学习底层知识才是永远适用的,你想想哪些框架的迭代速度很快,也许过几天就会有更好的框架出现,我们只要底层知识牢固,那学习新框架就会很快的。

你来腾讯实习的话,要多和同事学习技术,可能实习几天就会参加项目的,更重要的是学习为人处世的态度。。。

面试官和我聊了很多,他真的像一个领路人,给我了一个奋斗的方向,这次面试太棒了,教会了我很多,不论是技术还是为人处世的态度。

谢谢您,我的面试官。

我走的时候还和他握了手,我觉得自己又有了成长了不少!

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页