面经学习(上海某小厂)

个人评价

  难度中等,拦截器和过滤器的问题之前没有遇到过,海还有免登录过滤路径问题忘记了,算是学到了。

1.说说你实习项目中遇到的难点吧?

  我实习的时候主要就是参与辅助功能的开发,包括学习模块,问答点赞模块,积分模块的开发,让我印象比较深的就是在学习模块中提交观看位置的业务。
在业务需求上呢,我们需要实现续播的功能,误差要控制在30秒之内,主要就是修改观看记录表。我们这里不能每次请求都去打db,在项目情况上,同一时间内,在线观看网课的用户在3000只有,也即是说每秒的最优tps在3000左右,如果这时候在去打db的话就会压垮数据库。
我们的优化方案就是合并写请求,因为一个相同用户只有最后一次提交的观看位置是有用的,那我们就直接使用redis的hash存储对应的观看位置,大key存储课表id,课表用于关联userIdf和lessonId,效key存储节的id,value存储观看位置,在每次修改hash中数据的时候,我们的使用rabbitMq的死信队列发送一个延迟20s的信息,也是学习模块监听该延迟消息,消息中的数据主要就是课表id,节id和当前的观看位置,在监听到消息后,会使用消息中观看位置和redis中对应的观看位置进行比较。如果二者的观看位置相同,则说明在这20s用户是没有再进行观看的,这时候我们去打db,如果二者不相同则不需要做任何的操作。

2.简单说一下项目中使用到哪些集合吧?

  主要就是使用list和map,list主要就是使用ArrayList类用来收集数据,map主要就睡使用HashMap,基本上在遍历获取数据的时候都使用stram流进行编写的,就比如在查询到用户数据后,我们使用collect(Collectors.toMap(item.id, i-> i))将集合转为以id为key以数据为value的形式,便于后续操作。

3.ORM框架有使用过哪些?

  主要就是使用mybatis,对jpa也有了解过。mybatis主要就是通过标签动态编写SQL。像mybatis底层的执行流程也是有了解过的。步骤就是:读取mybatis-config.xml文件,创建sqlSessionFactory,通过工厂创建SQLSession,SQlSession主要就是各种读写方法,在会话中有一个Excetor来用来直接操作数据库,通过Excetor访问数据库,在Excetor中MapperStatement用来将Java的数据类型转换数据库对应的类型,及将数据库类型转换为java对应的类型。

4.数据库都使用过哪些呢?

  关系型数据库主要就是使用mysql,非关系型数据库主要就是使用redis,在我的物流项目中还有使用到Neo4j和Mongdb。使用redis的String结构主要就是用来做缓存的,在网校项目中主要还使用到hash,zset,set就接口的优化。Neo4j是图关系型数据库,主要就是用来存储两个网点之间的关系,其数据结构主要就是节点,关系,标签,属性。节点表示网点,关系存储两个网点的距离,标签就是存储网点的类型包括(一级转运中心,二级转运中心,网点),属性存储网点的id。Mongdb主要就是在运输信息模块中使用,因为运输模块数据形式就是连续网点的拼接,所以使用Mongdb的嵌套Document进行存储。

5.怎么删除list中指定的元素,就比如从数据库中查询出三个学生,怎么把集合中李四的数据删除呢?

  实现我想到的是使用stream来做过滤。

  items.stream.filter(item ->item.name != '李四' ).collect(collectors.toList())。

*6.遍历list和map有哪些方法?

  1.   list的遍历方式主要就是 for遍历,for in 遍历,forEarch方法遍历,通过stream流进行遍历。迭代器iterator.hasNext()进行遍历。
  2.   map的遍历方式主要就是 for遍历,通过stream进行遍历,不过需要先获取entrySet,通过forEarch,通过迭代器遍历。

7.三张表,用户表,角色表,权限表,用户和角色是一对多的关系,角色金额权限是多对多的关系,怎么通过用户的id查询用户对应的所有权限呢?

  这个问题就是一个典型的RBAC模型,因为关系的关系的问题,还会存在两张关联表,分别是用户角色表和角色权限表,主要就是通过子查询+连表查询。一般在用户表会存放角色id,通过角色id从角色权限表查询权限id的集合,将该集合作为查询条件到权限表中查询。 
select * from `auth` where `auth`.id in (select auth_id  from user left join role_auth on user.role_id = role_auth.role_id where user_id = 对应用户id group by auth_id)

8.项目用拦截器对token进拦截校验是怎么做的呢?


  因为我们的网校项目是一个微服务项目,所以在gateway中就做了token的校验。在gateway中会实现一个全局过滤器GlobalFailter,会在请求加入网关后获取请求头中的token进去解析token,我们的token主要就是通过jwt生成的,jwt主要分为三个部分,头信息,数据体,签名,签名主要就是通过头信息+数据体通过base64生成的。在token解析出数据体后,会将数据体重写返回请求头中路由到对应的服务中。
  当然在这个过程中为为了保证远程调用能够使用到数据体中的数据,我们编写了一个公用的前置拦截器,就是在请求进入服务后要执行Controller层中的方法时将数据体存储到thradLocal中,因为threadLocal是线程隔离的,可以保证单线程中获取对应的数据。

*9.过滤器和拦截器的区别?请求是先经过拦截器还是先进入过滤器?

作用域方面,filter可以对所有的请求起作用,interceptor只对Contrller方法的请求起作用。
执行时机方面,filter会在请求加入DispatchServlet前执行及响应返回给客户端前执行,而interceptor会在调用Controller方法前执行及在视图渲染前执行。
filter会先执行,其会在请求加入DispatchServlet前执行,而interceptor会在执行Controller的方法前执行。

*10.如果某个请求不需要进行校验就可以访问内部服务,这要怎么设置呢?

  我们的使用gateway作为网关实现请求的路由,我们编写了全局过滤器去校验token,那我们就是要保证这些请求不会被过滤器过滤,我们主要就是编写一个properties类用来记录排除的路径,在过滤器方法中会匹配对对应的路径,如何直接放行。
以及在服务中,我们只要使用SpringSecurity实现校验的,我们编写SpringSecurity的配置类时会重写configure方法,通过http.antMatchers().anonymous()匹配对应的路径匿名访问直接放行。不需要登录就可以访问。

11.Spring有哪些注解呢?

  Spring主要就是ioc和aop两个实现。

  1.   ioc主要的注解就是 @AutoWried,@Qualify实现自动注入,@Bean,@Component。
  2.   aop主要就是 @Aspect,不同的通知方式 @After,@Before,@Around等等。
  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值